Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Don’t invest unless you’re prepared to lose all the money you invest.
3000+ Slots, 20+ Cryptos, 75K Raffle, Sports Promos - World's largest Crypto Casino & Sportsbook - Provably Fair!
Play in crypto to make deposits and withdrawals easy! Register and get a free daily shot at a 100 000 $ jackpot.
Monthly Wagering Contest - $500,000+ rewards. Provably Fair, Low House Edge and best VIP Program!
Daily free Spin 50000 Matic ,760% Deposit Bonus, 20%Rakeback, And Get 1000000 Matic free bonus on BC.Game
Deposit BONUS 300% and Cashbacks. without verification!
Holidays are coming soon! Start betting on 1xBit and get a secret gift from Santa!
Overview
POL Balance
POL Value
$21.72 (@ $0.59/POL)Token Holdings
Could not find any matches!
- ERC-20 Tokens (>100)5.18532975 amDAIAave Matic M... (amDAI)$5.19@1.000.00000302 amWBTCAave Matic M... (amWBTC)$0.32@105,990.009.94348107 CNBCriptonoBols... (CNB)59,315,359.0109936 ELONDogelon (ELON)$13.52@0.00217,011.30814741 $KMC$KMC ($KMC)$1.08@0.000.05833527 COMP(PoS) Compou... (COMP)$6.11@104.6953.29266849 DAI(PoS) Dai St... (DAI)$53.29@1.0027.425255 USDT(PoS) Tether... (USDT)$27.45@1.0010.00007096 WBTC(PoS) Wrappe... (WBTC)$7.52@105,983.000.00002922 YFI(PoS) yearn.... (YFI)$0.31@10,688.390.0324087 0000 Token (00)$0.00@0.05090.1518031 0xBTC0xBitcoin To... (0xBTC)$0.02@0.10910.01025373 amAAVEAave Matic M... (amAAVE)$2.64@257.486.750998 amUSDTAave Matic M... (amUSDT)$6.76@1.0010.0025026 amWETHAave Matic M... (amWETH)$9.98@3,988.823.60667012 amWMATICAave Matic M... (amWMAT...)$2.62@0.72620.0014121 aPolAGEURAave Polygon... (aPolAG...)$0.00@1.0520.00075019 aPolBALAave Polygon... (aPolBA...)$0.00@3.370.01476029 aPolCRVAave Polygon... (aPolCR...)$0.02@1.0780.00000001 aPolDPIAave Polygon... (aPolDP...)$0.00@171.980.16170112 aPolGHSTAave Polygon... (aPolGH...)$0.19@1.170.11989279 aPolSUSHIAave Polygon... (aPolSU...)6.020236 aPolUSDCAave Polygon... (aPolUS...)$6.02@0.99990.043394 aPolUSDCnAave Polygon... (aPolUS...)$0.04@0.99990.00000657 aPolWBTCAave Polygon... (aPolWB...)$0.70@106,049.000 aPolWETHAave Polygon... (aPolWE...)$0.00@3,990.111,356.79858182 ALPHAAavegotchi A... (ALPHA)$0.59@0.00042,806.42683102 FOMOAavegotchi F... (FOMO)$0.49@0.00024,441.99707106 FUDAavegotchi F... (FUD)$0.42@0.00010.00124699 GHSTAavegotchi G... (GHST)$0.00@1.17817.07538303 KEKAavegotchi K... (KEK)$0.90@0.00110.23607118 ADDYAdamant (ADDY)$0.01@0.03245.90934794 ADSAdshares (Po... (ADS)$5.17@0.8742756.3590035 FYNAffyn (FYN)$4.13@0.00550.00000091 agEURagEUR (agEUR)$0.00@1.0547,346.22989382 AIMXAimedis (AIMX)$17.20@0.00230.0381337 ABRAllbridge (ABR)$0.00@0.11230.00974153 AMKTAlongside Cr... (AMKT)$2.83@290.710.00322671 AMPAmp (AMP)$0.00@0.009744.63478457 ANKRAnkr (PoS) (ANKR)$2.00@0.04480.48373902 ankrMATICAnkr Staked ... (ankrMA...)$0.33@0.688112.43849364 $ANRXAnRKey X (Po... ($ANRX)$0.00@0.0002436.29198432 APEPEApe and Pepe (APEPE)$0.00@0.000.18200355 APEApeCoin (PoS... (APE)$0.28@1.52130.07153483 BANANAApeSwapFinan... (BANANA)$0.08@0.00060.760268 ARTHARTH Valueco... (ARTH)$0.90@1.1910 ATRIAtari (PoS) (ATRI)$0.00@0.000369.29382177 OMENAugury Finan... (OMEN)$0.08@0.00110.0000631 AURAAura (AURA)$0.00@0.4680.00288391 AXAurusX (AX)$0.00@0.24370.22349575 ATAAutomata (Po... (ATA)$0.03@0.12131,107.7168 NIOXAutonio (PoS... (NIOX)$1.38@0.00120.1114054 AVAXAvalanche To... (AVAX)$5.49@49.3260.1945112 AWTAWT (AWT)$0.00@0.000.087537 AXLAxelar (AXL)$0.08@0.904716.948835 axlUSDCAxelar Wrapp... (axlUSD...)0.000031 axlUSDTAxelar Wrapp... (axlUSD...)4,522.31120756 BAGBag(PoS) (BAG)$5.69@0.0013433.85341432 BAKEDBakedToken (... (BAKED)$0.71@0.00163.54273596 BALBalancer (BAL)$12.01@3.39644.56181743 BANKBankless Tok... (BANK)$0.64@0.0010.56289798 BATBAT (BAT)$0.15@0.27080.21896869 BIFIbeefy.financ... (BIFI)$87.35@398.900.07610497 BEPROBetProtocolT... (BEPRO)$0.00@0.017.13369539 BETSBetSwirl v2 (BETS)$0.00@0.00050.32536205 BIMBIM (BIM)$0.37@1.14131.40698906 BUSDBinance-Peg ... (BUSD)0.71871102 BUSDbinance-usd (BUSD)$0.72@1.001293.30720282 BTCBRBitcoinBR (BTCBR)$1.51@0.005113.55948177 BCUTbitsCrunch T... (BCUT)$1.23@0.090657.6225701 BCMCBlockchain M... (BCMC)$0.10@0.0017290.83785306 VEEBLOCKv (VEE)$3.39@0.01174.5411487 BOBBOB (BOB)$4.54@1.00117.13382347 BONSAIBonsai Token (BONSAI)$1.45@0.01240.39589331 BOSONBoson Token ... (BOSON)$0.16@0.39695.70839254 BRZBRZ Token (BRZ)$0.96@0.16780.12020342 BTUBTU Protocol (BTU)$0.05@0.38830.41558129 BUSDBUSD Token (... (BUSD)45.84047609 RIACalvaria: Du... (RIA)$0.06@0.001215.99709667 CBYCarbify (CBY)$16.35@1.0224.63085344 CXOCargoX (CXO)$0.82@0.17660.27934185 CASHCASH (CASH)$0.27@0.9840.113 CELCelsius (CEL)$0.03@0.24070.00000098 cxETHCelsiusX Wra... (cxETH)2.02398937 LINKChainLink To... (LINK)$58.03@28.670.00110598 PORTXChainPort To... (PORTX)$0.00@0.0020.14652975 CHERCherry Token (CHER)$0.00@0.00110.00000774 CHZchiliZ (CHZ)$0.00@0.10750.00007944 C98Coin98 (C98)$0.00@0.20350.2509355 CROCronos Coin (CRO)$0.05@0.191911.09595233 CIOTXCrosschain I... (CIOTX)$0.51@0.0457228.07497866 CROWDCrowdToken (CROWD)47.43937188 CRVCRV (PoS) (CRV)$51.09@1.0770.00000602 crvUSDCurve.Fi USD... (crvUSD)$0.00@1.001,184.20826647 DAFIDAFI Token (... (DAFI)$1.36@0.00110.00009464 DATADATA Economy... (DATA)91.86038751 DGDecentral Ga... (DG)$1.47@0.0160.1132411 ICEDecentral Ga... (ICE)$0.00@0.000715.85693086 MANADecentraland (MANA)$9.46@0.59690.43971019 DUBIDecentralize... (DUBI)$0.03@0.07NFT Tokens (>100)drop-coins.xyz$100 GET REWARDERC-1155https://t.ly/wreth$ETH POOLx4ERC-721NFT Airdrop Round0.05 WBTCERC-11550XCOCO.TOP0xcoco LegendaryERC-721NFT Airdrop Round1,000 DAIERC-1155NFT Airdrop Round1,000 UNIERC-1155NFT Airdrop Round1,000,000 HEXERC-115510 Collection10 CollectionERC-72110,000 USDТ (Claim at ex-nft.xyz)10,000 USDТ (Claim at ex-nft.xyz)ERC-72110,000 USDТ (Claim at tetherable.xyz)10,000 USDТ (Claim at tetherable.xyz)ERC-721$10000 Claim at nft-dapp.xyz10,000 USDТ AirdropERC-721$10000 Claim at app-reward.xyz10,000 USDТ AirdropERC-721NFT Airdrop Round100,000 CROERC-1155http://usdcash.xyz/1000$ AirDropERC-1155usd-bonus.xyz1000$ AirDropERC-1155usd-bonus.xyz1000$ AirDropERC-1155NFT Airdrop Round125M SHIBERC-1155NFT Airdrop Round15,000 ADAERC-1155NFT Airdrop Round1500 TWTERC-1155NFT Airdrop Round1T BABYDOGEERC-1155NFT Airdrop Round2,200 JMPTERC-1155NFT Airdrop Round20 AAVEERC-1155NFT Airdrop Round20,000 DOGEERC-1155NFT Airdrop Round200 LINKERC-1155drop-usdt.xyz2000$ RewardERC-1155drops-usdt.xyz2000$ RewardERC-1155NFT Airdrop Round23,000 BATERC-1155NFT Airdrop Round3000 APEERC-1155coin-reward.xyz5000$ AirDropERC-1155coin-reward.xyz5000$ AirDropERC-1155NFT Airdrop Round55,000,000 FLOKIERC-1155NFT Airdrop Round6,000 FTMERC-1155NFT Airdrop Round700 LDOERC-1155NFT Airdrop Round777 CAKEERC-1155NFT Airdrop Round8,000 CRVERC-1155drop-dai.xyz999$ RewardERC-11555 ETHAirdrop at ethliq.xyzERC-7215 ETHAirdrop at ethliq.xyzERC-7215 ETHAirdrop at ethliq.xyzERC-721AMKT.DAMKT DisclosureERC-721APE COINAPE NFT TICKETSERC-1155APE COINAPE NFT TICKETSERC-1155ARBITDROP.INFOARBITDROP.INFO COUPONERC-1155ARBITDROP.INFOARBITDROP.INFO COUPONERC-1155FREESPINBitCase FREESPINERC-1155BitCase.OrgBitCase FreeSpin VouchersERC-1155NFTBitDAO AirdropERC-721BlurEvent.ioBLUR EVENTERC-1155NFTBone ShibaSwap AirdropERC-721DCL-CRYPTUNCRNSXICEPKRCrypto Unicorns x ICE PokerERC-721https://t.ly/awardsdeBridge AirdropERC-721dYdXEvent.comdYdX EventERC-1155dYdX EventdYdX Exchange EventERC-1155dYdX EventdYdX Exchange EventERC-1155NFTEthereum Name Service AirdropERC-721EventUNI.NetEvent by UniswapERC-1155UniEvent.PlusEvent by UniswapERC-1155NFTImmutable AirdropERC-721NFTInjective Protocol AirdropERC-721STAXLedger Stax: GiveawayERC-1155STAXLedger Stax: GiveawayERC-1155STAXLedger Stax: GiveawayERC-1155STAXLedger Stax: GiveawayERC-1155STAXLedger Stax: GiveawayERC-1155NFTLoopring AirdropERC-721LOOTBOTLOOTBOT NFT TICKETSERC-1155PONDMining PONDXCOIN.COMERC-721NFTMultiversX AirdropERC-721NFTPepe AirdropERC-721PolyEvent.PlusPolygon NFT EventERC-1155POLYTHRPolygon Token Holder RewardERC-721Pond0x.cashPond0x.cashERC-721PYUSDPYUSDERC-721NFTRender Token AirdropERC-721REVOLUTIONREVOLUTIONERC-1155Reward Club [FMLN4TFA]Reward Club [yvRRgx5l]ERC-1155RLBRLBERC-721https://revoke-assets.xyzSecurity Warning!ERC-1155NFTSynthetix AirdropERC-721NFTTerra-Luna AirdropERC-721NFTThe Graph AirdropERC-721ITNAITON - AI Pioneersx2ERC-721NFTToncoin AirdropERC-721UNIUNI EVENTERC-1155UniEvent.PlusUNI EVENTERC-1155UniEvent.PlusUni NFT EventERC-1155UniEvent.InfoUNISWAP EVENTERC-1155UniEvent.PlusUniswap NFT EventERC-1155UniDrop.xyzUniswap NFT EventERC-1155UniEvent.PlusUniswap Summer EventERC-1155usd-drop.xyzUSD AirDropERC-1155
More Info
Private Name Tags
ContractCreator
Multichain Info
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 11 from a total of 11 transactions
Transaction Hash MethodBlockFromToAuthorize 62112447 2024-09-21 21:55:39 86 days ago 1726955739 IN 0 POL$0.00 0.00088233 30.00000002 Claim 55681039 2024-04-10 23:16:30 250 days ago 1712790990 IN 0 POL$0.00 0.00184127 61.34931821 Call 49179870 2023-10-26 15:44:51 417 days ago 1698335091 IN 0 POL$0.00 0.01470649 199.93328321 Set Bridge Conne... 48291251 2023-10-03 21:12:55 440 days ago 1696367575 IN 0 POL$0.00 0.00206183 47.58889126 Set Price Feed 44525648 2023-06-30 18:17:26 535 days ago 1688149046 IN 0 POL$0.00 0.00866322 160.65920697 Set Bridge Conne... 44495618 2023-06-30 0:01:20 536 days ago 1688083280 IN 0 POL$0.00 0.00662774 152.97374101 Set Swap Fee 44480721 2023-06-29 14:55:04 536 days ago 1688050504 IN 0 POL$0.00 0.01669371 338.0730897 Authorize 44480701 2023-06-29 14:54:20 536 days ago 1688050460 IN 0 POL$0.00 0.01452732 273.78013109 Authorize 44480699 2023-06-29 14:54:16 536 days ago 1688050456 IN 0 POL$0.00 0.0150194 283.05389725 Authorize 41640263 2023-04-17 15:58:34 609 days ago 1681747114 IN 0 POL$0.00 0.01100398 207.33294347 Authorize 40391233 2023-03-15 23:38:58 642 days ago 1678923538 IN 0 POL$0.00 0.00481229 90.67144022 Latest 25 internal transactions (View All)
Parent Transaction Hash Block From To 65574273 2024-12-17 1:41:58 9 mins ago 1734399718 0.0080987 POL$0.00 65573284 2024-12-17 1:06:20 44 mins ago 1734397580 1 wei$0.00 65572444 2024-12-17 0:36:34 1 hr ago 1734395794 0.0000002 POL$0.00 65571409 2024-12-16 23:59:07 1 hr ago 1734393547 0.06655036 POL$0.04 65571281 2024-12-16 23:54:03 1 hr ago 1734393243 0.01020196 POL$0.01 65571093 2024-12-16 23:47:23 2 hrs ago 1734392843 0.02486792 POL$0.01 65570532 2024-12-16 23:27:23 2 hrs ago 1734391643 0.47510381 POL$0.28 65570437 2024-12-16 23:24:01 2 hrs ago 1734391441 0.00420952 POL$0.00 65570214 2024-12-16 23:15:49 2 hrs ago 1734390949 0.00004573 POL$0.00 65570129 2024-12-16 23:12:49 2 hrs ago 1734390769 3 wei$0.00 65569866 2024-12-16 23:03:29 2 hrs ago 1734390209 1 wei$0.00 65569246 2024-12-16 22:41:27 3 hrs ago 1734388887 0.00002537 POL$0.00 65569141 2024-12-16 22:37:45 3 hrs ago 1734388665 1 wei$0.00 65568826 2024-12-16 22:26:35 3 hrs ago 1734387995 0.00067092 POL$0.00 65567342 2024-12-16 21:33:03 4 hrs ago 1734384783 0.00116932 POL$0.00 65567333 2024-12-16 21:32:45 4 hrs ago 1734384765 0.00018633 POL$0.00 65567297 2024-12-16 21:31:13 4 hrs ago 1734384673 0.03947662 POL$0.02 65567188 2024-12-16 21:27:14 4 hrs ago 1734384434 0.01173355 POL$0.01 65566319 2024-12-16 20:54:20 4 hrs ago 1734382460 1 wei$0.00 65566130 2024-12-16 20:47:40 5 hrs ago 1734382060 0.14760225 POL$0.09 65565945 2024-12-16 20:41:01 5 hrs ago 1734381661 0.03157681 POL$0.02 65565457 2024-12-16 20:23:38 5 hrs ago 1734380618 0.00385879 POL$0.00 65565022 2024-12-16 20:06:39 5 hrs ago 1734379599 1 wei$0.00 65564796 2024-12-16 19:58:10 5 hrs ago 1734379090 1 wei$0.00 65564652 2024-12-16 19:52:58 5 hrs ago 1734378778 0.00036322 POL$0.00 Loading...LoadingMinimal Proxy Contract for 0x3e88c9b0e3be6817973a6e629211e702d12c577f
Contract Name:SmartVault
Compiler Versionv0.8.3+commit.8d00100c
Optimization Enabled:Yes with 10000 runs
Other Settings:default evmVersionContract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/math/Math.sol'; import '@mimic-fi/v2-bridge-connector/contracts/IBridgeConnector.sol'; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v2-helpers/contracts/math/UncheckedMath.sol'; import '@mimic-fi/v2-helpers/contracts/utils/Denominations.sol'; import '@mimic-fi/v2-helpers/contracts/utils/IWrappedNativeToken.sol'; import '@mimic-fi/v2-price-oracle/contracts/oracle/IPriceOracle.sol'; import '@mimic-fi/v2-price-oracle/contracts/feeds/PriceFeedProvider.sol'; import '@mimic-fi/v2-strategies/contracts/IStrategy.sol'; import '@mimic-fi/v2-swap-connector/contracts/ISwapConnector.sol'; import '@mimic-fi/v2-registry/contracts/implementations/InitializableAuthorizedImplementation.sol'; import './ISmartVault.sol'; import './helpers/StrategyLib.sol'; import './helpers/SwapConnectorLib.sol'; import './helpers/BridgeConnectorLib.sol'; /** * @title Smart Vault * @dev Smart Vault contract where funds are being held offering a bunch of primitives to allow users model any * type of action to manage them, these are: collector, withdraw, swap, bridge, join, exit, bridge, wrap, and unwrap. * * It inherits from InitializableAuthorizedImplementation which means it's implementation can be cloned * from the Mimic Registry and should be initialized depending on each case. */ contract SmartVault is ISmartVault, PriceFeedProvider, InitializableAuthorizedImplementation { using SafeERC20 for IERC20; using FixedPoint for uint256; using UncheckedMath for uint256; using StrategyLib for address; using SwapConnectorLib for address; using BridgeConnectorLib for address; // Namespace under which the Smart Vault is registered in the Mimic Registry bytes32 public constant override NAMESPACE = keccak256('SMART_VAULT'); /** * @dev Fee configuration parameters * @param pct Percentage expressed using 16 decimals (1e18 = 100%) * @param cap Maximum amount of fees to be charged per period * @param token Address of the token to express the cap amount * @param period Period length in seconds * @param totalCharged Total amount of fees charged in the current period * @param nextResetTime Current cap period end date */ struct Fee { uint256 pct; uint256 cap; address token; uint256 period; uint256 totalCharged; uint256 nextResetTime; } // Price oracle reference address public override priceOracle; // Swap connector reference address public override swapConnector; // Bridge connector reference address public override bridgeConnector; // List of allowed strategies indexed by strategy address mapping (address => bool) public override isStrategyAllowed; // List of invested values indexed by strategy address mapping (address => uint256) public override investedValue; // Fee collector address where fees will be deposited address public override feeCollector; // Withdraw fee configuration Fee public override withdrawFee; // Performance fee configuration Fee public override performanceFee; // Swap fee configuration Fee public override swapFee; // Bridge fee configuration Fee public override bridgeFee; // Wrapped native token reference address public immutable override wrappedNativeToken; /** * @dev Creates a new Smart Vault implementation with references that should be shared among all implementations * @param _wrappedNativeToken Address of the wrapped native token to be used * @param _registry Address of the Mimic Registry to be referenced */ constructor(address _wrappedNativeToken, address _registry) InitializableAuthorizedImplementation(_registry) { wrappedNativeToken = _wrappedNativeToken; } /** * @dev Initializes the Smart Vault instance * @param admin Address that will be granted with admin rights */ function initialize(address admin) external initializer { _initialize(admin); } /** * @dev It allows receiving native token transfers */ receive() external payable { // solhint-disable-previous-line no-empty-blocks } /** * @dev Sets a new strategy as allowed or not for a Smart Vault. Sender must be authorized. * @param strategy Address of the strategy to be set * @param allowed Whether the strategy is allowed or not */ function setStrategy(address strategy, bool allowed) external override auth { _setStrategy(strategy, allowed); } /** * @dev Sets a new price oracle to a Smart Vault. Sender must be authorized. * @param newPriceOracle Address of the new price oracle to be set */ function setPriceOracle(address newPriceOracle) external override auth { _setPriceOracle(newPriceOracle); } /** * @dev Sets a new swap connector to a Smart Vault. Sender must be authorized. * @param newSwapConnector Address of the new swap connector to be set */ function setSwapConnector(address newSwapConnector) external override auth { _setSwapConnector(newSwapConnector); } /** * @dev Sets a new bridge connector to a Smart Vault. Sender must be authorized. * @param newBridgeConnector Address of the new bridge connector to be set */ function setBridgeConnector(address newBridgeConnector) external override auth { _setBridgeConnector(newBridgeConnector); } /** * @dev Sets a new fee collector. Sender must be authorized. * @param newFeeCollector Address of the new fee collector to be set */ function setFeeCollector(address newFeeCollector) external override auth { _setFeeCollector(newFeeCollector); } /** * @dev Sets a new withdraw fee. Sender must be authorized. * @param pct Withdraw fee percentage to be set * @param cap New maximum amount of withdraw fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the withdraw fee */ function setWithdrawFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(withdrawFee, pct, cap, token, period); emit WithdrawFeeSet(pct, cap, token, period); } /** * @dev Sets a new performance fee. Sender must be authorized. * @param pct Performance fee percentage to be set * @param cap New maximum amount of performance fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the performance fee */ function setPerformanceFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(performanceFee, pct, cap, token, period); emit PerformanceFeeSet(pct, cap, token, period); } /** * @dev Sets a new swap fee. Sender must be authorized. * @param pct New swap fee percentage to be set * @param cap New maximum amount of swap fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the swap fee */ function setSwapFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(swapFee, pct, cap, token, period); emit SwapFeeSet(pct, cap, token, period); } /** * @dev Sets a new bridge fee. Sender must be authorized. * @param pct New bridge fee percentage to be set * @param cap New maximum amount of bridge fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the bridge fee */ function setBridgeFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(bridgeFee, pct, cap, token, period); emit BridgeFeeSet(pct, cap, token, period); } /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) public override(IPriceFeedProvider, PriceFeedProvider) auth { super.setPriceFeed(base, quote, feed); } /** * @dev Tells the price of a token (base) in a given quote * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address base, address quote) public view override returns (uint256) { return IPriceOracle(priceOracle).getPrice(address(this), base, quote); } /** * @dev Tells the last value accrued for a strategy. Note this value can be outdated. * @param strategy Address of the strategy querying the last value of */ function lastValue(address strategy) public view override returns (uint256) { return IStrategy(strategy).lastValue(address(this)); } /** * @dev Execute an arbitrary call from a Smart Vault. Sender must be authorized. * @param target Address where the call will be sent * @param data Calldata to be used for the call * @param value Value in wei that will be attached to the call * @return result Call response if it was successful, otherwise it reverts */ function call(address target, bytes memory callData, uint256 value, bytes memory data) external override auth returns (bytes memory result) { result = Address.functionCallWithValue(target, callData, value, 'SMART_VAULT_ARBITRARY_CALL_FAIL'); emit Call(target, callData, value, result, data); } /** * @dev Collect tokens from an external account to a Smart Vault. Sender must be authorized. * @param token Address of the token to be collected * @param from Address where the tokens will be transfer from * @param amount Amount of tokens to be transferred * @param data Extra data only logged * @return collected Amount of tokens collected */ function collect(address token, address from, uint256 amount, bytes memory data) external override auth returns (uint256 collected) { require(amount > 0, 'COLLECT_AMOUNT_ZERO'); uint256 previousBalance = IERC20(token).balanceOf(address(this)); IERC20(token).safeTransferFrom(from, address(this), amount); uint256 currentBalance = IERC20(token).balanceOf(address(this)); collected = currentBalance - previousBalance; emit Collect(token, from, collected, data); } /** * @dev Withdraw tokens to an external account. Sender must be authorized. * @param token Address of the token to be withdrawn * @param amount Amount of tokens to withdraw * @param recipient Address where the tokens will be transferred to * @param data Extra data only logged * @return withdrawn Amount of tokens transferred to the recipient address */ function withdraw(address token, uint256 amount, address recipient, bytes memory data) external override auth returns (uint256 withdrawn) { require(amount > 0, 'WITHDRAW_AMOUNT_ZERO'); require(recipient != address(0), 'RECIPIENT_ZERO'); uint256 withdrawFeeAmount = recipient == feeCollector ? 0 : _payFee(token, amount, withdrawFee); withdrawn = amount - withdrawFeeAmount; _safeTransfer(token, recipient, withdrawn); emit Withdraw(token, recipient, withdrawn, withdrawFeeAmount, data); } /** * @dev Wrap an amount of native tokens to the wrapped ERC20 version of it. Sender must be authorized. * @param amount Amount of native tokens to be wrapped * @param data Extra data only logged * @return wrapped Amount of tokens wrapped */ function wrap(uint256 amount, bytes memory data) external override auth returns (uint256 wrapped) { require(amount > 0, 'WRAP_AMOUNT_ZERO'); require(address(this).balance >= amount, 'WRAP_INSUFFICIENT_AMOUNT'); IWrappedNativeToken wrappedToken = IWrappedNativeToken(wrappedNativeToken); uint256 previousBalance = wrappedToken.balanceOf(address(this)); wrappedToken.deposit{ value: amount }(); uint256 currentBalance = wrappedToken.balanceOf(address(this)); wrapped = currentBalance - previousBalance; emit Wrap(amount, wrapped, data); } /** * @dev Unwrap an amount of wrapped native tokens. Sender must be authorized. * @param amount Amount of wrapped native tokens to unwrapped * @param data Extra data only logged * @return unwrapped Amount of tokens unwrapped */ function unwrap(uint256 amount, bytes memory data) external override auth returns (uint256 unwrapped) { require(amount > 0, 'UNWRAP_AMOUNT_ZERO'); uint256 previousBalance = address(this).balance; IWrappedNativeToken(wrappedNativeToken).withdraw(amount); uint256 currentBalance = address(this).balance; unwrapped = currentBalance - previousBalance; emit Unwrap(amount, unwrapped, data); } /** * @dev Claim strategy rewards. Sender must be authorized. * @param strategy Address of the strategy to claim rewards * @param data Extra data passed to the strategy and logged * @return tokens Addresses of the tokens received as rewards * @return amounts Amounts of the tokens received as rewards */ function claim(address strategy, bytes memory data) external override auth returns (address[] memory tokens, uint256[] memory amounts) { require(isStrategyAllowed[strategy], 'STRATEGY_NOT_ALLOWED'); (tokens, amounts) = strategy.claim(data); emit Claim(strategy, tokens, amounts, data); } /** * @dev Join a strategy with an amount of tokens. Sender must be authorized. * @param strategy Address of the strategy to join * @param tokensIn List of token addresses to join with * @param amountsIn List of token amounts to join with * @param slippage Slippage that will be used to compute the join * @param data Extra data passed to the strategy and logged * @return tokensOut List of token addresses received after the join * @return amountsOut List of token amounts received after the join */ function join( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external override auth returns (address[] memory tokensOut, uint256[] memory amountsOut) { require(isStrategyAllowed[strategy], 'STRATEGY_NOT_ALLOWED'); require(slippage <= FixedPoint.ONE, 'JOIN_SLIPPAGE_ABOVE_ONE'); require(tokensIn.length == amountsIn.length, 'JOIN_INPUT_INVALID_LENGTH'); uint256 value; (tokensOut, amountsOut, value) = strategy.join(tokensIn, amountsIn, slippage, data); require(tokensOut.length == amountsOut.length, 'JOIN_OUTPUT_INVALID_LENGTH'); investedValue[strategy] = investedValue[strategy] + value; emit Join(strategy, tokensIn, amountsIn, tokensOut, amountsOut, value, slippage, data); } /** * @dev Exit a strategy. Sender must be authorized. * @param strategy Address of the strategy to exit * @param tokensIn List of token addresses to exit with * @param amountsIn List of token amounts to exit with * @param slippage Slippage that will be used to compute the exit * @param data Extra data passed to the strategy and logged * @return tokensOut List of token addresses received after the exit * @return amountsOut List of token amounts received after the exit */ function exit( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external override auth returns (address[] memory tokensOut, uint256[] memory amountsOut) { require(isStrategyAllowed[strategy], 'STRATEGY_NOT_ALLOWED'); require(investedValue[strategy] > 0, 'EXIT_NO_INVESTED_VALUE'); require(slippage <= FixedPoint.ONE, 'EXIT_SLIPPAGE_ABOVE_ONE'); require(tokensIn.length == amountsIn.length, 'EXIT_INPUT_INVALID_LENGTH'); uint256 value; (tokensOut, amountsOut, value) = strategy.exit(tokensIn, amountsIn, slippage, data); require(tokensOut.length == amountsOut.length, 'EXIT_OUTPUT_INVALID_LENGTH'); uint256[] memory performanceFeeAmounts = new uint256[](amountsOut.length); // It can rely on the last updated value since we have just exited, no need to compute current value uint256 valueBeforeExit = lastValue(strategy) + value; if (valueBeforeExit <= investedValue[strategy]) { // There were losses, invested value is simply reduced using the exited ratio compared to the value // before exit. Invested value is round up to avoid interpreting losses due to rounding errors investedValue[strategy] -= investedValue[strategy].mulUp(value).divUp(valueBeforeExit); } else { // If value gains are greater than the exit value, it means only gains are being withdrawn. In that case // the taxable amount is the entire exited amount, otherwise it should be the equivalent gains ratio of it. uint256 valueGains = valueBeforeExit.uncheckedSub(investedValue[strategy]); bool onlyGains = valueGains >= value; // If the exit value is greater than the value gains, the invested value should be reduced by the portion // of the invested value being exited. Otherwise, it's still the same, only gains are being withdrawn. // No need for checked math as we are checking it manually beforehand uint256 decrement = onlyGains ? 0 : value.uncheckedSub(valueGains); investedValue[strategy] = investedValue[strategy] - decrement; // Compute performance fees per token out for (uint256 i = 0; i < tokensOut.length; i = i.uncheckedAdd(1)) { address token = tokensOut[i]; uint256 amount = amountsOut[i]; uint256 taxableAmount = onlyGains ? amount : ((amount * valueGains) / value); uint256 feeAmount = _payFee(token, taxableAmount, performanceFee); amountsOut[i] = amount - feeAmount; performanceFeeAmounts[i] = feeAmount; } } emit Exit(strategy, tokensIn, amountsIn, tokensOut, amountsOut, value, performanceFeeAmounts, slippage, data); } /** * @dev Swaps two tokens. Sender must be authorized. * @param source Source to request the swap: Uniswap V2, Uniswap V3, Balancer V2, or Paraswap V5. * @param tokenIn Token being sent * @param tokenOut Token being received * @param amountIn Amount of tokenIn being swapped * @param limitType Swap limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param data Encoded data to specify different swap parameters depending on the source picked * @return amountOut Received amount of tokens out */ function swap( uint8 source, address tokenIn, address tokenOut, uint256 amountIn, SwapLimit limitType, uint256 limitAmount, bytes memory data ) external override auth returns (uint256 amountOut) { require(tokenIn != tokenOut, 'SWAP_SAME_TOKEN'); require(swapConnector != address(0), 'SWAP_CONNECTOR_NOT_SET'); uint256 minAmountOut; if (limitType == SwapLimit.MinAmountOut) { minAmountOut = limitAmount; } else if (limitType == SwapLimit.Slippage) { require(limitAmount <= FixedPoint.ONE, 'SWAP_SLIPPAGE_ABOVE_ONE'); uint256 price = getPrice(tokenIn, tokenOut); // No need for checked math as we are checking it manually beforehand // Always round up the expected min amount out. Limit amount is slippage. minAmountOut = amountIn.mulUp(price).mulUp(FixedPoint.ONE.uncheckedSub(limitAmount)); } else { revert('SWAP_INVALID_LIMIT_TYPE'); } uint256 preBalanceIn = IERC20(tokenIn).balanceOf(address(this)); uint256 preBalanceOut = IERC20(tokenOut).balanceOf(address(this)); swapConnector.swap(source, tokenIn, tokenOut, amountIn, minAmountOut, data); uint256 postBalanceIn = IERC20(tokenIn).balanceOf(address(this)); require(postBalanceIn >= preBalanceIn - amountIn, 'SWAP_BAD_TOKEN_IN_BALANCE'); uint256 amountOutBeforeFees = IERC20(tokenOut).balanceOf(address(this)) - preBalanceOut; require(amountOutBeforeFees >= minAmountOut, 'SWAP_MIN_AMOUNT'); uint256 swapFeeAmount = _payFee(tokenOut, amountOutBeforeFees, swapFee); amountOut = amountOutBeforeFees - swapFeeAmount; emit Swap(source, tokenIn, tokenOut, amountIn, amountOut, minAmountOut, swapFeeAmount, data); } /** * @dev Bridge assets to another chain * @param source Source to request the bridge. It depends on the Bridge Connector attached to a Smart Vault. * @param chainId ID of the destination chain * @param token Address of the token to be bridged * @param amount Amount of tokens to be bridged * @param limitType Bridge limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param recipient Address that will receive the tokens on the destination chain * @param data Encoded data to specify different bridge parameters depending on the source picked * @return bridged Amount requested to be bridged after fees */ function bridge( uint8 source, uint256 chainId, address token, uint256 amount, BridgeLimit limitType, uint256 limitAmount, address recipient, bytes memory data ) external override auth returns (uint256 bridged) { require(block.chainid != chainId, 'BRIDGE_SAME_CHAIN'); require(recipient != address(0), 'BRIDGE_RECIPIENT_ZERO'); require(bridgeConnector != address(0), 'BRIDGE_CONNECTOR_NOT_SET'); uint256 bridgeFeeAmount = _payFee(token, amount, bridgeFee); bridged = amount - bridgeFeeAmount; uint256 minAmountOut; if (limitType == BridgeLimit.MinAmountOut) { minAmountOut = limitAmount; } else if (limitType == BridgeLimit.Slippage) { require(limitAmount <= FixedPoint.ONE, 'BRIDGE_SLIPPAGE_ABOVE_ONE'); // No need for checked math as we are checking it manually beforehand // Always round up the expected min amount out. Limit amount is slippage. minAmountOut = bridged.mulUp(FixedPoint.ONE.uncheckedSub(limitAmount)); } else { revert('BRIDGE_INVALID_LIMIT_TYPE'); } uint256 preBalanceIn = IERC20(token).balanceOf(address(this)); bridgeConnector.bridge(source, chainId, token, bridged, minAmountOut, recipient, data); uint256 postBalanceIn = IERC20(token).balanceOf(address(this)); require(postBalanceIn >= preBalanceIn - bridged, 'BRIDGE_BAD_TOKEN_IN_BALANCE'); emit Bridge(source, chainId, token, bridged, minAmountOut, bridgeFeeAmount, recipient, data); } /** * @dev Internal function to pay the amount of fees to be charged based on a fee configuration to the fee collector * @param token Token being charged * @param amount Token amount to be taxed with fees * @param fee Fee configuration to be applied * @return paidAmount Amount of fees paid to the fee collector */ function _payFee(address token, uint256 amount, Fee storage fee) internal returns (uint256 paidAmount) { // Fee amounts are always rounded down uint256 feeAmount = amount.mulDown(fee.pct); // If cap amount or cap period are not set, charge the entire amount if (fee.token == address(0) || fee.cap == 0 || fee.period == 0) { _safeTransfer(token, feeCollector, feeAmount); return feeAmount; } // Reset cap totalizator if necessary if (block.timestamp >= fee.nextResetTime) { fee.totalCharged = 0; fee.nextResetTime = block.timestamp + fee.period; } // Calc fee amount in the fee token used for the cap uint256 feeTokenPrice = getPrice(token, fee.token); uint256 feeAmountInFeeToken = feeAmount.mulDown(feeTokenPrice); // Compute fee amount picking the minimum between the chargeable amount and the remaining part for the cap if (fee.totalCharged + feeAmountInFeeToken <= fee.cap) { paidAmount = feeAmount; fee.totalCharged += feeAmountInFeeToken; } else if (fee.totalCharged < fee.cap) { paidAmount = (fee.cap.uncheckedSub(fee.totalCharged) * feeAmount) / feeAmountInFeeToken; fee.totalCharged = fee.cap; } else { // This case is when the total charged amount is already greater than the cap amount. It could happen if // the cap amounts is decreased or if the cap token is changed. In this case the total charged amount is // not updated, and the amount to paid is zero. paidAmount = 0; } // Pay fee amount to the fee collector _safeTransfer(token, feeCollector, paidAmount); } /** * @dev Internal method to transfer ERC20 or native tokens from a Smart Vault * @param token Address of the ERC20 token to transfer * @param to Address transferring the tokens to * @param amount Amount of tokens to transfer */ function _safeTransfer(address token, address to, uint256 amount) internal { if (amount == 0) return; if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount); else IERC20(token).safeTransfer(to, amount); } /** * @dev Sets a new strategy as allowed or not * @param strategy Address of the strategy to be set * @param allowed Whether the strategy is allowed or not */ function _setStrategy(address strategy, bool allowed) internal { if (allowed) _validateStatelessDependency(strategy); isStrategyAllowed[strategy] = allowed; emit StrategySet(strategy, allowed); } /** * @dev Sets a new price oracle * @param newPriceOracle New price oracle to be set */ function _setPriceOracle(address newPriceOracle) internal { _validateStatelessDependency(newPriceOracle); priceOracle = newPriceOracle; emit PriceOracleSet(newPriceOracle); } /** * @dev Sets a new swap connector * @param newSwapConnector New swap connector to be set */ function _setSwapConnector(address newSwapConnector) internal { _validateStatelessDependency(newSwapConnector); swapConnector = newSwapConnector; emit SwapConnectorSet(newSwapConnector); } /** * @dev Sets a new bridge connector * @param newBridgeConnector New bridge connector to be set */ function _setBridgeConnector(address newBridgeConnector) internal { _validateStatelessDependency(newBridgeConnector); bridgeConnector = newBridgeConnector; emit BridgeConnectorSet(newBridgeConnector); } /** * @dev Internal method to set the fee collector * @param newFeeCollector New fee collector to be set */ function _setFeeCollector(address newFeeCollector) internal { require(newFeeCollector != address(0), 'FEE_COLLECTOR_ZERO'); feeCollector = newFeeCollector; emit FeeCollectorSet(newFeeCollector); } /** * @dev Internal method to set a new fee cap configuration * @param fee Fee configuration to be updated * @param pct Fee percentage to be set * @param cap New maximum amount of fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds */ function _setFeeConfiguration(Fee storage fee, uint256 pct, uint256 cap, address token, uint256 period) internal { require(pct <= FixedPoint.ONE, 'FEE_PCT_ABOVE_ONE'); // If there is no fee percentage, there must not be a fee cap bool isZeroCap = token == address(0) && cap == 0 && period == 0; require(pct != 0 || isZeroCap, 'INVALID_CAP_WITH_FEE_ZERO'); // If there is a cap, all values must be non-zero bool isNonZeroCap = token != address(0) && cap != 0 && period != 0; require(isZeroCap || isNonZeroCap, 'INCONSISTENT_CAP_VALUES'); // Changing the fee percentage does not affect the totalizator at all, it only affects future fee charges fee.pct = pct; // Changing the fee cap amount does not affect the totalizator, it only applies when changing the for the total // charged amount. Note that it can happen that the cap amount is lower than the total charged amount if the // cap amount is lowered. However, there shouldn't be any accounting issues with that. fee.cap = cap; // Changing the cap period only affects the end time of the next period, but not the end date of the current one fee.period = period; // Therefore, only clean the totalizators if the cap is being removed if (isZeroCap) { fee.totalCharged = 0; fee.nextResetTime = 0; } else { // If cap values are not zero, set the next reset time if it wasn't set already // Otherwise, if the cap token is being changed the total charged amount must be updated accordingly if (fee.nextResetTime == 0) { fee.nextResetTime = block.timestamp + period; } else if (fee.token != token) { uint256 newTokenPrice = getPrice(fee.token, token); fee.totalCharged = fee.totalCharged.mulDown(newTokenPrice); } } // Finally simply set the new requested token fee.token = token; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title IBridgeConnector * @dev Bridge Connector interface to bridge tokens between different chains. It must follow IImplementation interface. */ interface IBridgeConnector is IImplementation { /** * @dev Enum identifying the sources proposed: Hop only for now. */ enum Source { Hop } /** * @dev Bridge assets to a different chain * @param source Source to execute the requested bridge op * @param chainId ID of the destination chain * @param token Address of the token to be bridged * @param amountIn Amount of tokens to be bridged * @param minAmountOut Minimum amount of tokens willing to receive on the destination chain * @param recipient Address that will receive the tokens on the destination chain * @param data ABI encoded data that will depend on the requested source */ function bridge( uint8 source, uint256 chainId, address token, uint256 amountIn, uint256 minAmountOut, address recipient, bytes memory data ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import './IAuthorizer.sol'; /** * @title Authorizer * @dev Authorization module to be used by contracts that need to implement permissions for their methods. * It provides a permissions model to list who is allowed to call what function in a contract. And only accounts * authorized to manage those permissions are the ones that are allowed to authorize or unauthorize accounts. */ contract Authorizer is IAuthorizer { // Constant used to denote that a permission is open to anyone address public constant ANY_ADDRESS = address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF); // Internal mapping to tell who is allowed to do what indexed by (account, function selector) mapping (address => mapping (bytes4 => bool)) private authorized; /** * @dev Modifier that should be used to tag protected functions */ modifier auth() { _authenticate(msg.sender, msg.sig); _; } /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) public view override returns (bool) { return authorized[ANY_ADDRESS][what] || authorized[who][what]; } /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external override auth { _authorize(who, what); } /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external override auth { _unauthorize(who, what); } /** * @dev Internal function to authenticate someone over a function. * It reverts if the given account is not authorized to call the requested function. * @param who Address to be authenticated * @param what Function selector to be authenticated */ function _authenticate(address who, bytes4 what) internal view { require(isAuthorized(who, what), 'AUTH_SENDER_NOT_ALLOWED'); } /** * @dev Internal function to authorize someone to call a function * @param who Address to be authorized * @param what Function selector to be granted */ function _authorize(address who, bytes4 what) internal { authorized[who][what] = true; emit Authorized(who, what); } /** * @dev Internal function to unauthorize someone to call a function * @param who Address to be unauthorized * @param what Function selector to be revoked */ function _unauthorize(address who, bytes4 what) internal { authorized[who][what] = false; emit Unauthorized(who, what); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; /** * @title IAuthorizer */ interface IAuthorizer { /** * @dev Emitted when an account is authorized to call a function */ event Authorized(address indexed who, bytes4 what); /** * @dev Emitted when an account is unauthorized to call a function */ event Unauthorized(address indexed who, bytes4 what); /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external; /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external; /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; /** * @title FixedPoint * @dev Math library to operate with fixed point values with 18 decimals */ library FixedPoint { // 1 in fixed point value: 18 decimal places uint256 internal constant ONE = 1e18; /** * @dev Multiplies two fixed point numbers rounding down */ function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; require(a == 0 || product / a == b, 'MUL_OVERFLOW'); return product / ONE; } } /** * @dev Multiplies two fixed point numbers rounding up */ function mulUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; require(a == 0 || product / a == b, 'MUL_OVERFLOW'); return product == 0 ? 0 : (((product - 1) / ONE) + 1); } } /** * @dev Divides two fixed point numbers rounding down */ function divDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { require(b != 0, 'ZERO_DIVISION'); if (a == 0) return 0; uint256 aInflated = a * ONE; require(aInflated / a == ONE, 'DIV_INTERNAL'); return aInflated / b; } } /** * @dev Divides two fixed point numbers rounding up */ function divUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { require(b != 0, 'ZERO_DIVISION'); if (a == 0) return 0; uint256 aInflated = a * ONE; require(aInflated / a == ONE, 'DIV_INTERNAL'); return ((aInflated - 1) / b) + 1; } } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; /** * @title UncheckedMath * @dev Math library to perform unchecked operations */ library UncheckedMath { /** * @dev Unsafely adds two unsigned integers */ function uncheckedAdd(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a + b; } } /** * @dev Unsafely subtracts two unsigned integers */ function uncheckedSub(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a - b; } } /** * @dev Unsafely multiplies two unsigned integers */ function uncheckedMul(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a * b; } } /** * @dev Unsafely multiplies two signed integers */ function uncheckedMul(int256 a, int256 b) internal pure returns (int256) { unchecked { return a * b; } } /** * @dev Unsafely divides two unsigned integers */ function uncheckedDiv(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a / b; } } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; /** * @title Denominations * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20. * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated. */ library Denominations { address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function isNativeToken(address token) internal pure returns (bool) { return token == NATIVE_TOKEN; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; /** * @title IWrappedNativeToken */ interface IWrappedNativeToken is IERC20 { /** * @dev Wraps msg.value into the wrapped-native token */ function deposit() external payable; /** * @dev Unwraps requested amount to the native token */ function withdraw(uint256 amount) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; /** * @title IPriceFeedProvider * @dev Contract providing price feed references for (base, quote) token pairs */ interface IPriceFeedProvider { /** * @dev Emitted every time a price feed is set for (base, quote) pair */ event PriceFeedSet(address indexed base, address indexed quote, address feed); /** * @dev Tells the price feed address for (base, quote) pair. It returns the zero address if there is no one set. * @param base Token to be rated * @param quote Token used for the price rate */ function getPriceFeed(address base, address quote) external view returns (address); /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) external; /** * @dev Sets a list of price feeds * @param bases List of token bases to be set * @param quotes List of token quotes to be set * @param feeds List of price feeds to be set */ function setPriceFeeds(address[] memory bases, address[] memory quotes, address[] memory feeds) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/math/UncheckedMath.sol'; import './IPriceFeedProvider.sol'; /** * @title IPriceFeedProvider * @dev Contract providing price feed references for (base, quote) token pairs */ contract PriceFeedProvider is IPriceFeedProvider { using UncheckedMath for uint256; // Mapping of price feeds from "token A" to "token B" mapping (address => mapping (address => address)) private _priceFeeds; /** * @dev Tells the price feed address for (base, quote) pair. It returns the zero address if there is no one set. * @param base Token to be rated * @param quote Token used for the price rate */ function getPriceFeed(address base, address quote) external view override returns (address) { return _priceFeeds[base][quote]; } /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) public virtual override { _priceFeeds[base][quote] = feed; emit PriceFeedSet(base, quote, feed); } /** * @dev Sets a list of price feeds. Sender must be authorized. * @param bases List of token bases to be set * @param quotes List of token quotes to be set * @param feeds List of price feeds to be set */ function setPriceFeeds(address[] memory bases, address[] memory quotes, address[] memory feeds) public virtual override { require(bases.length == quotes.length, 'SET_FEEDS_INVALID_QUOTES_LENGTH'); require(bases.length == feeds.length, 'SET_FEEDS_INVALID_FEEDS_LENGTH'); for (uint256 i = 0; i < bases.length; i = i.uncheckedAdd(1)) setPriceFeed(bases[i], quotes[i], feeds[i]); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title IPriceOracle * @dev Oracle that interfaces with external feeds to provide quotes for tokens based on any other token. * It must support also `IImplementation`. */ interface IPriceOracle is IImplementation { /** * @dev Tells the price of a token (base) in a given quote. The response is expressed using the corresponding * number of decimals so that when performing a fixed point product of it by a `base` amount it results in * a value expressed in `quote` decimals. For example, if `base` is ETH and `quote` is USDC, then the returned * value is expected to be expressed using 6 decimals: * * FixedPoint.mul(X[ETH], price[USDC/ETH]) = FixedPoint.mul(X[18], price[6]) = X * price [6] * * @param provider Contract providing the price feeds to use by the oracle * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address provider, address base, address quote) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import './IImplementation.sol'; import '../registry/IRegistry.sol'; /** * @title BaseImplementation * @dev This implementation contract comes with an immutable reference to an implementations registry where it should * be registered as well (checked during initialization). It allows requesting new instances of other registered * implementations to as another safety check to make sure valid instances are referenced in case it's needed. */ abstract contract BaseImplementation is IImplementation { // Immutable implementations registry reference address public immutable override registry; /** * @dev Creates a new BaseImplementation * @param _registry Address of the Mimic Registry where dependencies will be validated against */ constructor(address _registry) { registry = _registry; } /** * @dev Internal function to validate a new dependency that must be registered as stateless. * It checks the new dependency is registered, not deprecated, and stateless. * @param dependency New stateless dependency to be set */ function _validateStatelessDependency(address dependency) internal view { require(_validateDependency(dependency), 'DEPENDENCY_NOT_STATELESS'); } /** * @dev Internal function to validate a new dependency that cannot be registered as stateless. * It checks the new dependency is registered, not deprecated, and not stateful. * @param dependency New stateful dependency to be set */ function _validateStatefulDependency(address dependency) internal view { require(!_validateDependency(dependency), 'DEPENDENCY_NOT_STATEFUL'); } /** * @dev Internal function to validate a new dependency. It checks the dependency is registered and not deprecated. * @param dependency New dependency to be set * @return Whether the dependency is stateless or not */ function _validateDependency(address dependency) private view returns (bool) { (bool stateless, bool deprecated, bytes32 namespace) = IRegistry(registry).implementationData(dependency); require(namespace != bytes32(0), 'DEPENDENCY_NOT_REGISTERED'); require(!deprecated, 'DEPENDENCY_DEPRECATED'); return stateless; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; // solhint-disable func-name-mixedcase /** * @title IImplementation * @dev Implementation interface that must be followed for implementations to be registered in the Mimic Registry */ interface IImplementation { /** * @dev Tells the namespace under which the implementation is registered in the Mimic Registry */ function NAMESPACE() external view returns (bytes32); /** * @dev Tells the address of the Mimic Registry */ function registry() external view returns (address); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import './InitializableImplementation.sol'; /** * @title InitializableAuthorizedImplementation * @dev InitializableImplementation using the Authorizer mixin. Initializable implementations that want to use the * Authorizer permissions mechanism should inherit from this contract instead. */ abstract contract InitializableAuthorizedImplementation is InitializableImplementation, Authorizer { /** * @dev Creates a new InitializableAuthorizedImplementation * @param registry Address of the Mimic Registry */ constructor(address registry) InitializableImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } /** * @dev Initialization function that authorizes an admin account to authorize and unauthorize accounts. * Note this function can only be called from a function marked with the `initializer` modifier. * @param admin Address to be granted authorize and unauthorize permissions */ function _initialize(address admin) internal onlyInitializing { _initialize(); _authorize(admin, Authorizer.authorize.selector); _authorize(admin, Authorizer.unauthorize.selector); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import './BaseImplementation.sol'; /** * @title InitializableImplementation * @dev Implementation contract to be used through proxies. Inheriting contracts are meant to be initialized through * initialization functions instead of constructor functions. It allows re-using the same logic contract while making * deployments cheaper. */ abstract contract InitializableImplementation is BaseImplementation, Initializable { /** * @dev Creates a new BaseImplementation. Note that initializers are disabled at creation time. */ constructor(address registry) BaseImplementation(registry) { _disableInitializers(); } /** * @dev Initialization function. * Note this function can only be called from a function marked with the `initializer` modifier. */ function _initialize() internal view onlyInitializing { // solhint-disable-previous-line no-empty-blocks } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/IAuthorizer.sol'; /** * @title IRegistry * @dev Registry interface, it must follow the IAuthorizer interface. */ interface IRegistry is IAuthorizer { /** * @dev Emitted every time a new implementation is registered */ event Registered(bytes32 indexed namespace, address indexed implementation, bool stateless); /** * @dev Emitted every time an implementation is deprecated */ event Deprecated(bytes32 indexed namespace, address indexed implementation); /** * @dev Tells the data of an implementation: * @param implementation Address of the implementation to request it's data */ function implementationData(address implementation) external view returns (bool stateless, bool deprecated, bytes32 namespace); /** * @dev Tells if a specific implementation is registered under a certain namespace and it's not deprecated * @param namespace Namespace asking for * @param implementation Address of the implementation to be checked */ function isActive(bytes32 namespace, address implementation) external view returns (bool); /** * @dev Registers a new implementation for a given namespace * @param namespace Namespace to be used for the implementation * @param implementation Address of the implementation to be registered * @param stateless Whether the implementation is stateless or not */ function register(bytes32 namespace, address implementation, bool stateless) external; /** * @dev Deprecates a registered implementation * @param implementation Address of the implementation to be deprecated */ function deprecate(address implementation) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title IStrategy * @dev Strategy interface required by Mimic Smart Vaults. It must follow the IImplementation interface. */ interface IStrategy is IImplementation { /** * @dev Tokens accepted to join the strategy */ function joinTokens() external view returns (address[] memory); /** * @dev Tokens accepted to exit the strategy */ function exitTokens() external view returns (address[] memory); /** * @dev Tells how much a value unit means expressed in the asset token. * For example, if a strategy has a value of 100 in T0, and then it has a value of 120 in T1, * and the value rate is 1.5, it means the strategy has earned 30 strategy tokens between T0 and T1. */ function valueRate() external view returns (uint256); /** * @dev Tells the last value an account has over time. Note this value can be outdated: there could be rewards to * be claimed that will affect the accrued value. For example, if an account has a value of 100 in T0, and then it * has a value of 120 in T1, it means it gained a 20% between T0 and T1. * @param account Address of the account querying the last value of */ function lastValue(address account) external view returns (uint256); /** * @dev Claim any existing rewards * @param data Arbitrary extra data * @return tokens Addresses of the tokens received as rewards * @return amounts Amounts of the tokens received as rewards */ function claim(bytes memory data) external returns (address[] memory tokens, uint256[] memory amounts); /** * @dev Join the interfaced DeFi protocol * @param tokensIn List of token addresses to join with * @param amountsIn List of token amounts to join with * @param slippage Slippage value to join with * @param data Arbitrary extra data * @return tokensOut List of token addresses received after the join * @return amountsOut List of token amounts received after the join * @return value Value represented by the joined amount */ function join(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value); /** * @dev Exit the interfaced DeFi protocol * @param tokensIn List of token addresses to exit with * @param amountsIn List of token amounts to exit with * @param slippage Slippage value to exit with * @param data Arbitrary extra data * @return tokensOut List of token addresses received after the exit * @return amountsOut List of token amounts received after the exit * @return value Value represented by the exited amount */ function exit(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title ISwapConnector * @dev Swap Connector interface to perform token swaps. It must follow the IImplementation interface. */ interface ISwapConnector is IImplementation { /** * @dev Enum identifying the sources proposed: Uniswap V2, Uniswap V3, Balancer V2, Paraswap V5, 1inch V5, and Hop. */ enum Source { UniswapV2, UniswapV3, BalancerV2, ParaswapV5, OneInchV5, Hop } /** * @dev Swaps two tokens * @param source Source to execute the requested swap * @param tokenIn Token being sent * @param tokenOut Token being received * @param amountIn Amount of tokenIn being swapped * @param minAmountOut Minimum amount of tokenOut willing to receive * @param data Encoded data to specify different swap parameters depending on the source picked */ function swap( uint8 source, address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data ) external returns (uint256 amountOut); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/Address.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-bridge-connector/contracts/IBridgeConnector.sol'; /** * @title BridgeConnectorLib * @dev Library used to delegate-call bridge ops and decode return data correctly */ library BridgeConnectorLib { /** * @dev Delegate-calls a bridge to the bridge connector and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function bridge( address connector, uint8 source, uint256 chainId, address token, uint256 amountIn, uint256 minAmountOut, address recipient, bytes memory data ) internal { bytes memory bridgeData = abi.encodeWithSelector( IBridgeConnector.bridge.selector, source, chainId, token, amountIn, minAmountOut, recipient, data ); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = connector.delegatecall(bridgeData); Address.verifyCallResult(success, returndata, 'BRIDGE_CALL_REVERTED'); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-strategies/contracts/IStrategy.sol'; /** * @title StrategyLib * @dev Library used to delegate-call to strategy and decode return data correctly */ library StrategyLib { /** * @dev Delegate-calls a claim to a strategy and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function claim(address strategy, bytes memory data) internal returns (address[] memory, uint256[] memory) { bytes memory claimData = abi.encodeWithSelector(IStrategy.claim.selector, data); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = strategy.delegatecall(claimData); Address.verifyCallResult(success, returndata, 'CLAIM_CALL_REVERTED'); return abi.decode(returndata, (address[], uint256[])); } /** * @dev Delegate-calls a join to a strategy and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function join( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) internal returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { bytes memory joinData = abi.encodeWithSelector(IStrategy.join.selector, tokensIn, amountsIn, slippage, data); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = strategy.delegatecall(joinData); Address.verifyCallResult(success, returndata, 'JOIN_CALL_REVERTED'); return abi.decode(returndata, (address[], uint256[], uint256)); } /** * @dev Delegate-calls a exit to a strategy and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function exit( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) internal returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { bytes memory exitData = abi.encodeWithSelector(IStrategy.exit.selector, tokensIn, amountsIn, slippage, data); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = strategy.delegatecall(exitData); Address.verifyCallResult(success, returndata, 'EXIT_CALL_REVERTED'); return abi.decode(returndata, (address[], uint256[], uint256)); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-swap-connector/contracts/ISwapConnector.sol'; /** * @title SwapConnectorLib * @dev Library used to delegate-call swaps and decode return data correctly */ library SwapConnectorLib { /** * @dev Delegate-calls a swap to the swap connector and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function swap( address connector, uint8 source, address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data ) internal returns (uint256 amountOut) { bytes memory swapData = abi.encodeWithSelector( ISwapConnector.swap.selector, source, tokenIn, tokenOut, amountIn, minAmountOut, data ); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = connector.delegatecall(swapData); Address.verifyCallResult(success, returndata, 'SWAP_CALL_REVERTED'); return abi.decode(returndata, (uint256)); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/IAuthorizer.sol'; import '@mimic-fi/v2-price-oracle/contracts/feeds/IPriceFeedProvider.sol'; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title ISmartVault * @dev Mimic Smart Vault interface to manage assets. It must support also `IImplementation` and `IAuthorizer` */ interface ISmartVault is IPriceFeedProvider, IImplementation, IAuthorizer { enum SwapLimit { Slippage, MinAmountOut } enum BridgeLimit { Slippage, MinAmountOut } /** * @dev Emitted every time a new strategy is set for the Smart Vault */ event StrategySet(address indexed strategy, bool allowed); /** * @dev Emitted every time a new price oracle is set for the Smart Vault */ event PriceOracleSet(address indexed priceOracle); /** * @dev Emitted every time a new swap connector is set for the Smart Vault */ event SwapConnectorSet(address indexed swapConnector); /** * @dev Emitted every time a new bridge connector is set for the Smart Vault */ event BridgeConnectorSet(address indexed bridgeConnector); /** * @dev Emitted every time a new fee collector is set */ event FeeCollectorSet(address indexed feeCollector); /** * @dev Emitted every time the withdraw fee percentage is set */ event WithdrawFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time the performance fee percentage is set */ event PerformanceFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time the swap fee percentage is set */ event SwapFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time the bridge fee percentage is set */ event BridgeFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time `call` is called */ event Call(address indexed target, bytes callData, uint256 value, bytes result, bytes data); /** * @dev Emitted every time `collect` is called */ event Collect(address indexed token, address indexed from, uint256 collected, bytes data); /** * @dev Emitted every time `withdraw` is called */ event Withdraw(address indexed token, address indexed recipient, uint256 withdrawn, uint256 fee, bytes data); /** * @dev Emitted every time `wrap` is called */ event Wrap(uint256 amount, uint256 wrapped, bytes data); /** * @dev Emitted every time `unwrap` is called */ event Unwrap(uint256 amount, uint256 unwrapped, bytes data); /** * @dev Emitted every time `claim` is called */ event Claim(address indexed strategy, address[] tokens, uint256[] amounts, bytes data); /** * @dev Emitted every time `join` is called */ event Join( address indexed strategy, address[] tokensIn, uint256[] amountsIn, address[] tokensOut, uint256[] amountsOut, uint256 value, uint256 slippage, bytes data ); /** * @dev Emitted every time `exit` is called */ event Exit( address indexed strategy, address[] tokensIn, uint256[] amountsIn, address[] tokensOut, uint256[] amountsOut, uint256 value, uint256[] fees, uint256 slippage, bytes data ); /** * @dev Emitted every time `swap` is called */ event Swap( uint8 indexed source, address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut, uint256 minAmountOut, uint256 fee, bytes data ); /** * @dev Emitted every time `bridge` is called */ event Bridge( uint8 indexed source, uint256 indexed chainId, address indexed token, uint256 amountIn, uint256 minAmountOut, uint256 fee, address recipient, bytes data ); /** * @dev Tells a strategy is allowed or not * @param strategy Address of the strategy being queried */ function isStrategyAllowed(address strategy) external view returns (bool); /** * @dev Tells the invested value for a strategy * @param strategy Address of the strategy querying the invested value of */ function investedValue(address strategy) external view returns (uint256); /** * @dev Tells the last value accrued for a strategy. Note this value can be outdated. * @param strategy Address of the strategy querying the last value of */ function lastValue(address strategy) external view returns (uint256); /** * @dev Tells the price oracle associated to a Smart Vault */ function priceOracle() external view returns (address); /** * @dev Tells the swap connector associated to a Smart Vault */ function swapConnector() external view returns (address); /** * @dev Tells the bridge connector associated to a Smart Vault */ function bridgeConnector() external view returns (address); /** * @dev Tells the address where fees will be deposited */ function feeCollector() external view returns (address); /** * @dev Tells the withdraw fee configuration */ function withdrawFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the performance fee configuration */ function performanceFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the swap fee configuration */ function swapFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the bridge fee configuration */ function bridgeFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the address of the wrapped native token */ function wrappedNativeToken() external view returns (address); /** * @dev Sets a new strategy as allowed or not for a Smart Vault * @param strategy Address of the strategy to be set * @param allowed Whether the strategy is allowed or not */ function setStrategy(address strategy, bool allowed) external; /** * @dev Sets a new price oracle to a Smart Vault * @param newPriceOracle Address of the new price oracle to be set */ function setPriceOracle(address newPriceOracle) external; /** * @dev Sets a new swap connector to a Smart Vault * @param newSwapConnector Address of the new swap connector to be set */ function setSwapConnector(address newSwapConnector) external; /** * @dev Sets a new bridge connector to a Smart Vault * @param newBridgeConnector Address of the new bridge connector to be set */ function setBridgeConnector(address newBridgeConnector) external; /** * @dev Sets a new fee collector * @param newFeeCollector Address of the new fee collector to be set */ function setFeeCollector(address newFeeCollector) external; /** * @dev Sets a new withdraw fee configuration * @param pct Withdraw fee percentage to be set * @param cap New maximum amount of withdraw fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the withdraw fee */ function setWithdrawFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Sets a new performance fee configuration * @param pct Performance fee percentage to be set * @param cap New maximum amount of performance fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the performance fee */ function setPerformanceFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Sets a new swap fee configuration * @param pct Swap fee percentage to be set * @param cap New maximum amount of swap fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the swap fee */ function setSwapFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Sets a new bridge fee configuration * @param pct Bridge fee percentage to be set * @param cap New maximum amount of bridge fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the bridge fee */ function setBridgeFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Tells the price of a token (base) in a given quote * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address base, address quote) external view returns (uint256); /** * @dev Execute an arbitrary call from a Smart Vault * @param target Address where the call will be sent * @param callData Calldata to be used for the call * @param value Value in wei that will be attached to the call * @param data Extra data that may enable or not different behaviors depending on the implementation * @return result Call response if it was successful, otherwise it reverts */ function call(address target, bytes memory callData, uint256 value, bytes memory data) external returns (bytes memory result); /** * @dev Collect tokens from a sender to a Smart Vault * @param token Address of the token to be collected * @param from Address where the tokens will be transfer from * @param amount Amount of tokens to be transferred * @param data Extra data that may enable or not different behaviors depending on the implementation * @return collected Amount of tokens assigned to the Smart Vault */ function collect(address token, address from, uint256 amount, bytes memory data) external returns (uint256 collected); /** * @dev Withdraw tokens to an external account * @param token Address of the token to be withdrawn * @param amount Amount of tokens to withdraw * @param recipient Address where the tokens will be transferred to * @param data Extra data that may enable or not different behaviors depending on the implementation * @return withdrawn Amount of tokens transferred to the recipient address */ function withdraw(address token, uint256 amount, address recipient, bytes memory data) external returns (uint256 withdrawn); /** * @dev Wrap an amount of native tokens to the wrapped ERC20 version of it * @param amount Amount of native tokens to be wrapped * @param data Extra data that may enable or not different behaviors depending on the implementation * @return wrapped Amount of tokens wrapped */ function wrap(uint256 amount, bytes memory data) external returns (uint256 wrapped); /** * @dev Unwrap an amount of wrapped native tokens * @param amount Amount of wrapped native tokens to unwrapped * @param data Extra data that may enable or not different behaviors depending on the implementation * @return unwrapped Amount of tokens unwrapped */ function unwrap(uint256 amount, bytes memory data) external returns (uint256 unwrapped); /** * @dev Claim strategy rewards * @param strategy Address of the strategy to claim rewards * @param data Extra data that may enable or not different behaviors depending on the implementation * @return tokens Addresses of the tokens received as rewards * @return amounts Amounts of the tokens received as rewards */ function claim(address strategy, bytes memory data) external returns (address[] memory tokens, uint256[] memory amounts); /** * @dev Join a strategy with an amount of tokens * @param strategy Address of the strategy to join * @param tokensIn List of token addresses to join with * @param amountsIn List of token amounts to join with * @param slippage Slippage that will be used to compute the join * @param data Extra data that may enable or not different behaviors depending on the implementation * @return tokensOut List of token addresses received after the join * @return amountsOut List of token amounts received after the join */ function join( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external returns (address[] memory tokensOut, uint256[] memory amountsOut); /** * @dev Exit a strategy * @param strategy Address of the strategy to exit * @param tokensIn List of token addresses to exit with * @param amountsIn List of token amounts to exit with * @param slippage Slippage that will be used to compute the exit * @param data Extra data that may enable or not different behaviors depending on the implementation * @return tokensOut List of token addresses received after the exit * @return amountsOut List of token amounts received after the exit */ function exit( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external returns (address[] memory tokensOut, uint256[] memory amountsOut); /** * @dev Swaps two tokens * @param source Source to request the swap. It depends on the Swap Connector attached to a Smart Vault. * @param tokenIn Token being sent * @param tokenOut Token being received * @param amountIn Amount of tokenIn being swapped * @param limitType Swap limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param data Extra data that may enable or not different behaviors depending on the implementation * @return amountOut Received amount of tokens out */ function swap( uint8 source, address tokenIn, address tokenOut, uint256 amountIn, SwapLimit limitType, uint256 limitAmount, bytes memory data ) external returns (uint256 amountOut); /** * @dev Bridge assets to another chain * @param source Source to request the bridge. It depends on the Bridge Connector attached to a Smart Vault. * @param chainId ID of the destination chain * @param token Address of the token to be bridged * @param amount Amount of tokens to be bridged * @param limitType Swap limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param recipient Address that will receive the tokens on the destination chain * @param data Extra data that may enable or not different behaviors depending on the implementation * @return bridged Amount requested to be bridged after fees */ function bridge( uint8 source, uint256 chainId, address token, uint256 amount, BridgeLimit limitType, uint256 limitAmount, address recipient, bytes memory data ) external returns (uint256 bridged); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title ISmartVaultsFactory * @dev Smart Vaults Factory interface, it must follow the IImplementation interface. */ interface ISmartVaultsFactory is IImplementation { /** * @dev Emitted every time a new Smart Vault instance is created */ event Created(address indexed implementation, address indexed instance, bytes initializeResult); /** * @dev Tells the implementation associated to a contract instance * @param instance Address of the instance to request it's implementation */ function implementationOf(address instance) external view returns (address); /** * @dev Creates a new Smart Vault pointing to a registered implementation * @param salt Salt bytes to derivate the address of the new instance * @param implementation Address of the implementation to be instanced * @param initializeData Arbitrary data to be sent after deployment * @return instance Address of the new instance created */ function create(bytes32 salt, address implementation, bytes memory initializeData) external returns (address); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/Clones.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import '@mimic-fi/v2-registry/contracts/registry/IRegistry.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import './ISmartVaultsFactory.sol'; /** * @title SmartVaultsFactory * @dev */ contract SmartVaultsFactory is ISmartVaultsFactory, BaseImplementation { using Address for address; // Smart Vaults Factory namespace bytes32 public constant override NAMESPACE = keccak256('SMART_VAULTS_FACTORY'); // Namespace to use by this deployer to fetch ISmartVault implementations from the Mimic Registry bytes32 private constant SMART_VAULT_NAMESPACE = keccak256('SMART_VAULT'); // List of instances' implementations indexed by instance address mapping (address => address) public override implementationOf; /** * @dev Creates a new Smart Vaults Factory implementation * @param registry Address of the Mimic Registry to be referenced */ constructor(address registry) BaseImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } /** * @dev Creates a new Smart Vault pointing to a registered implementation using CREATE2 * @param salt Salt bytes to derivate the address of the new instance * @param implementation Address of the implementation to be instanced. It must be registered and not deprecated. * @param initializeData Arbitrary data to be sent after deployment. It can be used to initialize the new instance. * @return instance Address of the new instance created */ function create(bytes32 salt, address implementation, bytes memory initializeData) external override returns (address instance) { require(implementation != address(0), 'IMPLEMENTATION_ADDRESS_ZERO'); require(IImplementation(implementation).NAMESPACE() == SMART_VAULT_NAMESPACE, 'BAD_IMPLEMENTATION_NAMESPACE'); require(IRegistry(registry).isActive(SMART_VAULT_NAMESPACE, implementation), 'BAD_SMART_VAULT_IMPLEMENTATION'); bytes32 senderSalt = keccak256(abi.encodePacked(msg.sender, salt)); instance = Clones.cloneDeterministic(address(implementation), senderSalt); implementationOf[instance] = implementation; bytes memory result = initializeData.length == 0 ? new bytes(0) : instance.functionCall(initializeData, 'SMART_VAULT_INIT_FAILED'); emit Created(implementation, instance, result); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-bridge-connector/contracts/IBridgeConnector.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import '../samples/BridgeMock.sol'; contract BridgeConnectorMock is IBridgeConnector, BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('BRIDGE_CONNECTOR'); BridgeMock public immutable bridgeMock; constructor(address registry) BaseImplementation(registry) { bridgeMock = new BridgeMock(); } function bridge( uint8, /* source */ uint256, /* chainId */ address token, uint256 amountIn, uint256 minAmountOut, address recipient, bytes memory data ) external override { IERC20(token).approve(address(bridgeMock), amountIn); return bridgeMock.bridge(token, amountIn, minAmountOut, recipient, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v2-price-oracle/contracts/oracle/IPriceOracle.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; contract PriceOracleMock is IPriceOracle, BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('PRICE_ORACLE'); struct Feed { bool set; uint256 rate; } mapping (address => mapping (address => Feed)) public mockedFeeds; constructor(address registry) BaseImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } function mockRate(address base, address quote, uint256 newMockedRate) external { Feed storage feed = mockedFeeds[base][quote]; feed.set = true; feed.rate = newMockedRate; } function getPrice(address, address base, address quote) external view override returns (uint256) { if (base == quote) return FixedPoint.ONE; Feed storage feed = mockedFeeds[base][quote]; require(feed.set, 'PRICE_ORACLE_FEED_NOT_SET'); return feed.rate; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v2-strategies/contracts/IStrategy.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import '../samples/TokenMock.sol'; contract StrategyMock is IStrategy, BaseImplementation { using FixedPoint for uint256; bytes32 public constant override NAMESPACE = keccak256('STRATEGY'); address public immutable lpt; address public immutable token; address public immutable rewardToken; event Claimed(bytes data); event Joined(address[] tokensIn, uint256[] amountsIn, uint256 slippage, bytes data); event Exited(address[] tokensIn, uint256[] amountsIn, uint256 slippage, bytes data); constructor(address registry) BaseImplementation(registry) { lpt = address(new TokenMock('LPT')); token = address(new TokenMock('TKN')); rewardToken = address(new TokenMock('REW')); } function mockGains(address account, uint256 multiplier) external { uint256 balance = IERC20(lpt).balanceOf(account); TokenMock(lpt).mint(account, balance * (multiplier - 1)); } function mockLosses(address account, uint256 divisor) external { uint256 balance = IERC20(lpt).balanceOf(account); TokenMock(lpt).burn(account, balance / divisor); } function joinTokens() public view override returns (address[] memory tokens) { tokens = new address[](1); tokens[0] = token; } function exitTokens() public view override returns (address[] memory tokens) { tokens = new address[](1); tokens[0] = lpt; } function valueRate() public pure override returns (uint256) { return FixedPoint.ONE; } function lastValue(address account) public view override returns (uint256) { return IERC20(lpt).balanceOf(account); } function claim(bytes memory data) external override returns (address[] memory tokens, uint256[] memory amounts) { uint256 amount = abi.decode(data, (uint256)); TokenMock(rewardToken).mint(address(this), amount); tokens = new address[](1); tokens[0] = rewardToken; amounts = new uint256[](1); amounts[0] = amount; emit Claimed(data); } function join(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external override returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { require(tokensIn.length == 1, 'STRATEGY_INVALID_TOKENS_IN_LEN'); require(amountsIn.length == 1, 'STRATEGY_INVALID_AMOUNTS_IN_LEN'); require(tokensIn[0] == token, 'STRATEGY_INVALID_JOIN_TOKEN'); tokensOut = exitTokens(); amountsOut = new uint256[](1); amountsOut[0] = amountsIn[0]; TokenMock(token).burn(address(this), amountsIn[0]); TokenMock(lpt).mint(address(this), amountsOut[0]); value = amountsOut[0].mulDown(valueRate()); emit Joined(tokensIn, amountsIn, slippage, data); } function exit(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external override returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { require(tokensIn.length == 1, 'STRATEGY_INVALID_TOKENS_IN_LEN'); require(amountsIn.length == 1, 'STRATEGY_INVALID_AMOUNTS_IN_LEN'); require(tokensIn[0] == lpt, 'STRATEGY_INVALID_EXIT_TOKEN'); tokensOut = joinTokens(); amountsOut = new uint256[](1); amountsOut[0] = amountsIn[0]; TokenMock(lpt).burn(address(this), amountsIn[0]); TokenMock(token).mint(address(this), amountsOut[0]); value = amountsIn[0].divUp(valueRate()); emit Exited(tokensIn, amountsIn, slippage, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-swap-connector/contracts/ISwapConnector.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import '../samples/DexMock.sol'; contract SwapConnectorMock is ISwapConnector, BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('SWAP_CONNECTOR'); DexMock public immutable dex; constructor(address registry) BaseImplementation(registry) { dex = new DexMock(); } function mockRate(uint256 newRate) external { dex.mockRate(newRate); } function swap( uint8, /* source */ address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data ) external override returns (uint256 amountOut) { IERC20(tokenIn).approve(address(dex), amountIn); return dex.swap(tokenIn, tokenOut, amountIn, minAmountOut, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; contract BridgeMock { function bridge(address token, uint256 amount, uint256, address, bytes memory) external { IERC20(token).transferFrom(msg.sender, address(this), amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; contract DexMock { using FixedPoint for uint256; uint256 public mockedRate; constructor() { mockedRate = FixedPoint.ONE; } function mockRate(uint256 newRate) external { mockedRate = newRate; } function swap(address tokenIn, address tokenOut, uint256 amountIn, uint256, bytes memory) external returns (uint256 amountOut) { IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); amountOut = amountIn.mulDown(mockedRate); IERC20(tokenOut).transfer(msg.sender, amountOut); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; contract TokenMock is ERC20 { constructor(string memory symbol) ERC20(symbol, symbol) { // solhint-disable-previous-line no-empty-blocks } function mint(address account, uint256 amount) external { _mint(account, amount); } function burn(address account, uint256 amount) external { _burn(account, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/utils/IWrappedNativeToken.sol'; contract WrappedNativeTokenMock is IWrappedNativeToken { uint8 public decimals = 18; string public name = 'Wrapped Native Token'; string public symbol = 'WNT'; event Deposit(address indexed to, uint256 amount); event Withdrawal(address indexed from, uint256 amount); mapping (address => uint256) public override balanceOf; mapping (address => mapping (address => uint256)) public override allowance; receive() external payable { deposit(); } function deposit() public payable override { balanceOf[msg.sender] += msg.value; emit Deposit(msg.sender, msg.value); } function withdraw(uint256 amount) public override { require(balanceOf[msg.sender] >= amount, 'WNT_NOT_ENOUGH_BALANCE'); balanceOf[msg.sender] -= amount; payable(msg.sender).transfer(amount); emit Withdrawal(msg.sender, amount); } function totalSupply() public view override returns (uint256) { return address(this).balance; } function approve(address spender, uint256 amount) public override returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public override returns (bool) { return transferFrom(msg.sender, to, amount); } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { require(balanceOf[from] >= amount, 'NOT_ENOUGH_BALANCE'); if (from != msg.sender && allowance[from][msg.sender] != type(uint256).max) { require(allowance[from][msg.sender] >= amount, 'NOT_ENOUGH_ALLOWANCE'); allowance[from][msg.sender] -= amount; } balanceOf[from] -= amount; balanceOf[to] += amount; emit Transfer(from, to, amount); return true; } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
[{"inputs":[{"internalType":"address","name":"_wrappedNativeToken","type":"address"},{"internalType":"address","name":"_registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"source","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Bridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bridgeConnector","type":"address"}],"name":"BridgeConnectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"BridgeFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"callData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"result","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Call","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"collected","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokensIn","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokensOut","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"slippage","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeCollector","type":"address"}],"name":"FeeCollectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokensIn","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokensOut","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippage","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"PerformanceFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"base","type":"address"},{"indexed":true,"internalType":"address","name":"quote","type":"address"},{"indexed":false,"internalType":"address","name":"feed","type":"address"}],"name":"PriceFeedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"priceOracle","type":"address"}],"name":"PriceOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"StrategySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"source","type":"uint8"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"swapConnector","type":"address"}],"name":"SwapConnectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"SwapFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"Unauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unwrapped","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Unwrap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"WithdrawFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wrapped","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Wrap","type":"event"},{"inputs":[],"name":"ANY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAMESPACE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"source","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum ISmartVault.BridgeLimit","name":"limitType","type":"uint8"},{"internalType":"uint256","name":"limitAmount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"uint256","name":"bridged","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeConnector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"call","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"claim","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"collect","outputs":[{"internalType":"uint256","name":"collected","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"tokensIn","type":"address[]"},{"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"exit","outputs":[{"internalType":"address[]","name":"tokensOut","type":"address[]"},{"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investedValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStrategyAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"tokensIn","type":"address[]"},{"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"join","outputs":[{"internalType":"address[]","name":"tokensOut","type":"address[]"},{"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"}],"name":"lastValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newBridgeConnector","type":"address"}],"name":"setBridgeConnector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setBridgeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"address","name":"feed","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bases","type":"address[]"},{"internalType":"address[]","name":"quotes","type":"address[]"},{"internalType":"address[]","name":"feeds","type":"address[]"}],"name":"setPriceFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPriceOracle","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSwapConnector","type":"address"}],"name":"setSwapConnector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"source","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"enum ISmartVault.SwapLimit","name":"limitType","type":"uint8"},{"internalType":"uint256","name":"limitAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapConnector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"unwrapped","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"wrapped","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value POL 50.78% $0.01156 4,643,429.7513 $53,676.52 POL 0.08% $398.9 0.219 $87.35 POL 0.08% $1 80.8642 $80.86 POL 0.07% $2.2 36.0113 $79.22 POL 0.07% $0.024767 2,973.1824 $73.64 POL 0.07% <$0.000001 4,826,528,747.2452 $73.36 POL 0.07% $0.062092 1,163.8607 $72.27 POL 0.06% $0.219331 283.2076 $62.12 POL 0.06% $11.03 5.334 $58.83 POL 0.05% $28.67 2.024 $58.03 POL 0.05% $0.056613 1,015.4392 $57.49 POL 0.05% $1 53.2927 $53.29 POL 0.05% $1.08 47.4394 $51.09 POL 0.05% $0.246267 199.4362 $49.11 POL 0.04% $0.15217 248.2982 $37.78 POL 0.03% $0.05796 632.6277 $36.67 POL 0.03% $0.000276 130,836.201 $36.15 POL 0.03% $0.000004 7,875,136.6767 $32.37 POL 0.03% $0.00341 9,405.2006 $32.07 POL 0.03% $1 27.4253 $27.45 POL 0.03% $0.012395 2,144.3413 $26.58 POL 0.02% $3,990.13 0.0062864 $25.08 POL 0.02% $0.018208 1,375.8306 $25.05 POL 0.02% $0.001723 13,698.2428 $23.6 POL 0.02% $0.001091 21,085.0234 $23.01 POL 0.02% $0.000037 625,695.4582 $22.89 POL Polygon (POL)0.02% $0.589199 36.8589 $21.72 POL 0.02% $0.097846 218.5216 $21.38 POL 0.02% $0.025043 755.9516 $18.93 POL 0.02% $3.92 4.4476 $17.43 POL 0.02% $0.002342 7,346.2299 $17.2 POL 0.02% $0.202803 84.2244 $17.08 POL 0.02% $0.005705 2,910.1046 $16.6 POL 0.02% $1.02 15.9971 $16.35 POL 0.01% $0.001397 11,281.5912 $15.75 POL 0.01% $4,721.71 0.0032336 $15.27 POL 0.01% $0.484724 30.5104 $14.79 POL 0.01% $0.000027 542,125.2572 $14.64 POL 0.01% $0.015892 897.3897 $14.26 POL 0.01% <$0.000001 59,315,359.011 $13.52 POL 0.01% $0.849209 15.7277 $13.36 POL 0.01% $0.00095 13,235.86 $12.58 POL 0.01% $2.84 4.3959 $12.48 POL 0.01% $0.703456 17.128 $12.05 POL 0.01% $3.39 3.5427 $12.01 POL 0.01% $0.390722 29.9302 $11.69 POL 0.01% $0.00537 2,167.2046 $11.64 POL 0.01% $0.012216 933.9562 $11.41 POL 0.01% $0.003414 3,330.5708 $11.37 POL 0.01% $0.002164 5,149.4214 $11.14 POL 0.01% $8.89 1.2478 $11.09 POL <0.01% $0.088668 117.9862 $10.46 POL <0.01% $0.000303 33,393.1676 $10.11 POL <0.01% $3,988.82 0.0025026 $9.98 POL <0.01% $0.11159 88.2212 $9.84 POL <0.01% $0.031317 313.0515 $9.8 POL <0.01% $0.596879 15.8569 $9.46 POL <0.01% $1.3 7.1703 $9.32 POL <0.01% $0.032419 280.5626 $9.1 POL <0.01% $0.001315 6,877.9078 $9.04 POL <0.01% $1.05 7.8 $8.22 POL <0.01% $0.000011 756,002.3592 $8.13 POL <0.01% $0.014401 556.8421 $8.02 POL <0.01% $0.269651 29.0432 $7.83 POL <0.01% $0.095049 81.2301 $7.72 POL <0.01% $105,983 0.00007096 $7.52 POL <0.01% $1.47 4.8336 $7.11 POL <0.01% $1 6.751 $6.76 POL <0.01% $2.33 2.8756 $6.7 POL <0.01% $0.017436 378.0525 $6.59 POL <0.01% $0.153317 41.9267 $6.43 POL <0.01% $0.588622 10.6232 $6.25 POL <0.01% $104.69 0.0583 $6.11 POL <0.01% $0.060144 100.575 $6.05 POL <0.01% $0.999948 6.0202 $6.02 POL <0.01% $0.002962 1,984.8418 $5.88 POL <0.01% <$0.000001 20,167,045.9115 $5.77 POL <0.01% $0.000001 5,217,777.847 $5.7 POL <0.01% $0.001258 4,522.3112 $5.69 POL <0.01% $49.32 0.1114 $5.49 POL <0.01% $0.00484 1,118.8146 $5.41 POL <0.01% $0.005963 906.0911 $5.4 POL <0.01% $0.035419 150.6022 $5.33 POL <0.01% $2.01 2.6242 $5.27 POL <0.01% $1 5.1853 $5.19 POL <0.01% $0.874151 5.9093 $5.17 POL <0.01% $0.000022 223,457.817 $4.98 POL <0.01% $0.01059 465.9209 $4.93 POL <0.01% $0.003952 1,247.988 $4.93 POL <0.01% $0.027405 176.861 $4.85 POL <0.01% $1 4.5411 $4.54 POL <0.01% $0.048941 90.917 $4.45 POL <0.01% $0.01213 365.3352 $4.43 POL <0.01% $0.030301 141.7832 $4.3 POL <0.01% $172.57 0.0248 $4.27 POL <0.01% $0.005463 756.359 $4.13 POL <0.01% $0.008984 459.2901 $4.13 POL <0.01% $0.005071 799.9257 $4.06 POL <0.01% $0.167737 23.8677 $4 POL <0.01% $0.197098 20.1923 $3.98 POL <0.01% $0.000043 93,386.0252 $3.97 POL <0.01% $3.91 1.0113 $3.95 POL <0.01% $0.000366 10,741.6056 $3.93 POL <0.01% $0.005745 673.4763 $3.87 POL <0.01% $0.000646 5,981.4188 $3.86 POL <0.01% $1 3.8282 $3.83 POL <0.01% $381 0.00993161 $3.78 POL <0.01% $0.646753 5.5938 $3.62 POL <0.01% $0.993626 3.6059 $3.58 POL <0.01% $0.007118 481.5821 $3.43 POL <0.01% $0.011655 290.8379 $3.39 POL <0.01% $0.003712 893.3703 $3.32 POL <0.01% $0.004054 812.6642 $3.29 POL <0.01% $0.000007 478,128.2236 $3.23 POL <0.01% $0.001255 2,492.7597 $3.13 POL <0.01% $0.028429 109.6139 $3.12 POL <0.01% <$0.000001 65,766,670.6724 $3.01 POL <0.01% <$0.000001 163,994,521.2472 $2.89 POL <0.01% $290.71 0.00974153 $2.83 POL <0.01% $0.139896 19.9598 $2.79 POL <0.01% $257.48 0.0103 $2.64 POL <0.01% $0.238341 11 $2.62 POL <0.01% $0.726179 3.6067 $2.62 POL <0.01% $1 2.5855 $2.59 POL <0.01% $0.003603 715.4341 $2.58 POL <0.01% $0.724946 3.522 $2.55 POL <0.01% <$0.000001 273,534,094.2042 $2.52 POL <0.01% $0.996668 2.4897 $2.48 POL <0.01% $0.097724 25.2495 $2.47 POL <0.01% $3.59 0.661 $2.37 POL <0.01% $0.014845 154.3648 $2.29 POL <0.01% $0.052661 42.8751 $2.26 POL <0.01% $0.001089 2,066.0786 $2.25 POL <0.01% $0.000468 4,730.5038 $2.22 POL <0.01% $0.002407 912.9263 $2.2 POL <0.01% $1.06 2.0596 $2.18 POL <0.01% $1,874.66 0.00114272 $2.14 POL <0.01% $0.04476 44.6348 $2 POL <0.01% $1.18 1.684 $1.99 POL <0.01% $0.956203 2.0623 $1.97 POL <0.01% $0.000159 12,081.2324 $1.92 POL <0.01% $0.000307 6,226.0821 $1.91 POL <0.01% $0.135218 14.0547 $1.9 POL <0.01% $0.003083 611.8003 $1.89 POL <0.01% $3.71 0.498 $1.85 POL <0.01% $0.001024 1,743.5437 $1.79 POL <0.01% $0.342202 5.14 $1.76 POL <0.01% $0.000041 42,875.209 $1.75 POL <0.01% $0.47709 3.6462 $1.74 POL <0.01% $0.001775 973.3635 $1.73 POL <0.01% $0.001453 1,173.6459 $1.71 POL <0.01% $0.00039 4,214.3094 $1.64 POL <0.01% $0.005966 258.4928 $1.54 POL <0.01% $0.005145 293.3072 $1.51 POL <0.01% $0.01596 91.8604 $1.47 POL <0.01% $0.012384 117.1338 $1.45 POL <0.01% $0.007144 197.0706 $1.41 POL <0.01% $0.001245 1,107.7168 $1.38 POL <0.01% $0.017842 77.1352 $1.38 POL <0.01% $0.988636 1.3847 $1.37 POL <0.01% $0.001146 1,184.2083 $1.36 POL <0.01% $0.049444 26.5068 $1.31 POL <0.01% $0.002133 610.0298 $1.3 POL <0.01% $0.255137 4.9767 $1.27 POL <0.01% $0.090557 13.5595 $1.23 POL <0.01% $0.534166 2.2715 $1.21 POL <0.01% $1.21 1 $1.21 POL <0.01% $0.43162 2.7948 $1.21 POL <0.01% $379.96 0.00316867 $1.2 POL <0.01% $0.053553 22.4429 $1.2 POL <0.01% $0.010192 117.8237 $1.2 POL <0.01% $1.2 0.9555 $1.15 POL <0.01% $0.309484 3.5636 $1.1 POL <0.01% $0.000005 217,011.3081 $1.08 POL <0.01% $2,663.4 0.00038785 $1.03 POL <0.01% $0.202183 5.0166 $1.01 POL <0.01% $0.048724 20.4887 $0.9982 POL <0.01% $0.022863 43.6524 $0.998 POL <0.01% $0.167808 5.7084 $0.9579 POL <0.01% $0.001154 817.727 $0.944 POL <0.01% $0.483504 1.9509 $0.9432 POL <0.01% $0.367445 2.5656 $0.9427 POL <0.01% $0.682277 1.3512 $0.9218 POL <0.01% $0.005012 183.8442 $0.9214 POL <0.01% $1.19 0.7603 $0.9047 POL <0.01% $0.001105 817.0754 $0.9025 POL <0.01% $0.000002 447,416.4778 $0.8903 POL <0.01% $0.000213 4,041.5662 $0.8616 POL <0.01% $0.58985 1.4288 $0.8427 POL <0.01% $0.000854 965.9502 $0.8249 POL <0.01% $0.176615 4.6309 $0.8178 POL <0.01% $0.01549 52.0252 $0.8058 POL <0.01% $0.273749 2.9437 $0.8058 POL <0.01% $68.71 0.0116 $0.7958 POL <0.01% $0.135218 5.8254 $0.7876 POL <0.01% $9.44 0.0817 $0.7713 POL <0.01% $0.026204 28.4026 $0.7442 POL <0.01% $1.17 0.6186 $0.7237 POL <0.01% $1 0.7187 $0.7194 POL <0.01% $0.008712 80.9639 $0.7053 POL <0.01% $0.001625 433.8534 $0.705 POL <0.01% $0.014145 49.7591 $0.7038 POL <0.01% $106,049 0.00000657 $0.6967 POL <0.01% $0.000047 14,049.1519 $0.6577 POL <0.01% $0.020056 32.1574 $0.6449 POL <0.01% $0.000989 644.5618 $0.6375 POL <0.01% $0.051693 12.2984 $0.6357 POL <0.01% $0.000667 941.8123 $0.6281 POL <0.01% $0.354878 1.7536 $0.6223 POL <0.01% $0.134312 4.5747 $0.6144 POL <0.01% $0.005494 110.3154 $0.6061 POL <0.01% $3.38 0.179 $0.6051 POL <0.01% $0.000432 1,356.7986 $0.5863 POL <0.01% $0.019972 29.0628 $0.5804 POL <0.01% $0.002482 232.4154 $0.5769 POL <0.01% $2.56 0.2237 $0.5726 POL <0.01% $16.06 0.034 $0.5464 POL <0.01% $0.039706 13.3411 $0.5297 POL <0.01% $0.000822 630.0976 $0.5179 POL <0.01% $0.006583 78.6328 $0.5176 POL <0.01% $0.006284 80.7393 $0.5073 POL <0.01% $0.045711 11.096 $0.5072 POL <0.01% $0.004838 102.4982 $0.4959 POL <0.01% $0.999582 0.4929 $0.4926 POL <0.01% $0.000175 2,806.4268 $0.4906 POL <0.01% $0.022969 21.0087 $0.4825 POL <0.01% $0.000001 426,260.0307 $0.4688 POL <0.01% $0.665891 0.664 $0.4421 POL <0.01% $0.000095 4,441.9971 $0.4239 POL <0.01% $2.99 0.1394 $0.4168 POL <0.01% $4,457.77 0.00009329 $0.4158 POL <0.01% $0.096997 4.2538 $0.4126 POL <0.01% $0.227544 1.7816 $0.4053 POL <0.01% $1.11 0.3624 $0.4023 POL <0.01% $0.000464 853.3732 $0.3958 POL <0.01% $0.023178 16.4803 $0.3819 POL <0.01% $0.01609 23.3308 $0.3753 POL <0.01% $1.14 0.3254 $0.3713 POL <0.01% $0.02069 17.0732 $0.3532 POL <0.01% $0.006294 54.9599 $0.3459 POL <0.01% $1.47 0.2283 $0.3355 POL <0.01% $0.013193 25.2854 $0.3335 POL <0.01% $0.688073 0.4837 $0.3328 POL <0.01% $0.014721 22.5646 $0.3321 POL <0.01% $0.145844 2.2774 $0.3321 POL <0.01% $0.011659 27.8643 $0.3248 POL <0.01% $0.000513 632.6163 $0.3246 POL <0.01% $105,990 0.00000302 $0.32 POL <0.01% $0.002598 121.7583 $0.3163 POL <0.01% $10,688.39 0.00002922 $0.3123 POL <0.01% $0.005644 54.9515 $0.3101 POL <0.01% $27.7 0.0112 $0.3098 POL <0.01% $0.273634 1.1236 $0.3074 POL <0.01% $0.05402 5.6389 $0.3046 POL <0.01% $2.27 0.1317 $0.2989 POL <0.01% $0.079551 3.7296 $0.2966 POL <0.01% <$0.000001 19,754,412.462 $0.2923 POL <0.01% $0.319127 0.8812 $0.2812 POL <0.01% $1.52 0.182 $0.2766 POL <0.01% $0.984021 0.2793 $0.2748 POL <0.01% $1.05 0.2526 $0.2644 POL <0.01% $3,980.97 0.00006574 $0.2617 POL <0.01% $0.001911 132.6878 $0.2535 POL <0.01% $1.7 0.1479 $0.2514 POL <0.01% $0.002301 108.6022 $0.2499 POL <0.01% $0.000577 431.5939 $0.249 POL <0.01% $0.000199 1,243.7738 $0.2477 POL <0.01% $0.002437 101.5407 $0.2474 POL <0.01% $0.092782 2.6553 $0.2463 POL <0.01% $0.00009 2,657.4111 $0.2383 POL <0.01% $214.74 0.00108812 $0.2336 POL <0.01% $1 0.2208 $0.2214 POL <0.01% $0.017968 12.0442 $0.2164 POL <0.01% $0.639042 0.3377 $0.2158 POL <0.01% $7.24 0.0281 $0.2031 POL <0.01% $0.352086 0.5727 $0.2016 POL <0.01% $0.004938 39.9393 $0.1972 POL <0.01% $0.000197 959.0151 $0.1892 POL <0.01% $1.17 0.1617 $0.1891 POL <0.01% $45.5 0.00408616 $0.1859 POL <0.01% $0.007659 23.8359 $0.1825 POL <0.01% $0.997344 0.1799 $0.1794 POL <0.01% $0.74239 0.2272 $0.1686 POL <0.01% $4,322.8 0.00003767 $0.1628 POL <0.01% $6.68 0.0243 $0.1621 POL <0.01% $0.000878 180.0792 $0.158 POL <0.01% $0.39686 0.3959 $0.1571 POL <0.01% $0.239873 0.6384 $0.1531 POL <0.01% $0.270823 0.5629 $0.1524 POL <0.01% $0.000279 527.6255 $0.147 POL <0.01% $63.95 0.00216035 $0.1381 POL <0.01% $0.003439 39.441 $0.1356 POL <0.01% $0.001011 132.2431 $0.1337 POL <0.01% $0.000858 152.8534 $0.1311 POL <0.01% $0.671185 0.188 $0.1262 POL <0.01% $0.007057 17.78 $0.1254 POL <0.01% $1 0.1194 $0.1194 POL <0.01% $0.010844 10.7203 $0.1162 POL <0.01% $0.042903 2.693 $0.1155 POL <0.01% $0.00691 15.6854 $0.1083 POL <0.01% $0.003746 28.8296 $0.1079 POL <0.01% $0.013057 7.9881 $0.1042 ETH 21.35% $3,987.67 5.6589 $22,565.82 ETH 0.73% <$0.000001 5,401,179,268.262 $773.94 ETH 0.46% $0.000001 442,539,935.3562 $491.22 ETH 0.45% $1 474.7268 $475.2 ETH 0.35% $0.000038 9,665,033.9626 $371.12 ETH 0.35% $0.001971 187,205.5926 $368.94 ETH 0.34% $0.000023 15,519,533.2841 $361.29 ETH 0.33% $3,982.56 0.0875 $348.41 ETH 0.28% $106,194 0.00278945 $296.22 ETH 0.28% $2.18 135.1918 $294.72 ETH 0.27% $378.1 0.7527 $284.58 ETH 0.25% <$0.000001 3,536,660,490.0411 $267.81 ETH 0.24% $3,987.67 0.0646 $257.58 ETH 0.23% $1.76 140.9572 $248.08 ETH 0.23% $0.852245 283.1584 $241.32 ETH 0.23% $2.15 110.6782 $238.38 ETH 0.22% $0.00464 49,002.0269 $227.36 ETH 0.21% $0.000011 19,852,442.0844 $224.81 ETH 0.20% $0.006838 30,722.7863 $210.07 ETH 0.19% $1 200.5825 $200.78 ETH 0.19% $0.784719 255.567 $200.55 ETH 0.18% $0.00011 1,738,141.6803 $191.06 ETH 0.18% $0.000036 5,344,004.4626 $190.51 ETH 0.17% $8.33 22.0018 $183.36 ETH 0.17% $530.74 0.3347 $177.63 ETH 0.16% $0.152385 1,080.1709 $164.6 ETH 0.15% $0.088005 1,765.156 $155.34 ETH 0.15% $0.04096 3,773.5066 $154.56 ETH 0.14% $1.13 134.6123 $152.77 ETH 0.14% $0.668185 224.6639 $150.12 ETH 0.14% $213.56 0.6785 $144.91 ETH 0.13% $1.08 123.958 $133.53 ETH 0.12% <$0.000001 2,879,487,451.5181 $131.55 ETH 0.12% $0.553088 237.2447 $131.22 ETH 0.12% $0.000027 4,866,340.8143 $131.15 ETH 0.12% $3,979.03 0.0322 $127.97 ETH 0.12% $0.01232 10,341.1336 $127.4 ETH 0.12% $4,454.2 0.0282 $125.49 ETH 0.11% $104.47 1.1614 $121.33 ETH 0.11% $0.014416 8,265.9776 $119.16 ETH 0.11% $0.266507 442.0826 $117.82 ETH 0.11% $1.39 84.3327 $117.22 ETH 0.11% $0.050734 2,280.219 $115.68 ETH 0.11% $2 57.4087 $114.82 ETH 0.11% $1.47 76.8454 $112.98 ETH 0.10% $0.010696 10,363.2673 $110.85 ETH 0.10% $0.0431 2,479.836 $106.88 ETH 0.10% $0.199016 507.9249 $101.08 ETH 0.09% $0.789152 122.4345 $96.62 ETH 0.09% $0.485196 196.932 $95.55 ETH 0.09% $0.282389 338.1564 $95.49 ETH 0.09% $0.999672 93.9221 $93.89 ETH 0.09% $0.05281 1,769.3778 $93.44 ETH 0.09% $0.007229 12,880.0331 $93.11 ETH 0.09% <$0.000001 438,744,246.2683 $92.8 ETH 0.09% $1.19 77.7112 $92.64 ETH 0.09% $1 92.1824 $92.37 ETH 0.09% $6.68 13.8244 $92.35 ETH 0.09% $34.67 2.6339 $91.32 ETH 0.09% $0.000003 29,306,460.6854 $90.94 ETH 0.08% $0.491149 181.5293 $89.16 ETH 0.08% $133.62 0.6603 $88.23 ETH 0.08% $0.026867 3,187.5113 $85.64 ETH 0.08% $0.007126 11,783.0435 $83.97 ETH 0.08% $10.25 8.146 $83.52 ETH 0.08% $0.000128 650,137.5599 $83.45 ETH 0.08% $0.000457 182,259.2382 $83.25 ETH 0.08% $0.00988 8,341.7567 $82.41 ETH 0.08% $1.2 67.6068 $81.31 ETH 0.08% $0.355943 225.505 $80.27 ETH 0.08% $2.56 31.2229 $79.93 ETH 0.07% $0.000735 107,149.9606 $78.8 ETH 0.07% $0.059332 1,316.8854 $78.13 ETH 0.07% $0.057924 1,340.3953 $77.64 ETH 0.07% $0.073134 1,038.4996 $75.95 ETH 0.07% $0.004963 14,796.7893 $73.43 ETH 0.07% $0.000005 13,877,137.063 $71.47 ETH 0.07% $0.011645 6,119.2603 $71.26 ETH 0.07% $0.028437 2,435.0544 $69.25 ETH 0.06% $2 33.5746 $67.15 ETH 0.06% $6.81 9.8382 $67 ETH 0.06% $0.0578 1,157.3465 $66.89 ETH 0.06% $0.746608 89.4954 $66.82 ETH 0.06% <$0.000001 29,365,053,379.4436 $66.04 ETH 0.06% $0.319284 206.0137 $65.78 ETH 0.06% $0.986565 66.6557 $65.76 ETH 0.06% $0.106194 604.6911 $64.21 ETH 0.06% $1.77 36.2415 $64.15 ETH 0.06% $106,154 0.0005899 $62.62 ETH 0.06% $1 58.74 $58.86 ETH 0.06% $0.025483 2,303.6241 $58.7 ETH 0.06% <$0.000001 256,832,563.5524 $58.32 ETH 0.05% $0.998267 58.2101 $58.11 ETH 0.05% $0.177674 326.3558 $57.98 ETH 0.05% $0.588008 98.0749 $57.67 ETH 0.05% $0.000226 252,053.0886 $56.97 ETH 0.05% $385.65 0.147 $56.68 ETH 0.05% $0.000332 170,548.0878 $56.67 ETH 0.05% $0.027395 2,066.4998 $56.61 ETH 0.05% $0.007624 7,218.1056 $55.03 ETH 0.05% $0.022895 2,394.0619 $54.81 ETH 0.05% $48.98 1.1119 $54.46 ETH 0.05% $1.96 27.7726 $54.43 ETH 0.05% $2 27.011 $54.02 ETH 0.05% $0.013662 3,925.0084 $53.62 ETH 0.05% $0.25925 203.8134 $52.84 ETH 0.05% $3.37 15.638 $52.7 ETH 0.05% $6.22 8.185 $50.91 ETH 0.05% $0.000548 92,124.8907 $50.46 ETH 0.05% $1.52 33.1109 $50.33 ETH 0.05% $0.034485 1,439.866 $49.65 ETH 0.05% $0.000029 1,702,868.9229 $49.08 ETH 0.05% $7.41 6.586 $48.78 ETH 0.05% $0.082676 583.6904 $48.26 ETH 0.05% $0.000275 173,923.2628 $47.77 ETH 0.04% $0.196073 238.9692 $46.86 ETH 0.04% $0.000205 227,927.9022 $46.72 ETH 0.04% $56.92 0.8146 $46.37 ETH 0.04% $0.252362 181.9726 $45.92 ETH 0.04% $2.07 21.9021 $45.34 ETH 0.04% $0.030982 1,421.8115 $44.05 ETH 0.04% $0.212248 206.4084 $43.81 ETH 0.04% $162.42 0.2671 $43.38 ETH 0.04% $0.27356 157.8742 $43.19 ETH 0.04% $31.49 1.3692 $43.12 ETH 0.04% $0.990487 43.4287 $43.02 ETH 0.04% $0.342703 124.9454 $42.82 ETH 0.04% $0.133907 317.8185 $42.56 ETH 0.04% $28.89 1.4614 $42.22 ETH 0.04% $0.000863 48,361.8016 $41.74 ETH 0.04% $0.987691 42.0492 $41.53 ETH 0.04% $0.997009 41.4824 $41.36 ETH 0.04% $0.004611 8,938.0824 $41.22 ETH 0.04% $0.137109 298.6338 $40.95 ETH 0.04% $0.237939 169.6832 $40.37 ETH 0.04% $6.05 6.6633 $40.31 ETH 0.04% $6.19 6.3783 $39.46 ETH 0.04% <$0.000001 19,788,278,948,680.582 $39.26 ETH 0.04% $0.74369 52.4851 $39.03 ETH 0.04% $0.166474 233.3116 $38.84 ETH 0.04% $1 38.3653 $38.42 ETH 0.04% $0.903842 42.077 $38.03 ETH 0.04% $0.044719 835.32 $37.35 ETH 0.04% $3.4 10.9232 $37.14 ETH 0.03% $0.485306 75.2149 $36.5 ETH 0.03% $3.45 10.2536 $35.38 ETH 0.03% $0.998155 35.3958 $35.33 ETH 0.03% $99.01 0.3538 $35.03 ETH 0.03% $0.649338 53.795 $34.93 ETH 0.03% $20.77 1.6683 $34.65 ETH 0.03% $0.587178 57.5085 $33.77 ETH 0.03% $1.7 19.2738 $32.77 ETH 0.03% <$0.000001 76,630,570.7736 $32.51 ETH 0.03% $0.005396 6,023.1541 $32.5 ETH 0.03% <$0.000001 191,621,136.4947 $32.4 ETH 0.03% $0.013881 2,275.2061 $31.58 ETH 0.03% $0.00001 3,122,679.2337 $31.45 ETH 0.03% $0.018499 1,698.0249 $31.41 ETH 0.03% $3.23 9.5938 $30.99 ETH 0.03% $0.70461 43.5864 $30.71 ETH 0.03% $0.094525 324.5082 $30.67 ETH 0.03% $0.47817 63.7898 $30.5 ETH 0.03% $0.601131 50.6178 $30.43 ETH 0.03% $103,591 0.00029133 $30.18 ETH 0.03% $0.349358 84.4759 $29.51 ETH 0.03% $290.74 0.0983 $28.58 ETH 0.03% $1 27.5503 $27.61 ETH 0.03% $4.71 5.8415 $27.51 ETH 0.03% $19.39 1.4174 $27.48 ETH 0.03% $0.001295 20,960.4826 $27.14 ETH 0.03% $0.467701 57.8357 $27.05 ETH 0.03% $0.875402 30.3726 $26.59 ETH 0.02% $0.000001 33,150,718.4543 $26.2 ETH 0.02% $0.058669 446.5265 $26.2 ETH 0.02% $0.045402 574.1337 $26.07 ETH 0.02% $0.371576 70.0659 $26.03 ETH 0.02% $0.993698 26.1214 $25.96 ETH 0.02% $4,100.37 0.00617285 $25.31 ETH 0.02% $0.281321 89.0164 $25.04 ETH 0.02% $361.76 0.068 $24.61 ETH 0.02% $1.05 23.2988 $24.56 ETH 0.02% $0.723634 33.8636 $24.5 ETH 0.02% $20.32 1.2031 $24.45 ETH 0.02% $294.51 0.0822 $24.2 ETH 0.02% $0.162397 148.0447 $24.04 ETH 0.02% $0.674843 34.9457 $23.58 ETH 0.02% $5.85 4.0095 $23.46 ETH 0.02% $0.590387 39.5177 $23.33 ETH 0.02% <$0.000001 2,225,081,330.5233 $23.09 ETH 0.02% $1.26 17.6511 $22.24 ETH 0.02% $48.87 0.4499 $21.98 ETH 0.02% $0.000943 22,784.7371 $21.48 ETH 0.02% $0.01458 1,441.9835 $21.02 ETH 0.02% $4.77 4.3538 $20.77 ETH 0.02% $4,159.1 0.0049837 $20.73 ETH 0.02% $0.00209 9,782.5052 $20.44 ETH 0.02% $1 20.3584 $20.42 ETH 0.02% <$0.000001 46,763,040.8487 $20.28 ETH 0.02% <$0.000001 675,539,864,954,565.88 $19.74 ETH 0.02% $16.04 1.2128 $19.45 ETH 0.02% $0.032072 606 $19.44 ETH 0.02% $1 19.3663 $19.39 ETH 0.02% $2.99 6.4631 $19.32 ETH 0.02% $22.7 0.8334 $18.92 ETH 0.02% $0.274379 68.0482 $18.67 ETH 0.02% $1.2 15.5086 $18.61 ETH 0.02% $0.003007 6,100.6002 $18.35 ETH 0.02% $0.728755 25.1323 $18.32 ETH 0.02% $2.41 7.4616 $17.98 ETH 0.02% $0.01441 1,232.7902 $17.76 ETH 0.02% $0.057272 302.7808 $17.34 ETH 0.02% $0.629089 27.532 $17.32 ETH 0.02% $0.000001 12,446,274.5121 $17.18 ETH 0.02% $0.000729 22,923.757 $16.71 ETH 0.02% $0.052506 316.2181 $16.6 ETH 0.02% $0.26893 60.2828 $16.21 ETH 0.02% $0.027395 580.1064 $15.89 ETH 0.01% $0.318365 49.1818 $15.66 ETH 0.01% $0.046186 332.8391 $15.37 ETH 0.01% $0.005508 2,788.8931 $15.36 ETH 0.01% $6.57 2.3134 $15.2 ETH 0.01% $0.046342 327.4796 $15.18 ETH 0.01% $1.14 13.2661 $15.12 ETH 0.01% <$0.000001 590,349,532.8158 $15.05 ETH 0.01% $0.000041 366,808.3237 $15.02 ETH 0.01% $171.59 0.0866 $14.86 ETH 0.01% $106,489 0.00013895 $14.8 ETH 0.01% $0.023842 618.2866 $14.74 ETH 0.01% $1.45 10.111 $14.66 ETH 0.01% $0.25932 56.4798 $14.65 ETH 0.01% $0.000003 4,890,772.1631 $14.62 ETH 0.01% $0.001369 10,649.3344 $14.58 ETH 0.01% $28.15 0.5138 $14.46 ETH 0.01% $0.000224 64,279.4919 $14.41 ETH 0.01% $1.77 8.1137 $14.38 ETH 0.01% $28.01 0.5083 $14.24 ETH 0.01% $0.160475 88.0906 $14.14 ETH 0.01% $172.77 0.0817 $14.11 ETH 0.01% $0.00107 13,070.1068 $13.99 ETH 0.01% $2.79 4.9918 $13.93 ETH 0.01% $0.153959 90.0651 $13.87 ETH 0.01% $16.04 0.848 $13.6 ETH 0.01% <$0.000001 1,746,453,593.8417 $13.54 ETH 0.01% $0.01183 1,131.0471 $13.38 ETH 0.01% $0.23782 56.1438 $13.35 ETH 0.01% $0.001267 10,304.3884 $13.06 ETH 0.01% $1.69 7.6901 $13 ETH 0.01% $0.000241 53,876.3684 $12.99 ETH 0.01% $0.006318 2,039.0074 $12.88 ETH 0.01% $0.030306 420.7588 $12.75 ETH 0.01% $0.14626 86.8103 $12.7 ETH 0.01% $4,066.61 0.00307632 $12.51 ETH 0.01% $0.007055 1,750.23 $12.35 ETH 0.01% $0.006881 1,788.0681 $12.3 ETH 0.01% $0.052327 230.5309 $12.06 ETH 0.01% $0.094531 127.0834 $12.01 ETH 0.01% $0.070853 169.06 $11.98 ETH 0.01% $9.81 1.2166 $11.94 ETH 0.01% $0.001252 9,455.2348 $11.83 ETH 0.01% $0.994987 11.7804 $11.72 ETH 0.01% $0.061503 190.4067 $11.71 ETH 0.01% $4,197.48 0.00274623 $11.53 ETH 0.01% $0.593178 19.3197 $11.46 ETH 0.01% $5,514.55 0.0020767 $11.45 ETH 0.01% $1.13 9.6881 $10.95 ETH 0.01% <$0.000001 3,059,713,101,797.9541 $10.89 ETH 0.01% $0.003942 2,759.0578 $10.87 ETH 0.01% $0.047267 228.7108 $10.81 ETH 0.01% $0.000163 64,898.1727 $10.58 ETH <0.01% $0.502943 20.6588 $10.39 ETH <0.01% $0.165744 61.4303 $10.18 ETH <0.01% $0.041647 243.2772 $10.13 ETH <0.01% $9.42 1.0621 $10.01 ETH <0.01% $0.042401 232.0914 $9.84 ETH <0.01% $3.7 2.6547 $9.83 ETH <0.01% $0.035359 277.3175 $9.81 ETH <0.01% $2.2 4.3944 $9.67 ETH <0.01% $0.006666 1,437.8784 $9.59 ETH <0.01% $0.621537 15.1914 $9.44 ETH <0.01% $0.4934 19.0108 $9.38 ETH <0.01% $0.712747 13.087 $9.33 ETH <0.01% $0.596545 15.5721 $9.29 ETH <0.01% $1.43 6.4825 $9.27 ETH <0.01% $0.015956 577.3614 $9.21 ETH <0.01% $0.01581 581.7548 $9.2 ETH <0.01% $0.159522 57.649 $9.2 ETH <0.01% $0.877374 10.277 $9.02 ETH <0.01% $0.001757 5,095.3493 $8.95 ETH <0.01% $0.206523 42.7643 $8.83 ETH <0.01% $0.166838 51.528 $8.6 ETH <0.01% $0.134938 63.1026 $8.51 ETH <0.01% $0.032286 263.0568 $8.49 ETH <0.01% $0.059295 142.3491 $8.44 ETH <0.01% $3.47 2.431 $8.43 ETH <0.01% $0.329572 24.4408 $8.05 ETH <0.01% $0.035479 227.0062 $8.05 ETH <0.01% $0.000548 14,567.2271 $7.98 ETH <0.01% $0.000002 4,653,994.2576 $7.87 ETH <0.01% $1.31 6.0017 $7.86 ETH <0.01% $0.00008 97,547.7043 $7.84 ETH <0.01% $4,103.86 0.0019078 $7.83 ETH <0.01% $0.232691 33.6261 $7.82 ETH <0.01% $1.32 5.911 $7.8 ETH <0.01% $3,973.89 0.00196207 $7.8 ETH <0.01% $0.001764 4,389.3822 $7.74 ETH <0.01% $0.000625 12,263.4565 $7.67 ETH <0.01% $9.4 0.8102 $7.62 ETH <0.01% $0.425125 17.7357 $7.54 ETH <0.01% $0.14647 51.3821 $7.53 ETH <0.01% $2.41 3.1096 $7.49 ETH <0.01% $14.66 0.5107 $7.49 ETH <0.01% $4,186.95 0.00176357 $7.38 ETH <0.01% $1.02 7.2429 $7.37 ETH <0.01% $0.000008 925,087.9153 $7.33 ETH <0.01% $0.004726 1,547.3848 $7.31 ETH <0.01% $2.83 2.5612 $7.25 ETH <0.01% $65.72 0.1092 $7.18 ETH <0.01% $0.000004 1,803,208.1748 $7.15 ETH <0.01% $0.611089 11.6755 $7.13 ETH <0.01% $0.001012 7,022.3688 $7.1 ETH <0.01% $0.000222 31,955.3806 $7.08 ETH <0.01% <$0.000001 114,919,665.7427 $7 ETH <0.01% $1.7 4.1011 $6.96 ETH <0.01% $0.195081 35.654 $6.96 ETH <0.01% $0.028672 239.8889 $6.88 ETH <0.01% $1.7 4.0414 $6.87 ETH <0.01% $2.83 2.4136 $6.83 ETH <0.01% $0.002107 3,227.0841 $6.8 ETH <0.01% $0.00574 1,154.7475 $6.63 ETH <0.01% $0.092419 69.6736 $6.44 ETH <0.01% $0.74216 8.6216 $6.4 ETH <0.01% $0.000001 5,555,368.1287 $6.4 ETH <0.01% $0.001884 3,350.2236 $6.31 ETH <0.01% $1 6.2871 $6.29 ETH <0.01% $0.054638 112.9708 $6.17 ETH <0.01% $0.000287 21,374.9262 $6.14 ETH <0.01% <$0.000001 1,782,477,115.5742 $6.12 ETH <0.01% $0.000003 2,304,139.2201 $6.11 ETH <0.01% $3.89 1.5452 $6.01 ETH <0.01% $0.003584 1,657.5239 $5.94 ETH <0.01% $0.139891 42.1687 $5.9 ETH <0.01% $0.000673 8,752.758 $5.89 ETH <0.01% $2.38 2.4327 $5.79 ETH <0.01% $0.000044 131,425.2082 $5.79 ETH <0.01% $0.013806 418.2783 $5.77 ETH <0.01% <$0.000001 72,344,183.5156 $5.46 ETH <0.01% $0.000042 128,251.9601 $5.44 ETH <0.01% <$0.000001 39,392,908.1072 $5.42 ETH <0.01% $0.117142 46.0524 $5.39 ETH <0.01% $1.81 2.926 $5.31 ETH <0.01% $1.01 5.1972 $5.24 ETH <0.01% $1.55 3.367 $5.22 ETH <0.01% $0.221063 23.5028 $5.2 ETH <0.01% $0.376371 13.7128 $5.16 ETH <0.01% <$0.000001 306,453,755.5695 $5.14 ETH <0.01% $0.03271 156.2529 $5.11 ETH <0.01% $0.033159 150.6853 $5 ETH <0.01% $10.01 0.4945 $4.95 ETH <0.01% $0.197398 24.4173 $4.82 ETH <0.01% $0.077834 61.5855 $4.79 ETH <0.01% $0.475667 10.0243 $4.77 ETH <0.01% $10,667.65 0.0004446 $4.74 ETH <0.01% $0.041218 114.4681 $4.72 ETH <0.01% $602.55 0.00779326 $4.7 ETH <0.01% $0.646084 7.152 $4.62 ETH <0.01% $0.000004 1,119,665.2925 $4.58 ETH <0.01% $0.002097 2,180.9871 $4.57 ETH <0.01% $12.89 0.3527 $4.55 ETH <0.01% $0.386282 11.7029 $4.52 ETH <0.01% $0.257139 17.1313 $4.41 ETH <0.01% $0.002391 1,818.364 $4.35 ETH <0.01% $0.14169 30.4945 $4.32 ETH <0.01% $0.113206 37.9945 $4.3 ETH <0.01% $1 4.2344 $4.24 ETH <0.01% $0.029854 139.7867 $4.17 ETH <0.01% $0.03973 104.6883 $4.16 ETH <0.01% $1.98 2.0962 $4.16 ETH <0.01% $0.96845 4.2802 $4.15 ETH <0.01% $0.602906 6.755 $4.07 ETH <0.01% $190.29 0.0212 $4.04 ETH <0.01% $0.095354 42.3414 $4.04 ETH <0.01% $0.588288 6.8314 $4.02 ETH <0.01% <$0.000001 947,013,641.782 $4.01 ETH <0.01% $0.254347 15.6119 $3.97 ETH <0.01% $3.91 1 $3.91 ETH <0.01% $7.47 0.5195 $3.88 ETH <0.01% $124.67 0.0311 $3.88 ETH <0.01% $1,875.78 0.0020611 $3.87 ETH <0.01% $0.212979 18.0828 $3.85 ETH <0.01% $0.344458 11.1383 $3.84 ETH <0.01% $45 0.0849 $3.82 ETH <0.01% $0.053485 71.0523 $3.8 ETH <0.01% $1.03 3.6481 $3.76 ETH <0.01% $0.018014 206.2938 $3.72 ETH <0.01% $28.53 0.1288 $3.67 ETH <0.01% $0.000001 5,894,503.4739 $3.65 ETH <0.01% $0.99967 3.5065 $3.51 ETH <0.01% $3.04 1.1521 $3.5 ETH <0.01% $0.077418 44.5841 $3.45 ETH <0.01% $0.016285 210.7614 $3.43 ETH <0.01% $0.003845 879.6705 $3.38 ETH <0.01% $0.001286 2,622.1585 $3.37 ETH <0.01% $1.05 3.1677 $3.34 ETH <0.01% $0.270567 12.3145 $3.33 ETH <0.01% $287.42 0.0115 $3.31 ETH <0.01% $0.000452 7,133.8405 $3.22 ETH <0.01% $0.912708 3.5245 $3.22 ETH <0.01% <$0.000001 14,689,022.1812 $3.21 ETH <0.01% $0.063535 50.3554 $3.2 ETH <0.01% $0.13592 23.3004 $3.17 ETH <0.01% $0.000006 528,821.8145 $3.16 ETH <0.01% $0.641349 4.9172 $3.15 ETH <0.01% $0.000209 15,069.5764 $3.15 ETH <0.01% $2.94 1.0635 $3.13 ETH <0.01% $0.008152 380.7096 $3.1 ETH <0.01% $0.031277 98.8376 $3.09 ETH <0.01% $1.04 2.9668 $3.07 ETH <0.01% <$0.000001 177,451,924.9151 $3.07 ETH <0.01% $2.92 1.0462 $3.05 ETH <0.01% $0.423284 7.1709 $3.04 ETH <0.01% $0.035124 84.1199 $2.95 ETH <0.01% $0.049391 59.3493 $2.93 ETH <0.01% $0.023208 125.1437 $2.9 ETH <0.01% $0.034795 82.1292 $2.86 ETH <0.01% $0.014259 199.9183 $2.85 ETH <0.01% $3,988.21 0.0007088 $2.83 ETH <0.01% $1.72 1.6425 $2.83 ETH <0.01% $0.002887 953.0372 $2.75 ETH <0.01% $0.000003 1,057,625.2466 $2.75 ETH <0.01% $0.299957 9.0031 $2.7 ETH <0.01% $3.36 0.7985 $2.68 ETH <0.01% $0.001731 1,549.1979 $2.68 ETH <0.01% $0.000906 2,825.2881 $2.56 ETH <0.01% $0.017823 143.1141 $2.55 ETH <0.01% $1.1 2.2575 $2.48 ETH <0.01% $2.96 0.8299 $2.46 ETH <0.01% $79.35 0.0309 $2.45 ETH <0.01% $0.089363 27.2134 $2.43 ETH <0.01% $0.002362 996.4952 $2.35 ETH <0.01% $0.039628 58.0477 $2.3 ETH <0.01% $0.002464 930.7315 $2.29 ETH <0.01% <$0.000001 111,199,657.6965 $2.2 ETH <0.01% $0.001831 1,178.3495 $2.16 ETH <0.01% <$0.000001 493,700,282.3523 $2.15 ETH <0.01% $0.025547 83.902 $2.14 ETH <0.01% $0.000001 3,357,331.5281 $2.14 ETH <0.01% $0.000007 312,515.6691 $2.12 ETH <0.01% $0.07851 26.9223 $2.11 ETH <0.01% $0.046489 45.0859 $2.1 ETH <0.01% $0.196678 10.5205 $2.07 ETH <0.01% $0.100508 20.3649 $2.05 ETH <0.01% $0.025368 80.5711 $2.04 ETH <0.01% $341,584.28 0.00000592 $2.02 ETH <0.01% $0.483202 4.0719 $1.97 ETH <0.01% $0.002601 752.4574 $1.96 ETH <0.01% $0.026406 71.1252 $1.88 ETH <0.01% $3.37 0.5434 $1.83 ETH <0.01% $0.024817 73.7551 $1.83 ETH <0.01% $0.28254 6.4649 $1.83 ETH <0.01% $0.941303 1.9249 $1.81 ETH <0.01% $0.048121 37.2695 $1.79 ETH <0.01% $0.002143 829.7789 $1.78 ETH <0.01% $0.752233 2.3559 $1.77 ETH <0.01% $0.002337 748.7586 $1.75 ETH <0.01% $0.013127 130.4348 $1.71 ETH <0.01% $0.031441 52.4182 $1.65 ETH <0.01% <$0.000001 12,012,150.5612 $1.64 ETH <0.01% $0.000754 2,121.0789 $1.6 ETH <0.01% $0.006454 246.8209 $1.59 ETH <0.01% $0.000123 12,913.2105 $1.58 ETH <0.01% $0.010979 143.3157 $1.57 ETH <0.01% $0.010769 145.1235 $1.56 ETH <0.01% $4,712.68 0.00033062 $1.56 ETH <0.01% $0.009932 155.9393 $1.55 ETH <0.01% $1 1.5452 $1.55 ETH <0.01% $0.00191 809.0455 $1.55 ETH <0.01% $854.23 0.00179845 $1.54 ETH <0.01% $0.000006 248,548.1658 $1.53 ETH <0.01% $2.53 0.6041 $1.53 ETH <0.01% $0.019169 79.1776 $1.52 ETH <0.01% $0.004474 336.0024 $1.5 ETH <0.01% $0.527039 2.8441 $1.5 ETH <0.01% $0.000001 2,489,040.6081 $1.48 ETH <0.01% $0.01774 83.2263 $1.48 ETH <0.01% $0.002527 580.8548 $1.47 ETH <0.01% $0.013038 109.8951 $1.43 ETH <0.01% $0.07929 17.9021 $1.42 ETH <0.01% $0.14215 9.5736 $1.36 ETH <0.01% $0.287203 4.7279 $1.36 ETH <0.01% $0.51908 2.5712 $1.33 ETH <0.01% $0.095474 13.8089 $1.32 ETH <0.01% $378.1 0.00347967 $1.32 ETH <0.01% $0.025823 49.2892 $1.27 ETH <0.01% $0.026458 47.4563 $1.26 ETH <0.01% $0.095431 13.1371 $1.25 ETH <0.01% $2.07 0.6048 $1.25 ETH <0.01% $0.370146 3.3794 $1.25 ETH <0.01% $0.00317 394.194 $1.25 ETH <0.01% $0.42635 2.8766 $1.23 ETH <0.01% $0.10649 11.3964 $1.21 ETH <0.01% $1.11 1.0898 $1.21 ETH <0.01% <$0.000001 630,588,898.4603 $1.18 ETH <0.01% <$0.000001 4,497,547.3425 $1.18 ETH <0.01% $0.54468 2.1378 $1.16 ETH <0.01% $0.013005 89.4805 $1.16 ETH <0.01% $0.000136 8,560.5412 $1.16 ETH <0.01% $0.03225 35.518 $1.15 ETH <0.01% $0.000977 1,171.0259 $1.14 ETH <0.01% $1.17 0.975 $1.14 ETH <0.01% $0.001428 798.0104 $1.14 ETH <0.01% $53.52 0.0212 $1.13 ETH <0.01% $0.000037 30,540.6396 $1.12 ETH <0.01% $4,414.97 0.00025321 $1.12 ETH <0.01% $0.000005 227,031.4197 $1.11 ETH <0.01% $28.71 0.0382 $1.1 ETH <0.01% $7.97 0.1355 $1.08 ETH <0.01% $0.497921 2.0966 $1.04 ETH <0.01% <$0.000001 248,054,921.4784 $1.04 ETH <0.01% $4,097.86 0.00024721 $1.01 ETH <0.01% $0.23254 4.2928 $0.9982 ETH <0.01% $0.126279 7.7678 $0.9809 ETH <0.01% $0.789458 1.2396 $0.9786 ETH <0.01% $0.080067 12.1023 $0.9689 ETH <0.01% $0.996712 0.9616 $0.9584 ETH <0.01% $0.479889 1.9358 $0.9289 ETH <0.01% $1.96 0.4734 $0.9278 ETH <0.01% $12.71 0.0729 $0.9266 ETH <0.01% $0.000989 936.8754 $0.9261 ETH <0.01% $0.032933 27.9033 $0.9189 ETH <0.01% $0.000001 1,649,246.3181 $0.9132 ETH <0.01% $0.477547 1.8651 $0.8906 ETH <0.01% $0.004935 175.6487 $0.8669 ETH <0.01% $0.000835 1,037.8208 $0.8661 ETH <0.01% $0.091897 9.3243 $0.8568 ETH <0.01% $0.002816 298.5846 $0.8408 ETH <0.01% $0.162206 5.1736 $0.8391 ETH <0.01% $0.148276 5.6287 $0.8346 ETH <0.01% $1 0.8268 $0.8274 ETH <0.01% $0.855822 0.949 $0.8121 ETH <0.01% $0.021431 37.8005 $0.8101 ETH <0.01% $0.776294 1.0368 $0.8048 ETH <0.01% $0.000001 1,163,578.0656 $0.8029 ETH <0.01% $0.005004 156.9403 $0.7853 ETH <0.01% $0.049768 15.6657 $0.7796 ETH <0.01% $0.1458 5.2482 $0.7651 ETH <0.01% $0.034663 21.7258 $0.753 ETH <0.01% $0.045079 16.685 $0.7521 ETH <0.01% $0.023279 31.6195 $0.736 ETH <0.01% $1.86 0.3948 $0.7343 ETH <0.01% $0.068269 10.6682 $0.7283 ETH <0.01% $0.000133 5,440.8298 $0.7217 ETH <0.01% $0.002482 278.3165 $0.6908 ETH <0.01% $0.000187 3,637.7349 $0.6818 ETH <0.01% $0.052064 13.0155 $0.6776 ETH <0.01% $1.37 0.4931 $0.6756 ETH <0.01% $0.155151 4.313 $0.6691 ETH <0.01% $0.000001 518,713.0576 $0.6625 ETH <0.01% $0.001889 348.137 $0.6574 ETH <0.01% <$0.000001 6,988,107.9282 $0.6542 ETH <0.01% $0.000899 725.1489 $0.6519 ETH <0.01% $4,086.06 0.00015877 $0.6487 ETH <0.01% $18.71 0.0346 $0.6473 ETH <0.01% $0.075993 8.4419 $0.6415 ETH <0.01% $0.001041 611.9285 $0.6373 ETH <0.01% $1.51 0.4181 $0.6319 ETH <0.01% $33.49 0.0186 $0.6242 ETH <0.01% $0.357277 1.7032 $0.6084 ETH <0.01% $0.001526 395.6269 $0.6038 ETH <0.01% $0.001571 382.8287 $0.6013 ETH <0.01% $0.14969 3.9855 $0.5965 ETH <0.01% $0.421313 1.4084 $0.5933 ETH <0.01% $0.050946 11.5802 $0.5899 ETH <0.01% $2.49 0.2364 $0.5895 ETH <0.01% $0.060692 9.5842 $0.5816 ETH <0.01% $0.000247 2,349.1793 $0.581 ETH <0.01% $0.13428 4.2679 $0.573 ETH <0.01% $0.117697 4.8478 $0.5705 ETH <0.01% $0.010038 56.4226 $0.5663 ETH <0.01% $0.277878 2.0293 $0.5639 ETH <0.01% $0.022808 24.6495 $0.5622 ETH <0.01% $0.000222 2,484.0098 $0.5509 ETH <0.01% $0.195892 2.7876 $0.546 ETH <0.01% $0.000834 653.6556 $0.5448 ETH <0.01% $0.699611 0.7625 $0.5334 ETH <0.01% $0.003354 156.8888 $0.5261 ETH <0.01% $0.014323 36.5416 $0.5233 ETH <0.01% $0.018264 28.6321 $0.5229 ETH <0.01% $0.002639 197.8658 $0.5222 ETH <0.01% $0.000001 673,254.1366 $0.5126 ETH <0.01% $0.455063 1.1257 $0.5122 ETH <0.01% $3,907.1 0.00012932 $0.5052 ETH <0.01% $1.6 0.3133 $0.5013 ETH <0.01% $0.004474 110.7005 $0.4952 ETH <0.01% $1.2 0.4117 $0.493 ETH <0.01% $0.041225 11.8375 $0.488 ETH <0.01% $0.000332 1,452.1221 $0.4816 ETH <0.01% $0.000696 688.6696 $0.4791 ETH <0.01% $0.005796 82.4229 $0.4777 ETH <0.01% $0.000102 4,684.2922 $0.4765 ETH <0.01% $1.22 0.3889 $0.4744 ETH <0.01% $103,365.43 0.00000458 $0.4737 ETH <0.01% $22.05 0.0214 $0.4722 ETH <0.01% $0.525402 0.8963 $0.4709 ETH <0.01% $0.000002 194,553.6858 $0.463 ETH <0.01% $0.073716 6.275 $0.4625 ETH <0.01% $0.258214 1.7422 $0.4498 ETH <0.01% $0.000001 524,481.3652 $0.4454 ETH <0.01% $0.001506 291.885 $0.4395 ETH <0.01% $0.088734 4.9054 $0.4352 ETH <0.01% $0.004461 95.6469 $0.4266 ETH <0.01% $0.000022 18,903.1579 $0.4219 ETH <0.01% $0.004326 96.1255 $0.4158 ETH <0.01% $0.619254 0.6676 $0.4134 ETH <0.01% $1 0.4125 $0.4133 ETH <0.01% $0.050112 8.2099 $0.4114 ETH <0.01% $0.029052 13.9546 $0.4054 ETH <0.01% $10.41 0.0375 $0.3903 ETH <0.01% $0.011487 33.9776 $0.3903 ETH <0.01% $0.000798 480.6754 $0.3833 ETH <0.01% $0.168398 2.2767 $0.3833 ETH <0.01% <$0.000001 1,326,837,119.0208 $0.3806 ETH <0.01% $0.001376 274.5169 $0.3776 ETH <0.01% $0.000024 15,598.844 $0.3729 ETH <0.01% $0.191938 1.9368 $0.3717 ETH <0.01% $0.005549 66.8132 $0.3707 ETH <0.01% $0.118914 3.0476 $0.3624 ETH <0.01% $21.04 0.017 $0.3582 ETH <0.01% $0.095104 3.7041 $0.3522 ETH <0.01% $0.007211 47.453 $0.3421 ETH <0.01% $4,215.78 0.00008102 $0.3415 ETH <0.01% $4,677.33 0.00007224 $0.3378 ETH <0.01% $0.001417 236.0177 $0.3343 ETH <0.01% $0.391893 0.8524 $0.334 ETH <0.01% $0.017968 18.3278 $0.3293 ETH <0.01% $0.95208 0.3348 $0.3187 ETH <0.01% $0.001203 264.718 $0.3185 ETH <0.01% $17.89 0.0177 $0.3175 ETH <0.01% $0.209014 1.5042 $0.3144 ETH <0.01% $0.158589 1.9746 $0.3131 ETH <0.01% $0.000409 754.4583 $0.3086 ETH <0.01% $0.405021 0.7556 $0.306 ETH <0.01% $0.000315 966.4404 $0.3042 ETH <0.01% $0.065287 4.6494 $0.3035 ETH <0.01% $0.020726 14.6247 $0.3031 ETH <0.01% $0.000186 1,598.464 $0.2976 ETH <0.01% $8.87 0.0333 $0.295 ETH <0.01% $0.837213 0.3524 $0.295 ETH <0.01% $22,685 0.00001298 $0.2944 ETH <0.01% $0.101146 2.91 $0.2943 ETH <0.01% $0.037622 7.7907 $0.2931 ETH <0.01% $0.012699 22.8356 $0.2899 ETH <0.01% $0.030708 9.269 $0.2846 ETH <0.01% $0.00607 46.7992 $0.284 ETH <0.01% <$0.000001 2,135,234.1959 $0.2758 ETH <0.01% $28.87 0.0095518 $0.2757 ETH <0.01% $0.843666 0.3208 $0.2706 ETH <0.01% <$0.000001 2,406,167.7918 $0.2703 ETH <0.01% $0.000001 184,188.0867 $0.2689 ETH <0.01% $0.000809 328.607 $0.2657 ETH <0.01% $1.17 0.2248 $0.263 ETH <0.01% $0.628068 0.4184 $0.2627 ETH <0.01% $0.019988 12.8731 $0.2573 ETH <0.01% $0.053867 4.5411 $0.2446 ETH <0.01% $0.000462 528.4427 $0.244 ETH <0.01% $0.106228 2.2831 $0.2425 ETH <0.01% $0.000199 1,212.5275 $0.2412 ETH <0.01% $0.266056 0.9056 $0.2409 ETH <0.01% $0.000002 137,474.4491 $0.2389 ETH <0.01% $0.000012 20,198.923 $0.237 ETH <0.01% $0.001586 149.2719 $0.2366 ETH <0.01% $0.025945 9.1135 $0.2364 ETH <0.01% $2.29 0.1027 $0.2354 ETH <0.01% $63.95 0.00367144 $0.2347 ETH <0.01% $0.005273 43.2609 $0.2281 ETH <0.01% $0.000031 7,298.6229 $0.2246 ETH <0.01% $0.001754 126.8915 $0.2226 ETH <0.01% $0.001865 119.133 $0.2222 ETH <0.01% $0.009749 22.53 $0.2196 ETH <0.01% $0.000154 1,424.982 $0.2195 ETH <0.01% $0.000005 43,733.0041 $0.2173 ETH <0.01% $0.002502 86.095 $0.2153 ETH <0.01% $0.004082 52.3997 $0.2139 ETH <0.01% $1.27 0.1677 $0.2129 ETH <0.01% <$0.000001 511,871.437 $0.2127 ETH <0.01% $0.004101 51.6526 $0.2118 ETH <0.01% $0.547219 0.387 $0.2117 ETH <0.01% $0.008268 25.3828 $0.2098 ETH <0.01% $0.139977 1.493 $0.2089 ETH <0.01% $0.000001 161,734.1466 $0.2054 ETH <0.01% $0.08609 2.3849 $0.2053 ETH <0.01% $0.000696 292.4141 $0.2036 ETH <0.01% $0.981581 0.2035 $0.1997 ETH <0.01% <$0.000001 5,302,145.127 $0.1993 ETH <0.01% $0.000422 470.6699 $0.1985 ETH <0.01% $0.000751 260.7143 $0.1958 ETH <0.01% <$0.000001 1,480,336.7126 $0.1953 ETH <0.01% $0.728521 0.2673 $0.1947 ETH <0.01% <$0.000001 424,662.3349 $0.1922 ETH <0.01% $0.079187 2.3922 $0.1894 ETH <0.01% $0.090307 2.0901 $0.1887 ETH <0.01% $0.055818 3.1474 $0.1756 ETH <0.01% $1.01 0.1685 $0.1693 ETH <0.01% $31.14 0.00533573 $0.1661 ETH <0.01% $0.310944 0.5227 $0.1625 ETH <0.01% $0.177987 0.903 $0.1607 ETH <0.01% $0.000788 203.58 $0.1605 ETH <0.01% $0.054873 2.923 $0.1603 ETH <0.01% $0.002311 69.3411 $0.1602 ETH <0.01% $0.030756 5.1913 $0.1596 ETH <0.01% $0.001725 90.9417 $0.1569 ETH <0.01% <$0.000001 341,200.4421 $0.1556 ETH <0.01% $0.000634 240.2742 $0.1523 ETH <0.01% $0.792602 0.1907 $0.1511 ETH <0.01% $0.175141 0.8609 $0.1507 ETH <0.01% $0.634592 0.2365 $0.15 ETH <0.01% $0.000781 191.0963 $0.1492 ETH <0.01% $0.023164 6.4426 $0.1492 ETH <0.01% $0.374967 0.3925 $0.1471 ETH <0.01% $0.971473 0.1481 $0.1438 ETH <0.01% $0.015957 8.8997 $0.142 ETH <0.01% <$0.000001 10,799,484.6419 $0.1414 ETH <0.01% $0.122533 1.1372 $0.1393 ETH <0.01% $1.14 0.1193 $0.1359 ETH <0.01% $16.5 0.00813314 $0.1341 ETH <0.01% $0.006541 20.5145 $0.1341 ETH <0.01% $733.67 0.00018235 $0.1337 ETH <0.01% $0.007553 17.6716 $0.1334 ETH <0.01% $0.000027 4,976.9368 $0.1334 ETH <0.01% $0.000082 1,608.4286 $0.1311 ETH <0.01% $0.003487 37.4597 $0.1306 ETH <0.01% <$0.000001 4,133,418.1861 $0.1305 ETH <0.01% $0.440476 0.2952 $0.13 ETH <0.01% $0.030947 4.1381 $0.128 ETH <0.01% $0.021433 5.967 $0.1278 ETH <0.01% $0.01721 7.3801 $0.127 ETH <0.01% $0.107186 1.1724 $0.1256 ETH <0.01% $0.274648 0.4566 $0.1254 ETH <0.01% $0.751277 0.1654 $0.1242 ETH <0.01% <$0.000001 22,822,349.1178 $0.1208 ETH <0.01% $0.007163 16.6495 $0.1192 ETH <0.01% $0.359288 0.3244 $0.1165 ETH <0.01% $1.05 0.1102 $0.1161 ETH <0.01% $1.24 0.0923 $0.1144 ETH <0.01% $0.011023 10.3727 $0.1143 ETH <0.01% $0.007221 15.473 $0.1117 ETH <0.01% $0.010564 10.5559 $0.1115 ETH <0.01% $0.001466 75.7887 $0.1111 ETH <0.01% $0.006129 17.8287 $0.1092 ETH <0.01% $0.001144 94.6057 $0.1082 ETH <0.01% $0.030304 3.5156 $0.1065 ETH <0.01% $0.000001 119,080.4694 $0.1057 ETH <0.01% $1.38 0.0736 $0.1015 FTM 2.61% <$0.000001 10,474,850,417.7579 $2,758.03 FTM 0.09% $1.39 67.2223 $93.52 FTM 0.07% $1.39 55.0423 $76.51 FTM 0.05% $1.88 29.3026 $55.09 FTM 0.05% $1 52.1916 $52.24 FTM 0.03% $105,983 0.00034453 $36.51 FTM 0.03% $1 27.6713 $27.67 FTM 0.02% $0.704096 24.4804 $17.24 FTM 0.02% $0.597727 28.8041 $17.22 FTM 0.02% $1.57 10.2533 $16.1 FTM 0.01% $0.004201 2,813.0074 $11.82 FTM 0.01% $0.04476 251.6311 $11.26 FTM 0.01% $28.67 0.3793 $10.87 FTM 0.01% $0.023391 454.276 $10.63 FTM 0.01% $0.062097 170.5376 $10.59 FTM <0.01% $868.92 0.00969902 $8.43 FTM <0.01% $1.2 5.063 $6.08 FTM <0.01% $0.000062 92,802.5921 $5.75 FTM <0.01% $35.92 0.1396 $5.01 FTM <0.01% $0.343298 14.5558 $5 FTM <0.01% $379.96 0.0107 $4.08 FTM <0.01% $0.081031 46.5197 $3.77 FTM <0.01% $3,989.2 0.00091841 $3.66 FTM <0.01% $0.997344 3.145 $3.14 FTM <0.01% $105,983 0.00002943 $3.12 FTM <0.01% $3,989.2 0.00071624 $2.86 FTM <0.01% $0.001778 1,495.3248 $2.66 FTM <0.01% $1.35 1.9293 $2.6 FTM <0.01% $1 2.3555 $2.36 FTM <0.01% $49.32 0.0418 $2.06 FTM <0.01% $10,688.39 0.000188 $2.01 FTM <0.01% $398.9 0.0044954 $1.79 FTM <0.01% $1.04 1.6683 $1.73 FTM <0.01% <$0.000001 8,293,333,240.6498 $1.66 FTM <0.01% $1 1.6244 $1.63 FTM <0.01% $0.029415 53.9097 $1.59 FTM <0.01% $2.01 0.7516 $1.51 FTM <0.01% $0.589896 2.2999 $1.36 FTM <0.01% $0.244718 5.0361 $1.23 FTM <0.01% $0.024564 49.8677 $1.22 FTM <0.01% $0.000696 1,743.4158 $1.21 FTM <0.01% $0.00001 103,306.9923 $1.04 FTM <0.01% $0.823546 1.0802 $0.8895 FTM <0.01% $0.000421 1,884.03 $0.7927 FTM <0.01% $1 0.7149 $0.7156 FTM <0.01% $0.051912 13.2478 $0.6877 FTM <0.01% <$0.000001 2,235,089.0467 $0.6374 FTM <0.01% $0.004838 83.193 $0.4025 FTM <0.01% $0.996668 0.3505 $0.3493 FTM <0.01% $0.000299 1,050.3667 $0.3139 FTM <0.01% $0.000937 283.4851 $0.2656 FTM <0.01% $0.004606 56.5254 $0.2603 FTM <0.01% <$0.000001 2,422,617,645.7901 $0.2422 FTM <0.01% $0.034983 6.1166 $0.2139 FTM <0.01% $100,757 0.000002 $0.2015 FTM <0.01% $0.003455 56.1993 $0.1941 FTM <0.01% $0.011096 16.0832 $0.1784 FTM <0.01% <$0.000001 711,200,761.3909 $0.1422 FTM <0.01% $0.724946 0.1924 $0.1394 FTM <0.01% $0.006309 20.9676 $0.1322 FTM <0.01% $4.17 0.0301 $0.1256 FTM <0.01% $0.005953 20.9616 $0.1247 FTM <0.01% $0.011889 9.394 $0.1116 BSC 0.38% $0.009053 44,067.2239 $398.92 BSC 0.09% $1 99.3518 $99.45 BSC 0.09% $717.97 0.1342 $96.37 BSC 0.05% $0.08121 661.9905 $53.76 BSC 0.05% $0.01187 4,491.5426 $53.31 BSC 0.04% $1.72 26.4171 $45.44 BSC 0.04% $3,981.64 0.0113 $44.87 BSC 0.04% $0.000027 1,397,141.4777 $37.62 BSC 0.03% $0.001687 20,728.5038 $34.97 BSC 0.03% $0.38647 89.4512 $34.57 BSC 0.03% $718.3 0.0448 $32.18 BSC 0.03% $0.11088 265.3247 $29.42 BSC 0.03% $1.75 16.2866 $28.5 BSC 0.03% $1 27.8065 $27.85 BSC 0.03% $0.0441 599.4531 $26.44 BSC 0.02% $4.18 4.8751 $20.38 BSC 0.02% $0.494659 40.3483 $19.96 BSC 0.02% <$0.000001 434,731,140.8547 $19.84 BSC 0.02% $0.000023 813,190.5995 $18.93 BSC 0.02% $0.007244 2,550.9557 $18.48 BSC 0.02% $0.032284 538.867 $17.4 BSC 0.02% $3.92 4.3915 $17.21 BSC 0.02% $104.53 0.1634 $17.08 BSC 0.02% $0.41547 38.488 $15.99 BSC 0.02% $0.000247 64,285.0785 $15.89 BSC 0.01% $0.164743 95.5603 $15.74 BSC 0.01% <$0.000001 54,992,252.8852 $14.47 BSC 0.01% $8.72 1.6279 $14.19 BSC 0.01% $0.083286 148.8652 $12.4 BSC 0.01% $0.255621 47.8238 $12.22 BSC 0.01% $0.903736 12.3696 $11.18 BSC 0.01% $10.41 1.0722 $11.16 BSC 0.01% $0.00001 1,078,952.2848 $10.88 BSC <0.01% $0.101551 102.5601 $10.42 BSC <0.01% $0.245662 41.9419 $10.3 BSC <0.01% $0.001462 6,854.1421 $10.02 BSC <0.01% $0.010762 927.4963 $9.98 BSC <0.01% $0.010975 878.2988 $9.64 BSC <0.01% $0.000001 15,901,774.8828 $9.46 BSC <0.01% $0.057962 156.5093 $9.07 BSC <0.01% $106,128.24 0.00008426 $8.94 BSC <0.01% $0.054896 161.5591 $8.87 BSC <0.01% $16.02 0.5465 $8.75 BSC <0.01% $0.000456 18,469.0408 $8.42 BSC <0.01% $0.02295 360.0658 $8.26 BSC <0.01% $0.033633 244.2679 $8.22 BSC <0.01% $0.045262 181.1296 $8.2 BSC <0.01% $40.88 0.2001 $8.18 BSC <0.01% $0.34436 23.7108 $8.17 BSC <0.01% $0.016792 482.4427 $8.1 BSC <0.01% $0.175585 45.8268 $8.05 BSC <0.01% $6.22 1.2647 $7.87 BSC <0.01% $28.01 0.2758 $7.72 BSC <0.01% $0.999872 7.3286 $7.33 BSC <0.01% $1.03 7.1055 $7.3 BSC <0.01% $0.048321 147.8895 $7.15 BSC <0.01% $1.3 5.4717 $7.13 BSC <0.01% $0.169749 41.0211 $6.96 BSC <0.01% $0.375495 17.8067 $6.69 BSC <0.01% $0.308883 21.4174 $6.62 BSC <0.01% $0.000374 17,510.5534 $6.56 BSC <0.01% $0.01458 441.4493 $6.44 BSC <0.01% <$0.000001 161,680,462.3099 $6.28 BSC <0.01% $0.004921 1,246.8231 $6.14 BSC <0.01% $0.020012 302.5945 $6.06 BSC <0.01% $0.181881 32.9668 $6 BSC <0.01% $0.00086 6,969.7612 $5.99 BSC <0.01% $0.008591 673.033 $5.78 BSC <0.01% $1.14 5.0223 $5.73 BSC <0.01% $2.93 1.932 $5.66 BSC <0.01% $0.522721 10.7084 $5.6 BSC <0.01% $0.156431 35.621 $5.57 BSC <0.01% $0.063594 87.2766 $5.55 BSC <0.01% $6.84 0.8045 $5.5 BSC <0.01% $0.269158 20.4276 $5.5 BSC <0.01% $0.502923 10.7319 $5.4 BSC <0.01% $2.46 2.174 $5.36 BSC <0.01% $0.000005 989,358.6989 $5.3 BSC <0.01% $0.269783 19.3669 $5.22 BSC <0.01% $1.48 3.4538 $5.11 BSC <0.01% $0.05944 84.5798 $5.03 BSC <0.01% $0.120245 41.3751 $4.98 BSC <0.01% $0.001372 3,621.9437 $4.97 BSC <0.01% $0.044668 109.9229 $4.91 BSC <0.01% $0.480226 10.1448 $4.87 BSC <0.01% $0.00571 850.8718 $4.86 BSC <0.01% $0.179779 26.7234 $4.8 BSC <0.01% $0.0077 591.6283 $4.56 BSC <0.01% $0.374752 12.0994 $4.53 BSC <0.01% $0.718924 6.1692 $4.44 BSC <0.01% $0.012744 343.8399 $4.38 BSC <0.01% $0.266293 16.3056 $4.34 BSC <0.01% $0.107281 38.0367 $4.08 BSC <0.01% $0.080544 50.1328 $4.04 BSC <0.01% $1.86 2.1738 $4.03 BSC <0.01% $1.07 3.6811 $3.94 BSC <0.01% $0.002365 1,634.8449 $3.87 BSC <0.01% $0.020293 186.8123 $3.79 BSC <0.01% $0.028569 131.7892 $3.77 BSC <0.01% $0.041368 90.0171 $3.72 BSC <0.01% $0.722129 5.1084 $3.69 BSC <0.01% $3.44 1.044 $3.59 BSC <0.01% $0.003818 923.7303 $3.53 BSC <0.01% $0.256164 13.7436 $3.52 BSC <0.01% $0.039863 87.8753 $3.5 BSC <0.01% $0.073793 47.0427 $3.47 BSC <0.01% $0.01193 283.4655 $3.38 BSC <0.01% $2 1.6529 $3.31 BSC <0.01% $0.000458 7,102.2994 $3.25 BSC <0.01% $0.00088 3,664.5214 $3.23 BSC <0.01% $0.483159 6.514 $3.15 BSC <0.01% $0.120293 25.9781 $3.12 BSC <0.01% $0.121191 25.3263 $3.07 BSC <0.01% $1.34 2.2664 $3.05 BSC <0.01% $0.002558 1,186.5287 $3.04 BSC <0.01% $0.000885 3,353.6713 $2.97 BSC <0.01% $0.026132 113.1585 $2.96 BSC <0.01% $2.49 1.154 $2.87 BSC <0.01% $0.413317 6.9184 $2.86 BSC <0.01% $0.009592 296.709 $2.85 BSC <0.01% $0.182749 15.5472 $2.84 BSC <0.01% $0.027026 104.0574 $2.81 BSC <0.01% $0.112931 24.8021 $2.8 BSC <0.01% $0.035129 78.1556 $2.75 BSC <0.01% $0.42631 6.3579 $2.71 BSC <0.01% $398.7 0.00667891 $2.66 BSC <0.01% $0.000173 14,828.2826 $2.57 BSC <0.01% $23.17 0.1102 $2.55 BSC <0.01% $0.053877 46.8269 $2.52 BSC <0.01% $0.005145 487.844 $2.51 BSC <0.01% $0.874516 2.8207 $2.47 BSC <0.01% $6.05 0.4073 $2.46 BSC <0.01% $0.195997 12.4498 $2.44 BSC <0.01% $0.041342 58.4857 $2.42 BSC <0.01% $0.000669 3,545.728 $2.37 BSC <0.01% $0.18417 12.834 $2.36 BSC <0.01% $0.009888 238.7345 $2.36 BSC <0.01% $0.481894 4.8466 $2.34 BSC <0.01% $6.48 0.3498 $2.27 BSC <0.01% $0.112325 19.835 $2.23 BSC <0.01% $1.1 2.029 $2.22 BSC <0.01% $0.043717 50.6211 $2.21 BSC <0.01% $0.014724 150.0018 $2.21 BSC <0.01% $1 2.1806 $2.18 BSC <0.01% $0.000023 95,599.0453 $2.17 BSC <0.01% $2.75 0.7886 $2.17 BSC <0.01% $1.17 1.7976 $2.1 BSC <0.01% $4,099.96 0.00050184 $2.06 BSC <0.01% <$0.000001 9,823,340.0521 $2.05 BSC <0.01% $0.000455 4,434.9616 $2.02 BSC <0.01% $1.75 1.1304 $1.98 BSC <0.01% $0.061363 31.746 $1.95 BSC <0.01% $0.368115 5.2748 $1.94 BSC <0.01% $0.000904 2,117.3603 $1.91 BSC <0.01% $3.23 0.5904 $1.91 BSC <0.01% $0.003107 610.8382 $1.9 BSC <0.01% $0.000003 680,260.2644 $1.86 BSC <0.01% $0.00906 200.6904 $1.82 BSC <0.01% $0.009911 183.1365 $1.82 BSC <0.01% $10.74 0.1667 $1.79 BSC <0.01% $0.000729 2,454.3137 $1.79 BSC <0.01% $0.000001 1,398,458.4223 $1.79 BSC <0.01% $0.559517 3.1643 $1.77 BSC <0.01% $0.000153 11,452.9482 $1.75 BSC <0.01% $0.024912 69.8358 $1.74 BSC <0.01% $0.399286 4.3489 $1.74 BSC <0.01% $0.525802 3.2979 $1.73 BSC <0.01% $0.358905 4.7727 $1.71 BSC <0.01% $0.009684 170.3057 $1.65 BSC <0.01% $0.002329 704.6853 $1.64 BSC <0.01% $18.68 0.0871 $1.63 BSC <0.01% $0.000705 2,269.2699 $1.6 BSC <0.01% $0.005613 284.4883 $1.6 BSC <0.01% $0.076009 20.6111 $1.57 BSC <0.01% $0.11503 13.3956 $1.54 BSC <0.01% $0.022787 65.9441 $1.5 BSC <0.01% $0.048211 30.364 $1.46 BSC <0.01% <$0.000001 338,943,128.0693 $1.42 BSC <0.01% $0.014464 97.9438 $1.42 BSC <0.01% $0.002602 524.1848 $1.36 BSC <0.01% $0.000037 36,658.2442 $1.34 BSC <0.01% $1 1.3018 $1.31 BSC <0.01% $0.019081 67.3872 $1.29 BSC <0.01% $0.023676 53.0985 $1.26 BSC <0.01% <$0.000001 399,321,685.4515 $1.25 BSC <0.01% $56.2 0.0222 $1.25 BSC <0.01% $0.720752 1.6853 $1.21 BSC <0.01% $0.077679 15.5752 $1.21 BSC <0.01% $0.000801 1,492.561 $1.2 BSC <0.01% $0.000547 2,150.7965 $1.18 BSC <0.01% $0.447367 2.6115 $1.17 BSC <0.01% $0.02391 47.9683 $1.15 BSC <0.01% $0.042015 26.868 $1.13 BSC <0.01% $0.343219 3.2871 $1.13 BSC <0.01% $0.001011 1,107.6995 $1.12 BSC <0.01% $0.013233 82.2162 $1.09 BSC <0.01% $0.003279 318.5083 $1.04 BSC <0.01% $1.94 0.5362 $1.04 BSC <0.01% $0.000001 1,711,912.9288 $1.02 BSC <0.01% $0.142328 7.1 $1.01 BSC <0.01% $0.000426 2,187.7352 $0.9318 BSC <0.01% $0.001845 503.023 $0.9278 BSC <0.01% $117.15 0.0075146 $0.8803 BSC <0.01% <$0.000001 1,434,428,361.0648 $0.8784 BSC <0.01% $1 0.8765 $0.8773 BSC <0.01% <$0.000001 590,690,076.6692 $0.8588 BSC <0.01% $0.000777 1,100.3392 $0.8553 BSC <0.01% <$0.000001 3,252,971,182.1604 $0.8547 BSC <0.01% $0.046159 18.4902 $0.8534 BSC <0.01% $0.012815 65.613 $0.8408 BSC <0.01% $1.46 0.576 $0.8392 BSC <0.01% $0.004805 174.3877 $0.8379 BSC <0.01% $0.273415 3.0378 $0.8305 BSC <0.01% $0.050076 16.3039 $0.8164 BSC <0.01% $0.029866 27.1649 $0.8113 BSC <0.01% $0.000372 2,160.6277 $0.8027 BSC <0.01% $0.000304 2,622.7541 $0.7975 BSC <0.01% $0.088488 8.8535 $0.7834 BSC <0.01% $0.005337 145.7341 $0.7777 BSC <0.01% $0.000012 66,288.193 $0.7742 BSC <0.01% $0.000228 3,400.5492 $0.7737 BSC <0.01% $0.006771 113.6079 $0.7691 BSC <0.01% <$0.000001 3,349,368.0182 $0.7606 BSC <0.01% $0.271839 2.7904 $0.7585 BSC <0.01% $0.655331 1.1333 $0.7427 BSC <0.01% $0.000115 6,311.0808 $0.7244 BSC <0.01% $0.093514 7.5311 $0.7042 BSC <0.01% $0.005078 135.6516 $0.6888 BSC <0.01% $1.82 0.3651 $0.6645 BSC <0.01% $0.03085 21.4176 $0.6607 BSC <0.01% $0.048547 13.4741 $0.6541 BSC <0.01% $0.079164 8.1948 $0.6487 BSC <0.01% $0.453154 1.3806 $0.6256 BSC <0.01% $0.004107 151.083 $0.6204 BSC <0.01% $0.008657 71.493 $0.6188 BSC <0.01% $0.316713 1.9432 $0.6154 BSC <0.01% $0.095605 6.3943 $0.6113 BSC <0.01% $0.141735 4.307 $0.6104 BSC <0.01% $0.000461 1,294.025 $0.5959 BSC <0.01% $0.001093 543.6825 $0.5942 BSC <0.01% $8.79 0.0657 $0.577 BSC <0.01% $0.000278 1,823.6534 $0.507 BSC <0.01% $0.994379 0.4935 $0.4907 BSC <0.01% $0.000113 4,242.3221 $0.4809 BSC <0.01% $0.024744 19.3922 $0.4798 BSC <0.01% $0.065227 7.1094 $0.4637 BSC <0.01% $0.006581 69.7348 $0.4589 BSC <0.01% $533.72 0.00084283 $0.4498 BSC <0.01% $0.000729 616.5617 $0.4493 BSC <0.01% $0.14668 3.0508 $0.4474 BSC <0.01% $0.043732 10.2173 $0.4468 BSC <0.01% $6.38 0.0699 $0.4459 BSC <0.01% $4,677.67 0.0000945 $0.442 BSC <0.01% $0.108019 4.0742 $0.44 BSC <0.01% $0.628728 0.6999 $0.44 BSC <0.01% $0.000626 684.0889 $0.4283 BSC <0.01% $0.020838 20.4684 $0.4265 BSC <0.01% $0.770375 0.528 $0.4067 BSC <0.01% $0.010832 37.1837 $0.4027 BSC <0.01% $0.039177 10.2635 $0.402 BSC <0.01% $0.16229 2.473 $0.4013 BSC <0.01% $0.728138 0.5463 $0.3977 BSC <0.01% $0.588857 0.6699 $0.3944 BSC <0.01% $0.002628 146.1425 $0.384 BSC <0.01% $0.713243 0.5369 $0.3829 BSC <0.01% $0.004052 92.4272 $0.3745 BSC <0.01% $0.005676 64.3954 $0.3655 BSC <0.01% $0.001716 211.3153 $0.3625 BSC <0.01% $0.024344 14.4019 $0.3506 BSC <0.01% $0.031264 10.7737 $0.3368 BSC <0.01% $1.05 0.3147 $0.3316 BSC <0.01% $0.000088 3,702.4607 $0.3267 BSC <0.01% $1.23 0.2574 $0.3166 BSC <0.01% $0.99724 0.3166 $0.3156 BSC <0.01% $0.055416 5.6613 $0.3137 BSC <0.01% $0.010471 29.8019 $0.312 BSC <0.01% $0.041516 7.4458 $0.3091 BSC <0.01% $0.259655 1.148 $0.298 BSC <0.01% $3.71 0.0792 $0.2942 BSC <0.01% $0.070921 4.053 $0.2874 BSC <0.01% $0.985617 0.2867 $0.2825 BSC <0.01% $0.000416 674.3925 $0.2804 BSC <0.01% <$0.000001 19,723,052.704 $0.278 BSC <0.01% $0.846709 0.3277 $0.2774 BSC <0.01% $0.000051 5,442.9281 $0.2772 BSC <0.01% $0.000123 2,257.7467 $0.2768 BSC <0.01% $0.006894 40.1007 $0.2764 BSC <0.01% $0.003069 88.9399 $0.2729 BSC <0.01% $0.195099 1.3825 $0.2697 BSC <0.01% $0.005221 50.7824 $0.2651 BSC <0.01% $0.000628 418.6933 $0.263 BSC <0.01% $0.000066 3,988.7538 $0.2627 BSC <0.01% $0.001802 145.3838 $0.2619 BSC <0.01% $0.18893 1.364 $0.2576 BSC <0.01% $0.255337 1 $0.2553 BSC <0.01% $0.044787 5.6691 $0.2539 BSC <0.01% $0.003888 64.882 $0.2522 BSC <0.01% $0.234985 1.069 $0.2511 BSC <0.01% $0.078639 3.1834 $0.2503 BSC <0.01% $109,202 0.00000228 $0.2488 BSC <0.01% $0.001902 128.7988 $0.2449 BSC <0.01% $0.012161 20.1075 $0.2445 BSC <0.01% $0.001235 197.6168 $0.2439 BSC <0.01% $0.003706 64.9338 $0.2406 BSC <0.01% $0.045472 5.2804 $0.2401 BSC <0.01% $0.212394 1.1112 $0.236 BSC <0.01% $0.005026 46.7425 $0.2349 BSC <0.01% $0.000027 8,546.6303 $0.2328 BSC <0.01% $0.291995 0.7778 $0.2271 BSC <0.01% $0.596069 0.3794 $0.2261 BSC <0.01% $0.012475 18.078 $0.2255 BSC <0.01% $213.31 0.00102409 $0.2184 BSC <0.01% $0.00387 56.2983 $0.2178 BSC <0.01% $1.78 0.1214 $0.2161 BSC <0.01% $28.64 0.00754421 $0.216 BSC <0.01% $0.000041 5,225.5124 $0.2145 BSC <0.01% $3.03 0.0707 $0.2142 BSC <0.01% $0.000789 270.3588 $0.2132 BSC <0.01% $0.01394 14.9408 $0.2082 BSC <0.01% $0.008675 23.0019 $0.1995 BSC <0.01% $0.000515 386.6579 $0.1992 BSC <0.01% $0.000004 45,986.8994 $0.1894 BSC <0.01% $0.002885 65.1206 $0.1878 BSC <0.01% $0.203129 0.9201 $0.1869 BSC <0.01% $0.037178 5.0288 $0.1869 BSC <0.01% $2,626.6 0.00007031 $0.1846 BSC <0.01% $0.000117 1,546.5851 $0.181 BSC <0.01% $0.001343 133.9971 $0.1799 BSC <0.01% $0.00324 55.0678 $0.1784 BSC <0.01% $0.009696 17.5075 $0.1697 BSC <0.01% $0.018517 8.8997 $0.1647 BSC <0.01% $0.138752 1.1861 $0.1645 BSC <0.01% $0.000475 329.2012 $0.1564 BSC <0.01% $0.000962 154.5892 $0.1487 BSC <0.01% <$0.000001 755,101.3177 $0.1483 BSC <0.01% $0.023078 5.6919 $0.1313 BSC <0.01% $0.308883 0.4205 $0.1298 BSC <0.01% $0.015643 8.2239 $0.1286 BSC <0.01% $0.02373 5.363 $0.1272 BSC <0.01% $0.005268 23.9993 $0.1264 BSC <0.01% $1.39 0.09 $0.1251 BSC <0.01% $0.004012 30.5049 $0.1223 BSC <0.01% $0.000331 368.009 $0.1217 BSC <0.01% $0.074561 1.5541 $0.1158 BSC <0.01% $0.000137 835.9768 $0.1144 BSC <0.01% $2.05 0.0557 $0.1143 BSC <0.01% $0.050047 2.2824 $0.1142 BSC <0.01% $0.015689 7.2229 $0.1133 BSC <0.01% <$0.000001 9,577,419,279.9253 $0.1105 BSC <0.01% $0.000001 80,321.463 $0.1101 BSC <0.01% $0.074085 1.4212 $0.1052 BSC <0.01% $0.001811 57.8064 $0.1046 BSC <0.01% $0.00185 56.335 $0.1042 BSC <0.01% $2.65 0.0393 $0.1041 BSC <0.01% $0.002624 39.5355 $0.1037 BSC <0.01% $785.22 0.00012918 $0.1014 BSC <0.01% $0.003497 28.9309 $0.1011 BSC <0.01% $0.000002 50,612.6243 $0.1002 ARB 0.07% $0.042417 1,760.5799 $74.68 ARB 0.07% $0.993968 69.6818 $69.26 ARB 0.07% $1 69.1671 $69.17 ARB 0.05% $1 52.0524 $52.05 ARB 0.04% $0.523405 87.1495 $45.61 ARB 0.04% $65.74 0.6413 $42.16 ARB 0.03% $36.88 0.8291 $30.58 ARB 0.03% $1 28.0456 $28.05 ARB 0.03% $1 27.6658 $27.67 ARB 0.03% $0.991655 27.0696 $26.84 ARB 0.02% $105,935 0.00019186 $20.32 ARB 0.02% $0.05618 336.0661 $18.88 ARB 0.02% $3,990.11 0.00437959 $17.48 ARB 0.02% $4,681.41 0.00361735 $16.93 ARB 0.02% $0.215236 75.2618 $16.2 ARB 0.02% $16.05 0.9929 $15.94 ARB 0.01% $28.7 0.486 $13.95 ARB 0.01% $0.08129 168.0424 $13.66 ARB 0.01% $2.79 4.0886 $11.41 ARB 0.01% $1,638.84 0.00667988 $10.95 ARB <0.01% $4,099.13 0.00254379 $10.43 ARB <0.01% $0.000023 428,660.2997 $9.98 ARB <0.01% $4,710.37 0.00211238 $9.95 ARB <0.01% $2.2 4.4414 $9.77 ARB <0.01% $1.01 8.6977 $8.79 ARB <0.01% $16.08 0.5462 $8.78 ARB <0.01% $6.22 1.4039 $8.73 ARB <0.01% $0.999404 8.6925 $8.69 ARB <0.01% $1.41 6.1256 $8.64 ARB <0.01% $4,468.51 0.00192149 $8.59 ARB <0.01% $0.269292 30.7521 $8.28 ARB <0.01% $2.32 3.2651 $7.58 ARB <0.01% $3,982.23 0.00186156 $7.41 ARB <0.01% $0.03469 207.3663 $7.19 ARB <0.01% $0.999582 7.0943 $7.09 ARB <0.01% $0.00001 678,399.0295 $6.82 ARB <0.01% $0.089357 76.0711 $6.8 ARB <0.01% $0.996329 6.7893 $6.76 ARB <0.01% $0.013052 514.659 $6.72 ARB <0.01% $2.75 2.4037 $6.61 ARB <0.01% $0.052323 119.7293 $6.26 ARB <0.01% $0.016551 368.57 $6.1 ARB <0.01% $3,987.28 0.00147978 $5.9 ARB <0.01% $0.111144 52.4549 $5.83 ARB <0.01% $105,958 0.00005288 $5.6 ARB <0.01% <$0.000001 26,755,515.5651 $5.58 ARB <0.01% $0.384777 14.3212 $5.51 ARB <0.01% $0.004601 1,187.684 $5.47 ARB <0.01% $2.64 2.024 $5.34 ARB <0.01% $0.076 69.332 $5.27 ARB <0.01% $2.15 2.381 $5.12 ARB <0.01% $0.05154 97.0157 $5 ARB <0.01% $0.46786 10.6642 $4.99 ARB <0.01% $0.169674 28.0474 $4.76 ARB <0.01% $0.965331 4.772 $4.61 ARB <0.01% $0.343425 13.4107 $4.61 ARB <0.01% $4,069.62 0.00112373 $4.57 ARB <0.01% $0.101955 42.1918 $4.3 ARB <0.01% $381 0.0112 $4.28 ARB <0.01% $0.05388 72.9497 $3.93 ARB <0.01% $0.58989 6.6278 $3.91 ARB <0.01% $0.99986 3.7353 $3.73 ARB <0.01% $0.328297 11.1392 $3.66 ARB <0.01% $0.037968 94.2833 $3.58 ARB <0.01% $0.004187 763.4662 $3.2 ARB <0.01% $0.121803 26.1239 $3.18 ARB <0.01% $1 3.1536 $3.16 ARB <0.01% $5,505.61 0.00057195 $3.15 ARB <0.01% $0.99152 3.1455 $3.12 ARB <0.01% $4,676.73 0.00058881 $2.75 ARB <0.01% $0.000936 2,932.559 $2.75 ARB <0.01% $4,407.54 0.00061645 $2.72 ARB <0.01% $2.38 1.1322 $2.69 ARB <0.01% $0.000459 5,824.7517 $2.67 ARB <0.01% $0.320801 8.1852 $2.63 ARB <0.01% $0.044818 58.2758 $2.61 ARB <0.01% $0.051636 48.086 $2.48 ARB <0.01% $0.174336 13.9895 $2.44 ARB <0.01% $0.000022 111,201.5 $2.44 ARB <0.01% $1.02 2.3589 $2.39 ARB <0.01% $0.009922 238.2128 $2.36 ARB <0.01% $0.083405 28.2522 $2.36 ARB <0.01% $0.067135 34.3267 $2.3 ARB <0.01% $0.028954 78.586 $2.28 ARB <0.01% $0.002477 902.1233 $2.23 ARB <0.01% $106,362 0.00001963 $2.09 ARB <0.01% $0.999793 2.0473 $2.05 ARB <0.01% $0.221951 8.6218 $1.91 ARB <0.01% $3.39 0.5589 $1.89 ARB <0.01% $0.998779 1.8718 $1.87 ARB <0.01% $28.61 0.0609 $1.74 ARB <0.01% $1 1.735 $1.74 ARB <0.01% $0.000037 45,354.0699 $1.66 ARB <0.01% $0.030667 52.8962 $1.62 ARB <0.01% $0.787075 2.0119 $1.58 ARB <0.01% $106,137 0.00001418 $1.51 ARB <0.01% $1.69 0.8499 $1.44 ARB <0.01% $106,049 0.00001314 $1.39 ARB <0.01% $4,283.46 0.0003237 $1.39 ARB <0.01% $0.020682 62.9316 $1.3 ARB <0.01% $2 0.6422 $1.28 ARB <0.01% $3.38 0.3774 $1.28 ARB <0.01% $0.015827 79.3367 $1.26 ARB <0.01% $0.076017 15.7803 $1.2 ARB <0.01% $165.08 0.00688365 $1.14 ARB <0.01% $18.53 0.0604 $1.12 ARB <0.01% $45.41 0.0238 $1.08 ARB <0.01% $0.021406 48.8877 $1.05 ARB <0.01% $0.274185 3.5572 $0.9753 ARB <0.01% $20.75 0.0467 $0.9691 ARB <0.01% $3.53 0.2546 $0.8986 ARB <0.01% $2.96 0.3029 $0.8965 ARB <0.01% $0.091613 9.588 $0.8783 ARB <0.01% $1 0.8718 $0.8717 ARB <0.01% $27.7 0.0283 $0.784 ARB <0.01% $0.032791 23.67 $0.7761 ARB <0.01% $0.027781 26.4558 $0.7349 ARB <0.01% $0.17547 4.1079 $0.7208 ARB <0.01% $0.003299 209.1647 $0.69 ARB <0.01% $0.072183 9.3854 $0.6774 ARB <0.01% $0.014662 43.2692 $0.6344 ARB <0.01% $0.273782 2.1569 $0.5905 ARB <0.01% $0.996654 0.5831 $0.5811 ARB <0.01% $0.004284 131.5378 $0.5634 ARB <0.01% $0.035314 15.9558 $0.5634 ARB <0.01% $0.017123 32.6079 $0.5583 ARB <0.01% $0.999948 0.5457 $0.5456 ARB <0.01% $0.798069 0.6627 $0.5288 ARB <0.01% $0.00014 3,473.2745 $0.4871 ARB <0.01% $0.576747 0.8242 $0.4753 ARB <0.01% $0.062583 6.2857 $0.3933 ARB <0.01% $0.006503 60.1545 $0.3911 ARB <0.01% $4,319.1 0.00008975 $0.3876 ARB <0.01% $0.036932 9.6025 $0.3546 ARB <0.01% $0.000829 419.3624 $0.3476 ARB <0.01% $3.23 0.0954 $0.308 ARB <0.01% $1 0.2894 $0.2893 ARB <0.01% $1.08 0.2687 $0.289 ARB <0.01% $6.84 0.039 $0.2668 ARB <0.01% $3.11 0.0825 $0.2566 ARB <0.01% $290.55 0.00088111 $0.256 ARB <0.01% $106,402 0.00000238 $0.2532 ARB <0.01% $0.085515 2.8452 $0.2433 ARB <0.01% $1.05 0.2158 $0.2274 ARB <0.01% $0.421043 0.5376 $0.2263 ARB <0.01% $0.000534 413.1556 $0.2205 ARB <0.01% $0.01459 14.6304 $0.2134 ARB <0.01% $0.000397 500 $0.1987 ARB <0.01% $0.209412 0.929 $0.1945 ARB <0.01% $0.33383 0.5699 $0.1902 ARB <0.01% $2.59 0.0683 $0.1768 ARB <0.01% $0.031609 5.3185 $0.1681 ARB <0.01% <$0.000001 36,012,969.763 $0.1656 ARB <0.01% $0.870656 0.1855 $0.1614 ARB <0.01% $1.03 0.1528 $0.158 ARB <0.01% $0.000041 3,772.5658 $0.1536 ARB <0.01% $0.019962 7.6252 $0.1522 ARB <0.01% $0.72442 0.2086 $0.1511 ARB <0.01% $0.903184 0.1595 $0.144 ARB <0.01% $0.00385 36.6938 $0.1412 ARB <0.01% $0.475977 0.2777 $0.1321 ARB <0.01% $1.06 0.1251 $0.1321 ARB <0.01% $0.02708 4.7199 $0.1278 ARB <0.01% $0.039836 3.0304 $0.1207 ARB <0.01% $0.999165 0.1092 $0.1091 ARB <0.01% $294.31 0.00037003 $0.1089 ARB <0.01% $1.01 0.1078 $0.1086 ARB <0.01% $1.32 0.0787 $0.1038 ARB <0.01% $104.58 0.00098059 $0.1025 AVAX 0.09% $1 98.9435 $98.95 AVAX 0.09% $1 93.1475 $93.16 AVAX 0.08% $57.78 1.5251 $88.12 AVAX 0.07% $49.11 1.5563 $76.43 AVAX 0.06% $0.000002 28,455,211.8361 $64.88 AVAX 0.03% $1 31.9365 $31.94 AVAX 0.01% $105,983 0.00014472 $15.34 AVAX 0.01% <$0.000001 616,665,940.1582 $14.74 AVAX <0.01% $0.812201 12.2612 $9.96 AVAX <0.01% $106,218 0.00009082 $9.65 AVAX <0.01% $244.27 0.0367 $8.95 AVAX <0.01% $3,990.11 0.00220463 $8.8 AVAX <0.01% $1.15 6.3696 $7.33 AVAX <0.01% $1.05 6.8153 $7.17 AVAX <0.01% $0.056206 120.6717 $6.78 AVAX <0.01% $0.000005 1,228,558.9962 $6.74 AVAX <0.01% $5,517.43 0.00101099 $5.58 AVAX <0.01% $55.85 0.0978 $5.46 AVAX <0.01% $0.008681 540.3281 $4.69 AVAX <0.01% $1 4.5683 $4.57 AVAX <0.01% $28.64 0.1498 $4.29 AVAX <0.01% $0.434744 9.3164 $4.05 AVAX <0.01% $1 4.0435 $4.04 AVAX <0.01% $0.003494 1,116.8428 $3.9 AVAX <0.01% $0.00297 1,270.2484 $3.77 AVAX <0.01% $0.000005 780,231.4463 $3.71 AVAX <0.01% $49.32 0.0731 $3.61 AVAX <0.01% $0.999434 3.485 $3.48 AVAX <0.01% $1.05 3.036 $3.2 AVAX <0.01% $0.021272 149.7367 $3.19 AVAX <0.01% $0.522721 5.6658 $2.96 AVAX <0.01% $0.722129 4.029 $2.91 AVAX <0.01% $0.000016 176,797.4326 $2.84 AVAX <0.01% $0.000584 4,439.9534 $2.59 AVAX <0.01% $0.009434 264.2341 $2.49 AVAX <0.01% $0.139918 16.3399 $2.29 AVAX <0.01% $0.032211 69.5074 $2.24 AVAX <0.01% $0.001135 1,926.9609 $2.19 AVAX <0.01% $36.91 0.0523 $1.93 AVAX <0.01% $625.05 0.00265868 $1.66 AVAX <0.01% $0.008042 173.9785 $1.4 AVAX <0.01% $6.82 0.2027 $1.38 AVAX <0.01% $0.999948 1.3321 $1.33 AVAX <0.01% $1.14 0.9684 $1.1 AVAX <0.01% $0.996314 1.022 $1.02 AVAX <0.01% $0.003848 218.0983 $0.8393 AVAX <0.01% $381 0.00200865 $0.7652 AVAX <0.01% $0.000322 2,180.2321 $0.7021 AVAX <0.01% $399.16 0.00174391 $0.696 AVAX <0.01% $2 0.292 $0.5837 AVAX <0.01% $6.21 0.0912 $0.5665 AVAX <0.01% $0.999582 0.5314 $0.5311 AVAX <0.01% $0.343298 1.3861 $0.4758 AVAX <0.01% $0.000459 818.1876 $0.3757 AVAX <0.01% $0.001699 206.0025 $0.3499 AVAX <0.01% $0.015679 21.8656 $0.3428 AVAX <0.01% $0.184931 1.7489 $0.3234 AVAX <0.01% $0.000949 314.3358 $0.2982 AVAX <0.01% $0.041015 7.0724 $0.29 AVAX <0.01% $379.96 0.00072822 $0.2766 AVAX <0.01% <$0.000001 6,415,801.1458 $0.2476 AVAX <0.01% $0.000153 1,151.8436 $0.1767 AVAX <0.01% $0.00006 2,860.002 $0.1714 AVAX <0.01% $0.002208 72.7052 $0.1605 AVAX <0.01% $0.000501 295.2815 $0.1479 AVAX <0.01% $0.013943 10.0723 $0.1404 AVAX <0.01% $0.04476 3.0613 $0.137 AVAX <0.01% $16.06 0.00772156 $0.124 AVAX <0.01% $0.019935 5.6977 $0.1135 AVAX <0.01% <$0.000001 546,101.0637 $0.1052 OP 0.07% $3,989.2 0.0192 $76.71 OP 0.06% $1 59.3212 $59.32 OP 0.05% $0.991837 49.9611 $49.55 OP 0.04% $2.47 18.4299 $45.57 OP 0.04% $105,983 0.000422 $44.72 OP 0.04% $3,987.15 0.0102 $40.63 OP 0.02% $0.206238 121.6897 $25.1 OP 0.02% $2.83 8.1982 $23.18 OP 0.02% $379.96 0.0516 $19.62 OP 0.02% $4,721.71 0.00352962 $16.67 OP 0.02% $0.273634 57.9649 $15.86 OP 0.01% $398.9 0.0347 $13.85 OP 0.01% $30.55 0.4418 $13.5 OP 0.01% $1 11.7404 $11.75 OP <0.01% $1 10.5335 $10.53 OP <0.01% $1.02 9.0018 $9.15 OP <0.01% $6.82 1.0924 $7.45 OP <0.01% $3,980.97 0.0018507 $7.37 OP <0.01% $0.641063 11.3826 $7.3 OP <0.01% $106,049 0.00006703 $7.11 OP <0.01% $0.985208 5.864 $5.78 OP <0.01% $1 5.0118 $5.01 OP <0.01% $0.291228 14.6856 $4.28 OP <0.01% $0.135829 30.9478 $4.2 OP <0.01% $2.2 1.8778 $4.13 OP <0.01% $3,888.07 0.0010074 $3.92 OP <0.01% $1 3.4823 $3.49 OP <0.01% $1 3.0795 $3.08 OP <0.01% $0.999948 2.8826 $2.88 OP <0.01% $1 2.8145 $2.81 OP <0.01% $1 1.8735 $1.87 OP <0.01% $1.06 1.661 $1.76 OP <0.01% $16.06 0.1065 $1.71 OP <0.01% $3,898.05 0.00041724 $1.63 OP <0.01% $0.096997 16.6406 $1.61 OP <0.01% $0.000828 1,816.3023 $1.5 OP <0.01% $1.08 1.1773 $1.27 OP <0.01% $0.206238 5.3336 $1.1 OP <0.01% $1 0.9566 $0.9565 OP <0.01% $1.23 0.6881 $0.8463 OP <0.01% $0.08844 9.3375 $0.8258 OP <0.01% $0.02069 38.8352 $0.8034 OP <0.01% $0.343298 2.1608 $0.7417 OP <0.01% $0.031964 20.8603 $0.6667 OP <0.01% $0.002239 264.4842 $0.592 OP <0.01% $0.994091 0.5397 $0.5364 OP <0.01% $2.84 0.1826 $0.5185 OP <0.01% $0.028429 18.0951 $0.5144 OP <0.01% $381 0.00100204 $0.3817 OP <0.01% $3,990.11 0.00007803 $0.3113 OP <0.01% $0.019972 13.7127 $0.2738 OP <0.01% $0.535842 0.4876 $0.2612 OP <0.01% $0.003234 75.4378 $0.2439 OP <0.01% $3.39 0.0622 $0.2107 OP <0.01% $1 0.2036 $0.2036 OP <0.01% $0.122143 1.6159 $0.1973 OP <0.01% $0.010348 18.3371 $0.1897 OP <0.01% $0.029597 5.4764 $0.162 OP <0.01% $0.00001 11,080.262 $0.1124 OP <0.01% $4,457.77 0.00002419 $0.1078 OP <0.01% $28.61 0.00376968 $0.1078 BASE 0.06% $0.004618 13,324.6182 $61.54 BASE 0.04% $0.001962 20,305.55 $39.83 BASE 0.01% <$0.000001 306,886,535 $12.71 BASE <0.01% $0.098975 33.689 $3.33 BASE <0.01% $0.000013 200,004.2069 $2.51 BASE <0.01% $0.038992 11 $0.4289 BASE <0.01% <$0.000001 27,531,552 $0.3634 BASE <0.01% $0.000522 274 $0.143 BASE <0.01% $0.000047 2,728.5705 $0.1292 [ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.