Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Dive into 100s of games and play anonymously with major cryptos. Join CryptoWins today!
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
Overview
ETH Balance
Eth Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (>200)0.18557414 AGLDAdventure Go... (AGLD)$0.22@1.2030.0054882 alETHAlchemix ETH (alETH)$12.63@2,300.87138.09556438 AIChat AI (AI)$0.05@0.00042,821,757 DentacoinDentacoin (Dentac...)$1.02@0.00179.99225857 EMRLDEMERALD (EMRLD)$0.55@0.0031365.69218464 FXFFinxflo (FXF)$0.37@0.001131,779,783.942107 FREEFree Coin (FREE)$17.56@0.00348.98010636 TRUMPFreeTrump (TRUMP)$1.74@0.00533,478,970.9985216 GASGas DAO (GAS)$16.34@0.003.48422889 SHIB0.5Half Shiba I... (SHIB0....)$0.20@0.058226,152 ITLITL (Italian... (ITL)118.39792052 LCSLocalCoinSwa... (LCS)$13.71@0.1158431.55458947 MAZZEMAZZE (MAZZE)$0.57@0.001339,772,685.6567648 PIKAPikachu (PIKA)$1.36@0.0080,147.1412519 QANXQANX Token (QANX)555.25052059 SKBSakura Bloom (SKB)$0.20@0.000415.44021581 SANSAN (SAN)$1.40@0.0905195,193,799.840013 SHIBAShiba (SHIBA)$0.04@0.001,058.31467872 SPXSPX6900 (SPX)$723.32@0.683510,311.92015585 TIPTip (TIP)$0.36@0.00174,183.77672802 VADERVader (VADER)$0.15@0.0010.10371997 HEDG(HEDG)$0.05@0.005133.6107682 POOLZ$Poolz Finan... (POOLZ)$0.52@0.0154553.8002414 0xBTC0xBitcoin To... (0xBTC)$39.68@0.071722.25655103 0xMR0xMonero (0xMR)$0.84@0.03765,919,595,485,320.97 4CHAN4CHAN (4CHAN)$0.19@0.00363,129,299.919348 CAWA Hunters Dr... (CAW)$18.46@0.005.660149 aUSDTAave interes... (aUSDT)$5.68@1.0030.01083326 aWETHAave interes... (aWETH)$26.26@2,424.110.85424937 AAVEAave Token (AAVE)$110.00@128.771,347.59174599 ABYSSAbyss (ABYSS)$6.67@0.0049304.86975706 ADXAdEx (ADX)$46.65@0.15316.7051449 ADSAdshares (ADS)$3.78@0.22631,803.2909995 AGSAegis (AGS)$4.99@0.002832.68682787 AERGOAergo (AERGO)$2.93@0.08958.79788536 AGRSAgoras Token (AGRS)$18.48@2.10125.84796918 AINAI Network (AIN)$0.98@0.0078923,378.12980206 AIAiDoge (AI)$0.44@0.004,456.07941607 AIXAigang (AIX)$0.01@0.0028.32359554 AIOZAIOZ Network (AIOZ)$10.73@0.37891,119,053,250.69754 AKITAAkita Inu (AKITA)$99.48@0.001,530.69525716 AKROAkropolis (AKRO)$5.60@0.00376.89312199 ALDAladdin Toke... (ALD)$0.14@0.0228.70904927 ⚗️Alchemist (⚗️)$16.72@0.58232,948.57055757 ACHAlchemy (ACH)$51.11@0.017389.89512155 ALEPHaleph.im v2 (ALEPH)$14.96@0.166428.927923 ALICEALICE (ALICE)$26.26@0.9079253.1828 TLMAlien Worlds... (TLM)$2.24@0.00882.63182511 ALTAltLayer Tok... (ALT)$0.23@0.0864177.34049953 ALNAluna (ALN)$0.30@0.0017460,170,849,572.506 USHIBAAmerican Shi... (USHIBA)13,168.5972888 AMOAmino (AMO)$1.40@0.000110.32881646 AMPLAmpleforth (AMPL)$12.29@1.1921.66647909 FORTHAmpleforth G... (FORTH)$59.37@2.74610.07185466 ANKRAnkr Network (ANKR)$13.73@0.02250.00003047 ankrETHAnkr Staked ... (ankrET...)$0.09@2,839.184,817.24251988 $ANRXAnRKey X ($ANRX)1,107.60615035 MATTERAntimatter.F... (MATTER)$13.38@0.012140.18105731 APEApeCoin (APE)$36.60@0.91146,514,398.232596 NFTAPENFT (NFT)$19.96@0.0054.97378853 APIXAPIX (APIX)1,851.13419053 APPCAppCoins (APPC)$1.00@0.000511,364.86378364 APYAPY Governan... (APY)$12.01@0.0011467.28333624 APYSAPYSwap (APYS)$2.56@0.00550.22531671 ANTAragon Netwo... (ANT)$0.61@2.690.04816489 AIUSArbius (AIUS)$1.35@27.92550.50354137 ARCXArchitex (ARCX)$0.23@0.4556221.29782045 ARCONAArcona Distr... (ARCONA)$3.73@0.016913.39551126 ARIA20ARIANEE (ARIA20)$1.26@0.09429,263.83387674 ARVARIVA (ARV)$0.12@0.005,695.19986654 ABArma Block (AB)$2.39@0.00045,800.30476993 ARMORArmor (ARMOR)$1.42@0.000229.24249466 ARPAARPA Token (ARPA)$1.17@0.040128.19800984 ALIArtificial L... (ALI)$0.21@0.0076181.05539424 ASTROAstroTools.i... (ASTRO)$10.91@0.060318,796 ATRIAtariToken (ATRI)$3.82@0.000216.56945606 AWCAtomic Walle... (AWC)$0.68@0.04133,927.3103555 AUCAuctus (AUC)$2.72@0.0007207.43896935 AUDIOAudius (AUDIO)$23.01@0.110919.72988223 AURAAura (AURA)$5.13@0.2602135.08621124 AURORAAurora (AURORA)$15.81@0.11710.00000527 AOAAurora (AOA)$0.00@0.00018.16326679 URUSAurox Token (URUS)$17.63@2.1632.28607766 ATAAutomata (ATA)$2.36@0.07324,971.8871 NIOXAutonio (NIOX)$5.81@0.00122,140 AVATLYAVATLY (AVATLY)$5.66@0.0026829.08530465 AVGAvocado DAO ... (AVG)$9.97@0.0127.76519135 AVTAVT (AVT)$14.75@1.9036.46047 AXLAxelar (AXL)$23.69@0.649785.26105429 BXXBaanx (BXX)$2.93@0.0343646,419.4390169 BAXBABB BAX (BAX)$36.86@0.00012,799,693,290.5354 Babydoge2.0Babydoge 2.0 (Babydo...)$0.00@0.00162.48063469 BACBAC (BAC)$0.25@0.00150.09672773 BADGERBadger (BADGER)$0.26@2.669.09909703 BALBalancer (BAL)$15.65@1.720.93670664 bALPHAbAlpha (bALPHA)$8.34@8.90051.07346687 BANANABanana (BANANA)$52.15@48.5811,835.31815799 BANKBankless Tok... (BANK)$12.33@0.0010.87320628 VLTBankroll Vau... (VLT)$0.18@0.20233.96034351 BONDBarnBridge G... (BOND)$5.23@1.32144,794.89029859 BARTBarterTrade (BART)$2.50@0.001.60921275 BASv2BASv2 (BASv2)$0.06@0.03863.05714122 BDPBDPToken (BDP)$0.30@0.09832.06755841 BIFIbeefy.financ... (BIFI)66.3019139 BELBella (BEL)$30.89@0.4660.00000255 MARKBenchmark (MARK)$0.00@0.501423,621.09384043 BENDBend Token (BEND)$8.43@0.0004432,562.56179809 FINALEBens Finale (FINALE)$1.08@0.00144.06545346 BMDABermuda (BMDA)$1.58@0.011115.14070243 BERRYBerry (BERRY)$0.03@0.000329,405.18911317 BEPROBetProtocolT... (BEPRO)$10.94@0.000438.70365202 BETRBetter Betti... (BETR)5,826,303,631,695.33 BEZOGEBezoge Earth (BEZOGE)$32.18@0.00146.58700318 BiFiBiFi (BiFi)$0.29@0.002279.01248326 BFCBifrost (BFC)$10.38@0.037231,632,042.0325118 $BIGBig Eyes ($BIG)$12.50@0.000.00046739 BBTCBinance Wrap... (BBTC)$31.34@67,063.000.00186915 BFILBinance Wrap... (BFIL)0.06643355 BWRXBinance Wrap... (BWRX)561,308.69579133 BIRDDOGBird Dog (BIRDDO...)$2.21@0.002.3165514 BIRDBird.Money (BIRD)$7.78@3.36404.95094949 BTBBitBall (BTB)$0.01@0.002.16167144 BTCINUBitcoin Inu (BTCINU)$0.02@0.00741.50324322 LEOBitfinex LEO... (LEO)$9.09@6.0557,247,047.4533541 BRISEBitgert (BRISE)$3.87@0.0012.26710911 BMCBitMartToken (BMC)$3.38@0.275942.23554999 BITXBitScreenerT... (BITX)75.75020938 BTSGBitSong (BTSG)$1.23@0.016211.85561009 BCDTBlockchain C... (BCDT)$0.44@0.0371710.21326548 GUILDBlockchainSp... (GUILD)$1.63@0.00230.71183371 BLOCKBlockGames (BLOCK)$0.01@0.01962,988.25911447 VEEBLOCKv (VEE)$28.13@0.009416,098.08760999 BLOODBloodboy (BLOOD)$5.60@0.000310.43811272 BLZBluzelle (BLZ)$0.92@0.08832,099.24011267 BONDLYBondly (BONDLY)$3.79@0.0018169.06192904 BOSONBoson Token (BOSON)$32.70@0.19340.68918153 AuctionBounce Token (Auctio...)$7.91@11.481,464.73218334 BRDBread (BRD)$14.51@0.009982.87409713 BRETTBrett (BRETT)$1.34@0.016212.92101527 Brick BlockBRICK (Brick ...)$0.00@0.00027,286.94965684 BMIBridge Mutua... (BMI)$19.75@0.00270.04488734 BTC2x-FLIBTC 2x Flexi... (BTC2x-...)$1.19@26.540.00000002 BUSDBUSD Token (... (BUSD)301.03907781 BFLYButterfly Pr... (BFLY)$1.30@0.00430.75448614 BYTESBYTES (BYTES)$2.67@3.5364193.05982602 BZZBZZ (BZZ)$91.64@0.47476.66570936 CANTOCanto (CANTO)$0.13@0.01980.00188582 CAPCap (CAP)$0.00@1.076235.82635454 CARDSCARD.STARTER (CARDS)43,976.47318338 CARDCardstack (CARD)$17.61@0.00047.56674763 CXOCargoX (CXO)$1.77@0.23364,707.83924927 CRECarryToken (CRE)$22.02@0.0047313.76239404 CTSICartesi Toke... (CTSI)$35.51@0.1132637.5034206 CATBOYCatboy (CATBOY)$13.62@0.02141,306.44307393 CEEKCEEK (CEEK)$32.69@0.0252,832.51790274 CELRCelerToken (CELR)$29.52@0.010424.99 CENNZCentrality T... (CENNZ)$0.15@0.00624.41590465 FLIPChainflip (FLIP)$5.52@1.25198.44031326 BNANAChimpion (BNANA)$0.09@0.000571.78349817 CHEXChintai Exch... (CHEX)$19.01@0.264810.11011933 CHOchoise.com T... (CHO)$0.16@0.0163100.983751 CHRChroma (CHR)$14.89@0.14750.06689842 TIMEChronoTech T... (TIME)$1.15@17.18119,467.02910333 CNDCindicator (CND)$40.42@0.0003375.60404389 CVCCivic (CVC)$44.10@0.11742,643.60844631 CIVCivilization (CIV)$24.86@0.009452.73294927 CTIClinTex CTI (CTI)$0.54@0.01020.251333 CLVClover (CLV)$0.13@0.507761.33544638 COINCoin Utility... (COIN)$0.39@0.0064169.48573789 C98Coin98 (C98)$18.35@0.10830.00003241 CLTCoinLoan (CLT)$0.00@0.3295892.03666505 CWEBCoinweb (CWEB)$4.27@0.0048547,914.83649565 CONANConan (CONAN)$4.35@0.0044.34442553 CVPConcentrated... (CVP)$5.61@0.12662.25169742 COSContentos (COS)$0.01@0.006339,325.23760621 CONVConvergence (CONV)$3.30@0.000114,728.53925865 COOKCook Token (COOK)$387.23@0.02637,505.69104948 CORCOR Token (COR)$3.15@0.0004423.3728095 COTCosplayToken (COT)$2.60@0.0061180.21283838 CQTCovalent Que... (CQT)$0.65@0.0036180.21283838 CXTCovalent X T... (CXT)$10.81@0.062.46801267 COVCovesting (COV)$0.01@0.004426.01112419 CROCronos Coin (CRO)$1.84@0.070973.45866383 CRPTCRPT (CRPT)$1.17@0.01590.03032491 CRGPTCRYPTO GPT (CRGPT)$0.00@0.05391.91829617 CC10Cryptocurren... (CC10)5,591.64398885 CUDOSCudosToken (CUDOS)$65.76@0.0118675.39566109 XCURCurate (XCUR)$4.65@0.006940.89273691 crvUSDCurve.Fi USD... (crvUSD)$40.76@0.996857,062.08620677 cVcVToken (cV)$1.13@0.00106.31136704 DAODAO Maker (DAO)$27.97@0.2631172.50316923 DTXDaTa eXchang... (DTX)$0.38@0.00222,645.27512662 DAWNDawn (DAWN)$6.67@0.00251,650.05424849 DECDecentr (DEC)$1.63@0.0012,393.33612659 DGDecentral Ga... (DG)$32.74@0.01370.17704469 $DGdecentral.ga... ($DG)$2.66@15.05189.58884272 MANADecentraland (MANA)$50.37@0.26574.87341883 USDDDecentralize... (USDD)$4.86@0.99786,837.02640208 DPRDeeper Netwo... (DPR)$13.99@0.002557.58579009 DFIDeFiChain To... (DFI)$7.56@0.0136NFT Tokens (98)! fetpool.com! fetpool.comERC-1155zeronewyear.com'0x0ai Mysterybox NFTERC-1155groknewyear.com'GROK Mysterybox NFTERC-1155derace.giftDeRace Mysterybox NFTERC-1155dojo.giftDojo BlackBox NFTERC-1155EventERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155nft-injective.comINJ Mysterybox NFTERC-1155claim rewards on injectivepool.orginjectivepool.orgERC-1155IItemsERC-1155metispool.commetispool.comERC-1155nft-sidus.comnft-sidus.comERC-1155nft-vulcanforged.comnft-vulcanforged.comERC-1155claim rewards on poolstake.netpoolstake.netERC-1155claim rewards qntnetwork.orgqntnetwork.orgERC-1155realio.giftRealio Mysterybox NFTERC-1155Reward Club [fW8EeS3o]Reward Club [zEXw7mCn]ERC-1155solpool.orgsolpool.orgERC-1155Token-beam.comToken-beam.comERC-1155Withdraw NFT originethers.comWithdraw NFT originethers.comERC-1155nft-woo.comWOO Mysterybox NFTERC-1155claim rewards on woonetwork.netwoonetwork.netERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 9 from a total of 9 transactions
Transaction Hash MethodBlockFromToSet Withdraw Fee 19791125 2024-05-03 17:37:47 185 days ago 1714757867 IN 0 ETH$0.00 0.00039784 9.2740006 Set Withdraw Fee 18472779 2023-10-31 21:26:23 369 days ago 1698787583 IN 0 ETH$0.00 0.00194764 30.02009829 Withdraw 18472775 2023-10-31 21:25:35 369 days ago 1698787535 IN 0 ETH$0.00 0.00212358 30.43119677 Withdraw 18472770 2023-10-31 21:24:35 369 days ago 1698787475 IN 0 ETH$0.00 0.00279442 32.52015157 Set Withdraw Fee 18472748 2023-10-31 21:20:11 369 days ago 1698787211 IN 0 ETH$0.00 0.00148984 34.72907267 Set Bridge Conne... 18272738 2023-10-03 21:39:23 397 days ago 1696369163 IN 0 ETH$0.00 0.00053843 12.42750254 Withdraw 18251805 2023-09-30 23:28:11 400 days ago 1696116491 IN 0 ETH$0.00 0.00062611 7.38634841 Withdraw 17814113 2023-07-31 16:14:23 462 days ago 1690820063 IN 0 ETH$0.00 0.0026944 33.69436478 Set Fee Collecto... 17481370 2023-06-14 23:15:11 508 days ago 1686784511 IN 0 ETH$0.00 0.00065315 18.48249885 Latest 1 internal transaction
Advanced mode:Parent Transaction Hash Block From To 17181929 2023-05-03 18:20:11 550 days ago 1683138011 Contract Creation 0 ETH$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...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value BSC 51.16% $0.000214 102,623,376,411.22 $21,936,772.94 BSC <0.01% $0.000324 4,591,784.1734 $1,489.71 BSC <0.01% <$0.000001 580,468,289,722.743 $1,438.19 BSC <0.01% $0.033296 38,642.4012 $1,286.64 BSC <0.01% $0.315242 3,206.4417 $1,010.81 BSC <0.01% $0.048384 15,033.5402 $727.38 BSC <0.01% $0.005522 93,636.6461 $517.02 BSC <0.01% $0.009988 51,395.2521 $513.35 BSC <0.01% <$0.000001 6,410,035,054.304 $490.12 BSC <0.01% $0.444069 597.9528 $265.53 BSC <0.01% $0.000027 6,434,715.2641 $171.55 BSC <0.01% $0.051477 2,688.0301 $138.37 BSC <0.01% $0.000005 27,737,017.5918 $136.94 BSC <0.01% $0.01283 9,053.9989 $116.16 BSC <0.01% $20.82 5.5675 $115.89 BSC <0.01% $0.001931 53,937.2155 $104.13 BSC <0.01% $0.039863 2,531.2106 $100.9 BSC <0.01% $0.910941 103.8957 $94.64 BSC <0.01% <$0.000001 576,142,696.3485 $76.86 BSC <0.01% $0.005211 13,170.1683 $68.64 BSC <0.01% $0.289323 201.1351 $58.19 BSC <0.01% $0.00387 14,025.1281 $54.27 BSC <0.01% $3.22 16.3026 $52.42 BSC <0.01% $0.024504 2,109.1135 $51.68 BSC <0.01% $0.171934 276.4654 $47.53 BSC <0.01% <$0.000001 3,619,456,359.9239 $39.81 BSC <0.01% <$0.000001 874,145,561.6795 $32.05 BSC <0.01% $0.038581 822.864 $31.75 BSC <0.01% <$0.000001 734,693,319.1457 $30.63 BSC <0.01% $0.042247 690.6717 $29.18 BSC <0.01% <$0.000001 1,291,549,282.3995 $29.08 BSC <0.01% $0.000003 9,977,392.4757 $29.03 BSC <0.01% $0.002873 9,932.5159 $28.54 BSC <0.01% $0.000001 30,909,553.748 $27.76 BSC <0.01% <$0.000001 33,464,218,913.1225 $21.49 BSC <0.01% $1.25 16.962 $21.2 BSC <0.01% $1,377.93 0.0117 $16.17 BSC <0.01% $0.001221 13,012.8212 $15.88 BSC <0.01% <$0.000001 70,833,174,837.1916 $15.65 BSC <0.01% $0.291995 50.0728 $14.62 BSC <0.01% $131.56 0.108 $14.21 BSC <0.01% $0.000176 79,382.6857 $13.96 BSC <0.01% <$0.000001 4,320,849,008,270.11 $13.73 BSC <0.01% $1.41 9.6028 $13.54 BSC <0.01% <$0.000001 11,182,552,660.3004 $13.42 BSC <0.01% <$0.000001 250,814,498,362.252 $12.81 BSC <0.01% $0.000894 14,286.8779 $12.77 BSC <0.01% $0.077315 160.5325 $12.41 BSC <0.01% $0.00007 175,531.6879 $12.34 BSC <0.01% $0.011985 1,023.2538 $12.26 BSC <0.01% $0.003558 3,366.4308 $11.98 BSC <0.01% $0.001135 10,489.9397 $11.9 BSC <0.01% $0.002345 5,044.8577 $11.83 BSC <0.01% <$0.000001 7,005,051,043.4729 $11.58 BSC <0.01% $0.005621 2,059.2069 $11.57 BSC <0.01% $0.000017 662,793.6041 $11.33 BSC <0.01% $0.010348 1,082.1495 $11.2 BSC <0.01% $0.00065 17,014.289 $11.06 BSC <0.01% $66,622.22 0.00016441 $10.95 BSC <0.01% <$0.000001 13,338,725,226.7673 $10.77 BSC <0.01% $0.095887 107.6681 $10.32 BSC <0.01% $92.98 0.1106 $10.28 BSC <0.01% $0.002329 4,170.2049 $9.71 BSC <0.01% $0.01549 609.0812 $9.43 BSC <0.01% $0.759858 12.0532 $9.16 BSC <0.01% $0.000641 14,168.2081 $9.08 BSC <0.01% $0.999236 9.0574 $9.05 BSC <0.01% $0.000819 10,995.7798 $9.01 BSC <0.01% $0.004277 2,097.7257 $8.97 BSC <0.01% $0.000001 8,703,883.2645 $8.7 BSC <0.01% $0.910973 9.4824 $8.64 BSC <0.01% <$0.000001 35,809,790.1248 $8.63 BSC <0.01% <$0.000001 4,626,173,229.6629 $8.55 BSC <0.01% $0.00189 4,420.9213 $8.36 BSC <0.01% $0.001176 6,780.9519 $7.97 BSC <0.01% <$0.000001 87,516,215.8868 $7.97 BSC <0.01% <$0.000001 4,302,693,576.752 $7.7 BSC <0.01% $0.000036 216,025.3713 $7.7 BSC <0.01% $0.00046 16,568.8891 $7.63 BSC <0.01% <$0.000001 17,554,144.6488 $7.53 BSC <0.01% $0.000033 221,745.2822 $7.31 BSC <0.01% $0.144072 49.8779 $7.19 BSC <0.01% $0.034139 208.4639 $7.12 BSC <0.01% <$0.000001 5,737,707,223.3406 $7.06 BSC <0.01% $0.001697 4,139.7996 $7.03 BSC <0.01% $0.637081 11.0076 $7.01 BSC <0.01% $0.003578 1,883.7176 $6.74 BSC <0.01% $0.002696 2,483.9304 $6.7 BSC <0.01% $0.000369 17,460.065 $6.45 BSC <0.01% <$0.000001 13,277,663,812,216.9 $6.42 BSC <0.01% $0.000019 323,110.0914 $6.25 BSC <0.01% $13.32 0.4595 $6.12 BSC <0.01% $36.33 0.1667 $6.06 BSC <0.01% $129.01 0.0467 $6.03 BSC <0.01% $0.027176 210.7852 $5.73 BSC <0.01% $0.000515 10,955.8268 $5.64 BSC <0.01% $0.064443 87.3081 $5.63 BSC <0.01% $0.002436 2,297.0458 $5.6 BSC <0.01% <$0.000001 172,039,780.2545 $5.47 BSC <0.01% $0.05118 103.267 $5.29 BSC <0.01% $0.012096 421.8228 $5.1 BSC <0.01% $0.000471 10,812.6301 $5.1 BSC <0.01% <$0.000001 40,371,889,191,942.4 $5.1 BSC <0.01% $0.000283 17,853.3495 $5.06 BSC <0.01% <$0.000001 2,951,279,280.2879 $5.06 BSC <0.01% $0.00118 4,282.5072 $5.05 BSC <0.01% $0.000745 6,618.7993 $4.93 BSC <0.01% $0.268606 18.0375 $4.84 BSC <0.01% $0.016696 288.6559 $4.82 BSC <0.01% $0.005571 850.5038 $4.74 BSC <0.01% $0.004919 961.4436 $4.73 BSC <0.01% $0.725459 6.4319 $4.67 BSC <0.01% $0.132284 34.4056 $4.55 BSC <0.01% $0.002312 1,963.9418 $4.54 BSC <0.01% $0.00611 738.9178 $4.52 BSC <0.01% $0.002149 2,091.1148 $4.49 BSC <0.01% $0.401414 10.977 $4.41 BSC <0.01% $0.068942 63.4993 $4.38 BSC <0.01% $0.001628 2,688.4091 $4.38 BSC <0.01% $0.022789 190.5425 $4.34 BSC <0.01% $0.001275 3,404.2851 $4.34 BSC <0.01% $0.00615 705.5194 $4.34 BSC <0.01% $0.001773 2,432.1983 $4.31 BSC <0.01% $0.000075 56,782.7017 $4.25 BSC <0.01% $2,417.54 0.00175001 $4.23 BSC <0.01% $0.000158 26,769.0691 $4.23 BSC <0.01% $0.000359 11,722.2297 $4.21 BSC <0.01% <$0.000001 1,332,792,460.4339 $4.18 BSC <0.01% <$0.000001 2,141,942,885.1822 $4.13 BSC <0.01% $0.110231 36.9544 $4.07 BSC <0.01% $0.001361 2,967.1417 $4.04 BSC <0.01% $0.000005 787,591.355 $4.01 BSC <0.01% $1.83 2.1749 $3.98 BSC <0.01% $0.000499 7,853.0725 $3.92 BSC <0.01% <$0.000001 39,033,200,708.8128 $3.9 BSC <0.01% $0.000235 16,549.1443 $3.9 BSC <0.01% $0.000002 2,222,276.93 $3.84 BSC <0.01% $0.003328 1,152.0594 $3.83 BSC <0.01% $0.00078 4,833.6086 $3.77 BSC <0.01% $0.002347 1,600.5856 $3.76 BSC <0.01% $0.000372 10,023.5861 $3.73 BSC <0.01% $0.017344 213.9389 $3.71 BSC <0.01% $0.003479 1,045.4867 $3.64 BSC <0.01% $0.019717 183.4568 $3.62 BSC <0.01% $0.019509 185.2024 $3.61 BSC <0.01% $0.00319 1,109.4274 $3.54 BSC <0.01% $0.000991 3,570.2783 $3.54 BSC <0.01% $0.000001 3,596,527.5029 $3.52 BSC <0.01% $0.010869 323.7381 $3.52 BSC <0.01% <$0.000001 16,177,653,300.2307 $3.49 BSC <0.01% $0.416308 8.3714 $3.49 BSC <0.01% $0.000366 9,492.2963 $3.47 BSC <0.01% $0.003135 1,105.5907 $3.47 BSC <0.01% $0.008703 397.1524 $3.46 BSC <0.01% $0.000063 54,040.67 $3.4 BSC <0.01% $0.005363 633.5062 $3.4 BSC <0.01% <$0.000001 643,973,115.2395 $3.39 BSC <0.01% $0.010767 311.7044 $3.36 BSC <0.01% $0.00287 1,166.7601 $3.35 BSC <0.01% $0.00103 3,219.0536 $3.31 BSC <0.01% $0.0003 10,871.0205 $3.26 BSC <0.01% $0.000643 5,047.6805 $3.25 BSC <0.01% $579.82 0.00559202 $3.24 BSC <0.01% $0.000915 3,432.2006 $3.14 BSC <0.01% $0.505826 6.1578 $3.11 BSC <0.01% <$0.000001 990,033,436.2104 $3.07 BSC <0.01% $0.006433 472.0878 $3.04 BSC <0.01% $1.46 2.0657 $3.01 BSC <0.01% $0.001511 1,987.1662 $3 BSC <0.01% <$0.000001 3,641,887,277.7959 $2.95 BSC <0.01% $0.022541 130.6363 $2.94 BSC <0.01% $2.16 1.347 $2.91 BSC <0.01% $0.004824 599.8872 $2.89 BSC <0.01% $0.002433 1,175.9603 $2.86 BSC <0.01% $0.071602 39.0511 $2.8 BSC <0.01% $0.056585 49.3142 $2.79 BSC <0.01% <$0.000001 1,104,534,811,086.61 $2.77 BSC <0.01% $0.073179 37.5741 $2.75 BSC <0.01% $0.068106 39.3058 $2.68 BSC <0.01% <$0.000001 329,813,612.678 $2.66 BSC <0.01% $0.000008 335,497.9571 $2.65 BSC <0.01% $0.006638 399.6084 $2.65 BSC <0.01% $0.003152 835.3557 $2.63 BSC <0.01% $0.000043 60,432.1267 $2.62 BSC <0.01% $0.000519 5,048.5669 $2.62 BSC <0.01% <$0.000001 738,834,543.7342 $2.62 BSC <0.01% $0.000846 3,067.5554 $2.59 BSC <0.01% $0.002048 1,263.0168 $2.59 BSC <0.01% $6.96 0.3708 $2.58 BSC <0.01% $0.006719 381.1224 $2.56 BSC <0.01% $0.000048 52,792.6827 $2.55 BSC <0.01% <$0.000001 17,296,831.4856 $2.54 BSC <0.01% $0.466301 5.3458 $2.49 BSC <0.01% $0.006627 370.0254 $2.45 BSC <0.01% $0.983988 2.4715 $2.43 BSC <0.01% $0.124524 19.1994 $2.39 BSC <0.01% $0.006227 380.1971 $2.37 BSC <0.01% <$0.000001 3,934,025,345.3753 $2.36 BSC <0.01% <$0.000001 786,378,486,492,870,000 $2.36 BSC <0.01% <$0.000001 7,175,616,054.8718 $2.31 BSC <0.01% $0.401036 5.6608 $2.27 BSC <0.01% $0.024658 91.9443 $2.27 BSC <0.01% $0.022614 99.2337 $2.24 BSC <0.01% <$0.000001 4,838,136,911.4654 $2.24 BSC <0.01% <$0.000001 10,506,688,937.0109 $2.24 BSC <0.01% $0.254406 8.5803 $2.18 BSC <0.01% $1.38 1.5766 $2.18 BSC <0.01% $0.000384 5,631.2598 $2.16 BSC <0.01% $0.004375 486.9887 $2.13 BSC <0.01% <$0.000001 221,516,952,540.34 $2.12 BSC <0.01% $0.000003 826,271.4154 $2.11 BSC <0.01% <$0.000001 97,294,217.2068 $2.1 BSC <0.01% $0.000004 492,840.8091 $2.1 BSC <0.01% <$0.000001 4,533,191,678,627.08 $2.1 BSC <0.01% $0.000847 2,474.3159 $2.1 BSC <0.01% $1.99 1.0495 $2.09 BSC <0.01% <$0.000001 2,238,825,057.0395 $2.08 BSC <0.01% $0.324011 6.4029 $2.07 BSC <0.01% <$0.000001 6,678,424.72 $2.07 BSC <0.01% $0.359408 5.7297 $2.06 BSC <0.01% $0.000133 15,416.7852 $2.06 BSC <0.01% $0.000902 2,277.3961 $2.06 BSC <0.01% $0.04032 50.6634 $2.04 BSC <0.01% $0.003922 518.4286 $2.03 BSC <0.01% $0.011507 175.8546 $2.02 BSC <0.01% $0.000085 23,852.8599 $2.02 BSC <0.01% $0.189786 10.4028 $1.97 BSC <0.01% $0.017253 113.2827 $1.95 BSC <0.01% $0.003236 603.484 $1.95 BSC <0.01% $0.221519 8.6295 $1.91 BSC <0.01% <$0.000001 1,646,718,880,697.54 $1.9 BSC <0.01% <$0.000001 1,058,987,930.0415 $1.89 BSC <0.01% $0.000001 2,120,918.9041 $1.88 BSC <0.01% $0.977288 1.9191 $1.88 BSC <0.01% <$0.000001 344,981,598,498,487 $1.86 BSC <0.01% $0.000027 68,131.8103 $1.85 BSC <0.01% $0.007399 247.6571 $1.83 BSC <0.01% $0.000406 4,507.2749 $1.83 BSC <0.01% $0.530475 3.4203 $1.81 BSC <0.01% $0.021946 82.2895 $1.81 BSC <0.01% $0.001047 1,720.0926 $1.8 BSC <0.01% $0.069277 25.9965 $1.8 BSC <0.01% $1.35 1.3243 $1.79 BSC <0.01% $0.002299 777.3102 $1.79 BSC <0.01% $0.000168 10,636.9095 $1.78 BSC <0.01% $0.125321 14.1548 $1.77 BSC <0.01% $0.001198 1,460.1605 $1.75 BSC <0.01% <$0.000001 1,329,210,659.3153 $1.73 BSC <0.01% $0.00324 533.2079 $1.73 BSC <0.01% $0.000194 8,858.1704 $1.72 BSC <0.01% $0.039254 43.7278 $1.72 BSC <0.01% $2.64 0.6471 $1.71 BSC <0.01% $0.00085 1,974.199 $1.68 BSC <0.01% $1.98 0.8434 $1.67 BSC <0.01% $0.000022 74,816.2777 $1.66 BSC <0.01% <$0.000001 21,214,094,122.3722 $1.63 BSC <0.01% $0.00173 936.4846 $1.62 BSC <0.01% $0.000855 1,882.9389 $1.61 BSC <0.01% $0.000114 14,059.154 $1.6 BSC <0.01% $0.012931 121.994 $1.58 BSC <0.01% $0.008023 191.5533 $1.54 BSC <0.01% $0.000334 4,591.8171 $1.53 BSC <0.01% $0.065146 23.528 $1.53 BSC <0.01% <$0.000001 5,504,873,491.6852 $1.51 BSC <0.01% $0.129438 11.6471 $1.51 BSC <0.01% $0.000042 35,478.4751 $1.5 BSC <0.01% $0.13031 11.4645 $1.49 BSC <0.01% $0.000309 4,831.6041 $1.49 BSC <0.01% $0.000208 7,151.5158 $1.49 BSC <0.01% <$0.000001 4,392,811,890.6513 $1.49 BSC <0.01% $0.0008 1,853.1708 $1.48 BSC <0.01% $0.005153 287.4848 $1.48 BSC <0.01% $0.002232 663.353 $1.48 BSC <0.01% $0.000056 26,445.7448 $1.47 BSC <0.01% $0.233886 6.2678 $1.47 BSC <0.01% <$0.000001 417,206,608.2667 $1.46 BSC <0.01% $0.000707 2,044.8278 $1.45 BSC <0.01% $0.147657 9.6378 $1.42 BSC <0.01% $0.000002 590,357.9903 $1.4 BSC <0.01% $0.092714 14.9968 $1.39 BSC <0.01% $0.08947 15.5227 $1.39 BSC <0.01% $0.000852 1,594.7361 $1.36 BSC <0.01% $0.007582 178.9268 $1.36 BSC <0.01% $0.000001 1,426,209.3526 $1.34 BSC <0.01% $0.129246 10.3831 $1.34 BSC <0.01% <$0.000001 522,580,276,524.855 $1.33 BSC <0.01% $0.000742 1,777.6681 $1.32 BSC <0.01% $0.003034 434.4997 $1.32 BSC <0.01% $0.001499 873.5733 $1.31 BSC <0.01% $0.000316 4,089.7003 $1.29 BSC <0.01% $0.000748 1,718.6235 $1.28 BSC <0.01% $0.000003 493,067.549 $1.28 BSC <0.01% $0.00018 7,089.9333 $1.28 BSC <0.01% $0.082586 15.4058 $1.27 BSC <0.01% <$0.000001 431,702,058.6998 $1.26 BSC <0.01% $0.377139 3.3314 $1.26 BSC <0.01% <$0.000001 6,599,535.9892 $1.25 BSC <0.01% $0.002942 422.2885 $1.24 BSC <0.01% $0.001134 1,089.0657 $1.23 BSC <0.01% $0.00015 8,067.5355 $1.21 BSC <0.01% $1.12 1.0789 $1.21 BSC <0.01% $0.004608 259.9905 $1.2 BSC <0.01% $0.000038 31,195.7562 $1.2 BSC <0.01% <$0.000001 915,137,808.6393 $1.19 BSC <0.01% $0.010491 112.825 $1.18 BSC <0.01% $0.002098 561.51 $1.18 BSC <0.01% $0.034217 34.0594 $1.17 BSC <0.01% <$0.000001 1,207,369,145.0633 $1.15 BSC <0.01% $0.035389 31.6721 $1.12 BSC <0.01% <$0.000001 4,171,645.9811 $1.11 BSC <0.01% $3.36 0.3301 $1.11 BSC <0.01% $0.00007 15,451.2214 $1.09 BSC <0.01% $4.74 0.2284 $1.08 BSC <0.01% $0.375207 2.8567 $1.07 BSC <0.01% <$0.000001 235,039,718.2387 $1.06 BSC <0.01% $2,839.18 0.00037129 $1.05 BSC <0.01% $0.001128 908.7673 $1.02 BSC <0.01% $30 0.0332 $0.9972 BSC <0.01% $0.00067 1,483.7713 $0.9937 BSC <0.01% $0.008183 116.2331 $0.9511 BSC <0.01% $0.08892 10.6114 $0.9435 BSC <0.01% $0.145844 6.398 $0.9331 BSC <0.01% $0.039131 23.7708 $0.9301 BSC <0.01% <$0.000001 6,525,146.0201 $0.9252 BSC <0.01% <$0.000001 568,754,578.9321 $0.9172 BSC <0.01% $0.004731 193.2854 $0.9144 BSC <0.01% <$0.000001 8,597,574,350.9893 $0.9099 BSC <0.01% $0.005879 153.8729 $0.9046 BSC <0.01% $0.001138 789.0084 $0.8982 BSC <0.01% $0.000469 1,913.2289 $0.898 BSC <0.01% $0.023793 37.6822 $0.8965 BSC <0.01% $0.025369 34.7842 $0.8824 BSC <0.01% $0.00375 234.0791 $0.8779 BSC <0.01% $84,376 0.00001032 $0.8707 BSC <0.01% <$0.000001 648,730,365.0795 $0.8433 BSC <0.01% $0.000332 2,512.2776 $0.834 BSC <0.01% $0.000004 206,790.3155 $0.8266 BSC <0.01% <$0.000001 25,720,881,284.8844 $0.8247 BSC <0.01% $0.000085 9,559.5291 $0.8164 BSC <0.01% $0.000103 7,903.6291 $0.8135 BSC <0.01% $0.000814 998.047 $0.8128 BSC <0.01% $0.433613 1.8452 $0.8001 BSC <0.01% $0.080482 9.8057 $0.7891 BSC <0.01% $0.014543 54 $0.7852 BSC <0.01% $0.091217 8.5023 $0.7755 BSC <0.01% $0.000009 81,960.0975 $0.7745 BSC <0.01% $0.059657 12.8627 $0.7673 BSC <0.01% $0.000424 1,804.828 $0.7657 BSC <0.01% $0.001682 451.8094 $0.76 BSC <0.01% $0.001332 558.09 $0.7431 BSC <0.01% $0.000449 1,618.2814 $0.7264 BSC <0.01% $0.558625 1.2948 $0.7232 BSC <0.01% $0.000182 3,886.0059 $0.7084 BSC <0.01% $0.000444 1,549.3058 $0.6879 BSC <0.01% $0.013095 52.2368 $0.684 BSC <0.01% $0.000676 1,009.5211 $0.6822 BSC <0.01% $0.231913 2.905 $0.6737 BSC <0.01% $0.000065 10,411.2261 $0.672 BSC <0.01% $0.011406 58.8265 $0.6709 BSC <0.01% $0.000002 314,459.8852 $0.6666 BSC <0.01% <$0.000001 26,502,063,997,342,400 $0.6625 BSC <0.01% $0.000001 791,660.3859 $0.6594 BSC <0.01% $0.042884 14.8113 $0.6351 BSC <0.01% $0.004493 141.3284 $0.6349 BSC <0.01% $0.001659 380.8933 $0.632 BSC <0.01% $0.000429 1,474.0549 $0.632 BSC <0.01% <$0.000001 3,943,307.4855 $0.6297 BSC <0.01% $0.004939 127.4436 $0.6295 BSC <0.01% <$0.000001 368,400,791.1389 $0.6076 BSC <0.01% $0.000094 6,340.8303 $0.5988 BSC <0.01% <$0.000001 5,658,525,552,797.65 $0.5968 BSC <0.01% $0.085467 6.907 $0.5903 BSC <0.01% $0.055959 10.3483 $0.579 BSC <0.01% $0.005495 105.207 $0.5781 BSC <0.01% <$0.000001 1,010,352,793.2823 $0.5772 BSC <0.01% $0.000018 32,415.9207 $0.5714 BSC <0.01% $0.000001 615,638.1865 $0.5673 BSC <0.01% $0.006599 85.9225 $0.567 BSC <0.01% <$0.000001 4,814,241,793.5979 $0.5602 BSC <0.01% <$0.000001 3,266,868,464.7015 $0.5465 BSC <0.01% $0.000014 37,650.5988 $0.5368 BSC <0.01% $0.000006 94,157.9407 $0.5367 BSC <0.01% <$0.000001 1,332,822,073.2649 $0.5331 BSC <0.01% <$0.000001 1,887,783.6622 $0.5299 BSC <0.01% $0.011392 45.1979 $0.5148 BSC <0.01% $0.000254 2,014.8834 $0.5114 BSC <0.01% $0.000008 64,915.4162 $0.5095 BSC <0.01% $0.020007 25.3967 $0.5081 BSC <0.01% $0.003342 151.3289 $0.5056 BSC <0.01% $0.000002 240,471.7687 $0.4999 BSC <0.01% <$0.000001 1,217,310,548,325.14 $0.4944 BSC <0.01% $0.552316 0.8944 $0.4939 BSC <0.01% $0.162877 3.004 $0.4892 BSC <0.01% $0.002209 221.0428 $0.4883 BSC <0.01% $0.123876 3.9417 $0.4882 BSC <0.01% $0.000783 623.191 $0.4882 BSC <0.01% $1.04 0.4657 $0.4855 BSC <0.01% $0.001719 279.7606 $0.4808 BSC <0.01% $0.002787 172.0199 $0.4794 BSC <0.01% <$0.000001 195,486,340.4698 $0.4789 BSC <0.01% $0.001399 334.4766 $0.4679 BSC <0.01% $0.028022 16.6832 $0.4674 BSC <0.01% $0.139066 3.2561 $0.4528 BSC <0.01% $0.000069 6,341.6997 $0.439 BSC <0.01% $0.007068 61.9777 $0.438 BSC <0.01% <$0.000001 361,735,135,655.529 $0.4348 BSC <0.01% <$0.000001 775,029,567,495.37 $0.4332 BSC <0.01% $2.15 0.1981 $0.4259 BSC <0.01% $0.000268 1,574.5065 $0.4221 BSC <0.01% $0.00007 6,047.2897 $0.4202 BSC <0.01% $0.058035 7.205 $0.4181 BSC <0.01% $0.042792 9.4866 $0.4059 BSC <0.01% $0.000118 3,439.7617 $0.4054 BSC <0.01% <$0.000001 3,448,749,538.8143 $0.4018 BSC <0.01% $0.000304 1,297.7203 $0.3944 BSC <0.01% $0.000225 1,747.4356 $0.3927 BSC <0.01% $0.034115 11.4705 $0.3913 BSC <0.01% $0.000015 26,119.9237 $0.3908 BSC <0.01% $0.018146 21.2693 $0.3859 BSC <0.01% <$0.000001 2,622,249,591.0407 $0.38 BSC <0.01% $1.1 0.3462 $0.3794 BSC <0.01% $0.000889 426.3433 $0.3791 BSC <0.01% <$0.000001 444,339,851.5236 $0.3715 BSC <0.01% $6.86 0.0534 $0.3664 BSC <0.01% $0.001442 253.643 $0.3658 BSC <0.01% $0.210642 1.7213 $0.3625 BSC <0.01% $0.000289 1,239.7414 $0.3577 BSC <0.01% $0.000397 880.6119 $0.3494 BSC <0.01% $0.000359 972.7623 $0.3488 BSC <0.01% $0.000018 19,318.3941 $0.3461 BSC <0.01% $0.416308 0.8279 $0.3446 BSC <0.01% <$0.000001 2,154,830,613.5599 $0.3436 BSC <0.01% <$0.000001 2,684,808,984.1589 $0.338 BSC <0.01% $0.000115 2,926.0934 $0.3372 BSC <0.01% $0.095974 3.3823 $0.3246 BSC <0.01% $39.59 0.00805315 $0.3188 BSC <0.01% $0.024215 12.7538 $0.3088 BSC <0.01% $0.000162 1,906.139 $0.3084 BSC <0.01% $0.056078 5.4546 $0.3058 BSC <0.01% $0.015405 19.7816 $0.3047 BSC <0.01% $0.069269 4.3227 $0.2994 BSC <0.01% $0.000921 325.2534 $0.2994 BSC <0.01% $0.004349 68.4409 $0.2976 BSC <0.01% <$0.000001 11,892,407 $0.2906 BSC <0.01% $0.005663 50.4387 $0.2856 BSC <0.01% $0.369102 0.7733 $0.2854 BSC <0.01% $0.000192 1,409.733 $0.2713 BSC <0.01% $0.650342 0.4147 $0.2696 BSC <0.01% $0.003621 73.9421 $0.2677 BSC <0.01% $0.00036 743.1169 $0.2673 BSC <0.01% $0.000283 942.4443 $0.2667 BSC <0.01% $0.058266 4.5198 $0.2633 BSC <0.01% $0.003803 68.7685 $0.2615 BSC <0.01% $0.069477 3.6176 $0.2513 BSC <0.01% <$0.000001 1,879,532,611,199.58 $0.2478 BSC <0.01% <$0.000001 1,228,543,006.0079 $0.2457 BSC <0.01% $0.000263 927.795 $0.2442 BSC <0.01% <$0.000001 2,128,369,961.9718 $0.2437 BSC <0.01% $0.000063 3,821.677 $0.242 BSC <0.01% $0.038977 6.1948 $0.2414 BSC <0.01% <$0.000001 6,775,416,501,704.47 $0.2393 BSC <0.01% $0.000439 532.6528 $0.234 BSC <0.01% <$0.000001 994,499,535.1237 $0.233 BSC <0.01% $1.21 0.1931 $0.2327 BSC <0.01% $0.002144 107.4149 $0.2302 BSC <0.01% <$0.000001 79,054,754.7 $0.2213 BSC <0.01% $0.008936 24.634 $0.2201 BSC <0.01% $0.00128 171.4325 $0.2194 BSC <0.01% $0.168509 1.2851 $0.2165 BSC <0.01% <$0.000001 396,009,962.1895 $0.2146 BSC <0.01% $0.019304 10.9823 $0.212 BSC <0.01% $0.001774 119.0669 $0.2112 BSC <0.01% $0.011922 17.7195 $0.2112 BSC <0.01% $0.000176 1,195.1588 $0.2099 BSC <0.01% $0.005012 41.3774 $0.2073 BSC <0.01% $0.000201 1,022.9497 $0.2054 BSC <0.01% $0.006143 33.1781 $0.2038 BSC <0.01% $7.22 0.0278 $0.2004 BSC <0.01% $1.76 0.1131 $0.199 BSC <0.01% $0.000159 1,243.04 $0.198 BSC <0.01% $0.009637 19.517 $0.188 BSC <0.01% $0.003634 51.697 $0.1878 BSC <0.01% $0.000098 1,916.3242 $0.1873 BSC <0.01% $0.010182 18.0021 $0.1833 BSC <0.01% $0.000007 27,706.6304 $0.182 BSC <0.01% $0.055595 3.1882 $0.1772 BSC <0.01% $0.000275 639.2414 $0.1754 BSC <0.01% $0.000114 1,520.4017 $0.1731 BSC <0.01% $0.001049 162.6241 $0.1706 BSC <0.01% <$0.000001 19,554,536.0564 $0.1701 BSC <0.01% $0.004568 36.4308 $0.1664 BSC <0.01% $0.000003 61,196.5718 $0.1644 BSC <0.01% <$0.000001 522,283.0549 $0.1601 BSC <0.01% $0.994032 0.16 $0.159 BSC <0.01% $0.007431 21.3391 $0.1585 BSC <0.01% $0.000001 142,999.4593 $0.1572 BSC <0.01% $0.005727 27.166 $0.1555 BSC <0.01% $0.89969 0.172 $0.1547 BSC <0.01% $3.35 0.0448 $0.1499 BSC <0.01% <$0.000001 16,289,308.71 $0.1493 BSC <0.01% $0.018347 8.1089 $0.1487 BSC <0.01% $1.54 0.0963 $0.1482 BSC <0.01% $0.000669 220.3662 $0.1473 BSC <0.01% $0.000254 559.5939 $0.1419 BSC <0.01% $0.002708 52.0863 $0.141 BSC <0.01% $0.014373 9.8078 $0.1409 BSC <0.01% $0.002072 67.9274 $0.1407 BSC <0.01% $0.001681 82.3089 $0.1383 BSC <0.01% $0.00253 54.5868 $0.1381 BSC <0.01% $0.011675 11.8307 $0.1381 BSC <0.01% <$0.000001 14,206,636,621.1226 $0.137 BSC <0.01% $0.000045 2,988.501 $0.1351 BSC <0.01% $0.006921 19.4211 $0.1344 BSC <0.01% $0.000031 4,321.5939 $0.1342 BSC <0.01% <$0.000001 223,039,635.8006 $0.1338 BSC <0.01% $0.003243 41.0983 $0.1332 BSC <0.01% $0.088314 1.507 $0.133 BSC <0.01% $5.35 0.0248 $0.1326 BSC <0.01% $0.000023 5,689.5082 $0.1298 BSC <0.01% $1.34 0.0966 $0.1294 BSC <0.01% $0.013661 9.4149 $0.1286 BSC <0.01% $0.069062 1.8596 $0.1284 BSC <0.01% $0.004594 27.4286 $0.1259 BSC <0.01% <$0.000001 28,391,959,727.9281 $0.1258 BSC <0.01% $0.397395 0.311 $0.1235 BSC <0.01% $0.000001 151,094.2717 $0.1231 BSC <0.01% <$0.000001 1,438,604,422.8631 $0.1215 BSC <0.01% $0.000041 2,941.1935 $0.1202 BSC <0.01% $0.003836 31.1176 $0.1193 BSC <0.01% $0.030996 3.8411 $0.119 BSC <0.01% <$0.000001 943,708.3073 $0.1167 BSC <0.01% $0.000984 118.6595 $0.1167 BSC <0.01% $0.001364 83.282 $0.1135 BSC <0.01% $0.000106 1,073.9474 $0.1133 BSC <0.01% <$0.000001 243,098.6545 $0.1117 BSC <0.01% <$0.000001 553,900,604.9456 $0.1107 BSC <0.01% $0.015004 7.2947 $0.1094 BSC <0.01% <$0.000001 217,276.6653 $0.1081 BSC <0.01% <$0.000001 1,080,585,864.2667 $0.108 BSC <0.01% <$0.000001 1,070,809,028.5246 $0.107 BSC <0.01% $0.000021 4,979.7552 $0.1055 BSC <0.01% $0.184796 0.5694 $0.1052 BSC <0.01% $0.00029 362.7441 $0.1052 BSC <0.01% <$0.000001 133,508,790.2134 $0.1045 BSC <0.01% <$0.000001 14,918,089,659.0312 $0.1029 BSC <0.01% $550.93 0.00000539 $0.002971 FTM 48.78% $0.006348 3,295,278,248.6043 $20,917,964.98 FTM <0.01% <$0.000001 4,236,481,348.6246 $323.67 FTM <0.01% $0.003455 20,059.0947 $69.31 FTM <0.01% $66,984 0.00013601 $9.11 FTM <0.01% $2,421.37 0.0025067 $6.07 FTM <0.01% $0.000062 74,572.2702 $4.66 FTM <0.01% $0.005418 825.6485 $4.47 FTM <0.01% $23.02 0.1619 $3.73 FTM <0.01% $1.27 2.8973 $3.68 FTM <0.01% $0.030343 114.8122 $3.48 FTM <0.01% $0.999871 2.9422 $2.94 FTM <0.01% $0.000174 15,436.5335 $2.69 FTM <0.01% $0.980955 2.2849 $2.24 FTM <0.01% $0.298946 7.2063 $2.15 FTM <0.01% $0.449065 4.644 $2.09 FTM <0.01% $0.000184 9,073.8658 $1.67 FTM <0.01% $0.012105 135.5075 $1.64 FTM <0.01% $0.120937 13.4783 $1.63 FTM <0.01% $0.229991 5.3753 $1.24 FTM <0.01% $9.63 0.1279 $1.23 FTM <0.01% $0.00421 248.6555 $1.05 FTM <0.01% $0.001957 454.7529 $0.8898 FTM <0.01% <$0.000001 1,682,183,680.0848 $0.6728 FTM <0.01% $0.194471 3.447 $0.6703 FTM <0.01% $0.000112 5,562.8906 $0.6229 FTM <0.01% $1.1 0.5618 $0.618 FTM <0.01% $0.022504 27.2984 $0.6143 FTM <0.01% $0.6959 0.8426 $0.5863 FTM <0.01% $0.630069 0.8355 $0.5263 FTM <0.01% $0.000305 1,492.8806 $0.4559 FTM <0.01% $0.005435 83.7295 $0.4551 FTM <0.01% $0.292864 1.347 $0.3944 FTM <0.01% $0.6606 0.4944 $0.3266 FTM <0.01% <$0.000001 636,164.2415 $0.2295 FTM <0.01% $1.64 0.1343 $0.2203 FTM <0.01% $0.018145 11.2 $0.2032 FTM <0.01% $0.996736 0.1819 $0.1813 FTM <0.01% $0.014677 7.047 $0.1034 ETH <0.01% $0.683466 1,058.3147 $723.32 ETH <0.01% $0.071319 7,655.0328 $545.95 ETH <0.01% $0.026291 14,728.5393 $387.23 ETH <0.01% $0.008529 23,713.7868 $202.25 ETH <0.01% <$0.000001 1,012,358,373.2539 $158.27 ETH <0.01% $0.000412 368,581.2788 $151.76 ETH <0.01% $0.000384 354,013.9943 $135.81 ETH <0.01% <$0.000001 241,877,590,171.713 $133.22 ETH <0.01% $0.024225 5,283.2563 $127.99 ETH <0.01% $0.182498 662.7338 $120.95 ETH <0.01% $128.77 0.8542 $110 ETH <0.01% <$0.000001 254,667,958.0731 $109.88 ETH <0.01% <$0.000001 6,789,080,140.102 $106.04 ETH <0.01% $0.000084 1,217,246.7963 $101.9 ETH <0.01% <$0.000001 1,119,053,250.6975 $99.48 ETH <0.01% $0.573507 169.8654 $97.42 ETH <0.01% $1 94.1867 $94.28 ETH <0.01% $0.000018 5,261,208.0828 $94.18 ETH <0.01% $0.474696 193.0598 $91.64 ETH <0.01% <$0.000001 18,072,817,527,867.1 $91.59 ETH <0.01% $0.999089 91.2808 $91.2 ETH <0.01% $0.012101 7,201.0513 $87.14 ETH <0.01% $0.002333 36,310.8145 $84.7 ETH <0.01% $1.57 51.0997 $80.23 ETH <0.01% $0.020199 3,838.5475 $77.54 ETH <0.01% <$0.000001 6,179,851,624.5086 $71.97 ETH <0.01% $1.22 55.0251 $67.13 ETH <0.01% $0.011761 5,591.644 $65.76 ETH <0.01% $3.72 17.1342 $63.75 ETH <0.01% $4,476.62 0.0141 $62.98 ETH <0.01% $0.602906 103.4763 $62.39 ETH <0.01% $0.163555 374.5433 $61.26 ETH <0.01% $278.5 0.2152 $59.92 ETH <0.01% $2.74 21.6665 $59.37 ETH <0.01% $547.93 0.1063 $58.24 ETH <0.01% $0.954583 60.8887 $58.12 ETH <0.01% $0.800115 71.8262 $57.47 ETH <0.01% $0.038797 1,450.5582 $56.28 ETH <0.01% $330.36 0.1663 $54.95 ETH <0.01% $0.759565 69.5286 $52.81 ETH <0.01% $48.58 1.0735 $52.15 ETH <0.01% $0.221134 234.3329 $51.82 ETH <0.01% $0.017334 2,948.5706 $51.11 ETH <0.01% $0.265698 189.5888 $50.37 ETH <0.01% $0.051662 968.8003 $50.05 ETH <0.01% $55.85 0.8829 $49.31 ETH <0.01% $7.9 6.2326 $49.23 ETH <0.01% $0.055019 890.9015 $49.02 ETH <0.01% $2,397.8 0.0197 $47.2 ETH <0.01% $0.068029 691.9583 $47.07 ETH <0.01% $0.000575 81,819.8147 $47.04 ETH <0.01% $0.000004 12,243,887.1519 $46.89 ETH <0.01% $0.153026 304.8698 $46.65 ETH <0.01% $0.014743 3,156.514 $46.54 ETH <0.01% $0.001654 27,930.9949 $46.2 ETH <0.01% <$0.000001 355,000,957.7367 $45.49 ETH <0.01% $6.19 7.3246 $45.34 ETH <0.01% $0.789601 57.1095 $45.09 ETH <0.01% $0.666322 67.216 $44.79 ETH <0.01% $0.000011 3,892,298.7307 $44.18 ETH <0.01% $0.1174 375.604 $44.1 ETH <0.01% $0.094184 466.627 $43.95 ETH <0.01% $48.72 0.8999 $43.84 ETH <0.01% $0.328729 132.8312 $43.67 ETH <0.01% $0.030689 1,421.0589 $43.61 ETH <0.01% $0.161432 262.6973 $42.41 ETH <0.01% $0.028717 1,466.2999 $42.11 ETH <0.01% <$0.000001 101,453,350.2577 $42.09 ETH <0.01% $0.02376 1,763.8207 $41.91 ETH <0.01% $0.063649 655.0062 $41.69 ETH <0.01% $0.246114 168.0554 $41.36 ETH <0.01% $0.996811 40.8927 $40.76 ETH <0.01% $0.000338 119,467.0291 $40.42 ETH <0.01% $0.071652 553.8002 $39.68 ETH <0.01% $0.053978 719.4983 $38.84 ETH <0.01% $0.029533 1,309.1009 $38.66 ETH <0.01% $0.013472 2,860.3643 $38.54 ETH <0.01% $0.000009 4,055,710.3925 $38.33 ETH <0.01% $0.291488 131.2611 $38.26 ETH <0.01% $0.003798 9,964.536 $37.85 ETH <0.01% $0.122786 305.0679 $37.46 ETH <0.01% $0.060766 609.3446 $37.03 ETH <0.01% $0.008132 4,549.3079 $37 ETH <0.01% $0.000057 646,419.439 $36.86 ETH <0.01% $0.910973 40.1811 $36.6 ETH <0.01% $1.04 35.2511 $36.52 ETH <0.01% $0.005668 6,406.0925 $36.31 ETH <0.01% $0.1489 241.6797 $35.99 ETH <0.01% $0.000145 246,222.1877 $35.61 ETH <0.01% $0.113181 313.7624 $35.51 ETH <0.01% $0.034139 1,031.8682 $35.23 ETH <0.01% $0.000693 50,674.6869 $35.12 ETH <0.01% $0.401036 87.5102 $35.09 ETH <0.01% $29.52 1.1822 $34.9 ETH <0.01% <$0.000001 605,786,195.0625 $34.65 ETH <0.01% $0.048326 716.3488 $34.62 ETH <0.01% <$0.000001 117,981,383.58 $34.42 ETH <0.01% $0.999406 33.3131 $33.29 ETH <0.01% $0.144101 230.5487 $33.22 ETH <0.01% $0.020321 1,633.8402 $33.2 ETH <0.01% $0.163859 201.968 $33.09 ETH <0.01% $0.000437 75,146.1862 $32.84 ETH <0.01% $2.05 15.9895 $32.78 ETH <0.01% $0.01368 2,393.3361 $32.74 ETH <0.01% $0.193406 169.0619 $32.7 ETH <0.01% $0.025019 1,306.4431 $32.69 ETH <0.01% $2.26 14.4018 $32.55 ETH <0.01% $0.000158 205,289.2447 $32.47 ETH <0.01% $0.058035 558.6431 $32.42 ETH <0.01% <$0.000001 5,826,303,631,695.33 $32.18 ETH <0.01% $0.850087 37.8191 $32.15 ETH <0.01% $0.012208 2,615.3504 $31.93 ETH <0.01% $0.515754 61.6117 $31.78 ETH <0.01% $0.004115 7,683.641 $31.62 ETH <0.01% $0.028337 1,111.1122 $31.49 ETH <0.01% <$0.000001 2,602,728,815.1149 $31.46 ETH <0.01% $67,063 0.00046739 $31.34 ETH <0.01% $0.465961 66.3019 $30.89 ETH <0.01% $0.00329 9,225.0236 $30.35 ETH <0.01% $0.465877 65.121 $30.34 ETH <0.01% $0.110231 275.1186 $30.33 ETH <0.01% $0.10198 297.154 $30.3 ETH <0.01% $6.25 4.7784 $29.87 ETH <0.01% <$0.000001 7,536,283,455.0011 $29.84 ETH <0.01% $0.000772 38,441.1776 $29.66 ETH <0.01% $0.010421 2,832.5179 $29.52 ETH <0.01% <$0.000001 74,119,364.1755 $29.44 ETH <0.01% $0.056608 517.2468 $29.28 ETH <0.01% $263.8 0.1099 $29 ETH <0.01% $0.000939 30,415.3317 $28.57 ETH <0.01% $0.000313 91,243.2882 $28.57 ETH <0.01% $0.069862 408.8006 $28.56 ETH <0.01% $0.003211 8,776.9253 $28.18 ETH <0.01% $0.009414 2,988.2591 $28.13 ETH <0.01% $2.99 9.4004 $28.11 ETH <0.01% $0.105434 266.2773 $28.07 ETH <0.01% $0.0007 40,098.6539 $28.05 ETH <0.01% $0.022789 1,228.3085 $27.99 ETH <0.01% $0.263087 106.3114 $27.97 ETH <0.01% $0.017764 1,571.8571 $27.92 ETH <0.01% $0.007309 3,730.3481 $27.26 ETH <0.01% $0.056623 478.4312 $27.09 ETH <0.01% $0.040347 671.1346 $27.08 ETH <0.01% $104.62 0.2584 $27.03 ETH <0.01% $0.254736 103.8783 $26.46 ETH <0.01% $0.488483 53.8626 $26.31 ETH <0.01% $0.907858 28.9279 $26.26 ETH <0.01% $2,424.11 0.0108 $26.26 ETH <0.01% $7.34 3.5607 $26.14 ETH <0.01% $1.05 24.5284 $25.88 ETH <0.01% $2,867.56 0.00900383 $25.82 ETH <0.01% $0.37343 68.9904 $25.76 ETH <0.01% <$0.000001 95,204,227,139.7396 $25.6 ETH <0.01% $0.034217 747.5393 $25.58 ETH <0.01% $0.000004 6,119,269.1824 $25.46 ETH <0.01% $0.000178 142,966.2733 $25.44 ETH <0.01% $0.014792 1,706.2146 $25.24 ETH <0.01% $0.000713 35,411.8894 $25.23 ETH <0.01% $0.009405 2,643.6084 $24.86 ETH <0.01% <$0.000001 227,881,755.8267 $24.84 ETH <0.01% $2.53 9.6816 $24.47 ETH <0.01% $0.05681 426.1 $24.21 ETH <0.01% $0.004889 4,925.3324 $24.08 ETH <0.01% $0.000178 133,293.7515 $23.76 ETH <0.01% $0.649705 36.4605 $23.69 ETH <0.01% $0.017344 1,362.6938 $23.63 ETH <0.01% $0.163295 141.8732 $23.17 ETH <0.01% $0.006454 3,588.1214 $23.16 ETH <0.01% $0.051254 450.0652 $23.07 ETH <0.01% $0.110921 207.439 $23.01 ETH <0.01% $0.000382 60,253.5859 $23 ETH <0.01% $0.358342 64.024 $22.94 ETH <0.01% $0.68696 33.3669 $22.92 ETH <0.01% $0.296983 77.0634 $22.89 ETH <0.01% $0.000411 54,346.6843 $22.33 ETH <0.01% $2.71 8.2405 $22.3 ETH <0.01% $0.013571 1,627.4504 $22.09 ETH <0.01% $0.034132 646.8026 $22.08 ETH <0.01% $0.993771 22.2133 $22.07 ETH <0.01% $0.004678 4,707.8392 $22.02 ETH <0.01% $0.006936 3,151.0578 $21.85 ETH <0.01% $0.000024 897,608.6842 $21.78 ETH <0.01% $0.000022 970,290.883 $21.71 ETH <0.01% $0.287418 74.1569 $21.31 ETH <0.01% $0.008173 2,599.2847 $21.24 ETH <0.01% $0.125424 167.7733 $21.04 ETH <0.01% $0.055842 368.1134 $20.56 ETH <0.01% $0.431052 47.6478 $20.54 ETH <0.01% $0.003007 6,782.1535 $20.4 ETH <0.01% $0.000425 47,887.743 $20.37 ETH <0.01% $0.191957 104.829 $20.12 ETH <0.01% <$0.000001 46,514,398.2326 $19.96 ETH <0.01% $0.002711 7,286.9497 $19.75 ETH <0.01% $16.61 1.1837 $19.66 ETH <0.01% $0.000002 9,511,462.4055 $19.21 ETH <0.01% $2.22 8.6446 $19.16 ETH <0.01% $0.095887 198.5357 $19.04 ETH <0.01% $0.264799 71.7835 $19.01 ETH <0.01% $0.035317 535.906 $18.93 ETH <0.01% $2,484.86 0.00761079 $18.91 ETH <0.01% $0.03886 486.0707 $18.89 ETH <0.01% $0.003553 5,312.5255 $18.87 ETH <0.01% $0.178916 105.0638 $18.8 ETH <0.01% $0.003034 6,162.4591 $18.7 ETH <0.01% $2.1 8.7979 $18.48 ETH <0.01% <$0.000001 363,129,299.9193 $18.46 ETH <0.01% $0.108273 169.4857 $18.35 ETH <0.01% $0.011445 1,589.5632 $18.19 ETH <0.01% <$0.000001 1,834,141,964.3392 $18.15 ETH <0.01% $0.552144 32.7914 $18.11 ETH <0.01% $0.000696 25,931.7103 $18.05 ETH <0.01% $0.002653 6,777.6694 $17.98 ETH <0.01% $57,671.17 0.00031037 $17.9 ETH <0.01% $0.00002 886,609.6144 $17.74 ETH <0.01% $2.16 8.1633 $17.63 ETH <0.01% $0.0004 43,976.4732 $17.61 ETH <0.01% <$0.000001 131,779,783.9421 $17.56 ETH <0.01% $0.009492 1,846.9881 $17.53 ETH <0.01% $0.923465 18.843 $17.4 ETH <0.01% $1.07 16.0406 $17.21 ETH <0.01% $0.002112 8,093.8334 $17.1 ETH <0.01% $59.99 0.2813 $16.88 ETH <0.01% $0.001479 11,367.4658 $16.81 ETH <0.01% $0.000638 26,255.4204 $16.75 ETH <0.01% $0.034272 488.4039 $16.74 ETH <0.01% $0.582266 28.709 $16.72 ETH <0.01% $0.001266 13,140.78 $16.64 ETH <0.01% <$0.000001 6,649,603,295.3879 $16.61 ETH <0.01% $0.156784 105.7837 $16.59 ETH <0.01% $0.34969 47.4096 $16.58 ETH <0.01% $0.556206 29.7207 $16.53 ETH <0.01% $0.062995 260.5685 $16.41 ETH <0.01% <$0.000001 33,478,970.9985 $16.34 ETH <0.01% $0.00106 15,406.7959 $16.34 ETH <0.01% $0.189498 85.826 $16.26 ETH <0.01% <$0.000001 6,670,459,250.3983 $16.19 ETH <0.01% $0.001148 13,978.3925 $16.04 ETH <0.01% $0.002886 5,546.4891 $16.01 ETH <0.01% $0.039448 404.9077 $15.97 ETH <0.01% $0.013136 1,209.5485 $15.89 ETH <0.01% $0.117067 135.0862 $15.81 ETH <0.01% $1.72 9.0991 $15.65 ETH <0.01% $0.023574 656.5208 $15.48 ETH <0.01% $0.000016 948,012.631 $15.43 ETH <0.01% $11.13 1.3797 $15.36 ETH <0.01% $0.003192 4,806.1413 $15.34 ETH <0.01% $0.038524 397.6315 $15.32 ETH <0.01% $0.030449 497.4136 $15.15 ETH <0.01% $0.054362 277.0023 $15.06 ETH <0.01% $0.998796 15.0192 $15 ETH <0.01% $0.24563 61.009 $14.99 ETH <0.01% $0.16638 89.8951 $14.96 ETH <0.01% $0.061795 241.3462 $14.91 ETH <0.01% $0.147487 100.9838 $14.89 ETH <0.01% $1.9 7.7652 $14.75 ETH <0.01% $0.045497 322.0254 $14.65 ETH <0.01% $0.009908 1,464.7322 $14.51 ETH <0.01% $0.020192 713.1242 $14.4 ETH <0.01% $1.09 13.2 $14.36 ETH <0.01% $12 1.1971 $14.36 ETH <0.01% $0.016345 874.1885 $14.29 ETH <0.01% $0.014274 997.452 $14.24 ETH <0.01% $0.139784 101.6393 $14.21 ETH <0.01% $36.06 0.3893 $14.04 ETH <0.01% $0.442199 31.6998 $14.02 ETH <0.01% $0.002046 6,837.0264 $13.99 ETH <0.01% $0.036709 375.1949 $13.77 ETH <0.01% $0.003314 4,144.7274 $13.73 ETH <0.01% $0.0225 610.0719 $13.73 ETH <0.01% $0.148584 92.3734 $13.73 ETH <0.01% $0.115833 118.3979 $13.71 ETH <0.01% $2.64 5.1883 $13.7 ETH <0.01% $0.016527 825.8807 $13.65 ETH <0.01% $0.889273 15.346 $13.65 ETH <0.01% $0.004232 3,222.2276 $13.64 ETH <0.01% $0.021372 637.5034 $13.62 ETH <0.01% $0.124818 108.7576 $13.57 ETH <0.01% $0.002201 6,121.6188 $13.47 ETH <0.01% $0.000021 631,616.4777 $13.42 ETH <0.01% $0.012084 1,107.6062 $13.38 ETH <0.01% <$0.000001 62,458,729,456.7955 $13.2 ETH <0.01% $0.007534 1,730.0793 $13.03 ETH <0.01% $0.039188 332.1855 $13.02 ETH <0.01% $0.022725 562.3449 $12.78 ETH <0.01% $0.024433 522.0194 $12.75 ETH <0.01% $0.304275 41.8228 $12.73 ETH <0.01% $2,300.87 0.0054882 $12.63 ETH <0.01% $0.004939 2,549.4691 $12.59 ETH <0.01% $0.000001 23,618,655.351 $12.59 ETH <0.01% $0.001113 11,273.7366 $12.55 ETH <0.01% $0.000001 13,902,358.7399 $12.53 ETH <0.01% $0.001312 9,537.3057 $12.52 ETH <0.01% <$0.000001 31,632,042.0325 $12.5 ETH <0.01% $0.001041 11,835.3182 $12.33 ETH <0.01% $1.19 10.3288 $12.29 ETH <0.01% $0.191615 63.7429 $12.21 ETH <0.01% $1.64 7.3483 $12.05 ETH <0.01% $0.005599 2,152.1707 $12.05 ETH <0.01% $0.001057 11,364.8638 $12.01 ETH <0.01% $0.486339 24.6796 $12 ETH <0.01% $0.000033 361,970.829 $11.97 ETH <0.01% $0.000014 859,821.3717 $11.92 ETH <0.01% $0.012324 962.1865 $11.86 ETH <0.01% $0.001171 10,059.5647 $11.78 ETH <0.01% $100.46 0.117 $11.75 ETH <0.01% $1.05 11.1057 $11.71 ETH <0.01% $0.994032 11.7405 $11.67 ETH <0.01% <$0.000001 1,336,753,842.2684 $11.59 ETH <0.01% $0.000045 258,958.2195 $11.54 ETH <0.01% $0.083758 136.3537 $11.42 ETH <0.01% $0.221519 51.1963 $11.34 ETH <0.01% $0.002933 3,844.8165 $11.28 ETH <0.01% $0.014347 779.67 $11.19 ETH <0.01% $0.000764 14,618.3003 $11.17 ETH <0.01% $0.012358 899.8472 $11.12 ETH <0.01% $0.000155 71,011 $11.03 ETH <0.01% $0.004542 2,412.3309 $10.96 ETH <0.01% $0.000372 29,405.1891 $10.94 ETH <0.01% $0.060274 181.0554 $10.91 ETH <0.01% $0.001386 7,857.813 $10.89 ETH <0.01% $0.126767 85.3802 $10.82 ETH <0.01% $0.05998 180.2128 $10.81 ETH <0.01% $0.003393 3,185.1512 $10.81 ETH <0.01% $0.041365 260.9126 $10.79 ETH <0.01% $0.041365 260.9126 $10.79 ETH <0.01% $0.378892 28.3236 $10.73 ETH <0.01% $0.323232 33.0812 $10.69 ETH <0.01% $15 0.7103 $10.66 ETH <0.01% $0.058775 180.9042 $10.63 ETH <0.01% $0.005288 2,007.2587 $10.62 ETH <0.01% $0.063198 166.9185 $10.55 ETH <0.01% $0.037209 279.0125 $10.38 ETH <0.01% $0.002092 4,961.6815 $10.38 ETH <0.01% $0.034013 299.5988 $10.19 ETH <0.01% $0.110114 92.2794 $10.16 ETH <0.01% $0.05913 169.2059 $10.01 ETH <0.01% $1.75 5.7138 $9.99 ETH <0.01% $0.348607 28.6418 $9.98 ETH <0.01% $0.012022 829.0853 $9.97 ETH <0.01% $0.00246 3,981.2602 $9.8 ETH <0.01% $0.352669 27.6983 $9.77 ETH <0.01% $0.000552 17,700.9754 $9.77 ETH <0.01% <$0.000001 122,029,747.7241 $9.7 ETH <0.01% $0.090815 106.3968 $9.66 ETH <0.01% $0.006227 1,533.9952 $9.55 ETH <0.01% $0.0037 2,576.8057 $9.53 ETH <0.01% $0.096564 98.7227 $9.53 ETH <0.01% $1 9.5154 $9.52 ETH <0.01% <$0.000001 109,605,817,965.291 $9.33 ETH <0.01% $0.000581 15,985.3826 $9.29 ETH <0.01% $0.052706 174.6738 $9.21 ETH <0.01% $6.05 1.5032 $9.09 ETH <0.01% $0.023676 382.0486 $9.05 ETH <0.01% $0.012871 701.8135 $9.03 ETH <0.01% $0.002128 4,233.1138 $9.01 ETH <0.01% $0.228363 39.405 $9 ETH <0.01% $0.000016 549,831.4157 $8.81 ETH <0.01% $0.048263 182.1968 $8.79 ETH <0.01% $0.009843 872.8196 $8.59 ETH <0.01% $2.05 4.1429 $8.49 ETH <0.01% $0.007376 1,149.0591 $8.48 ETH <0.01% $0.000357 23,621.0938 $8.43 ETH <0.01% $0.023842 352.673 $8.41 ETH <0.01% $0.002487 3,358 $8.35 ETH <0.01% $8.9 0.9367 $8.34 ETH <0.01% $0.001122 7,283.6548 $8.18 ETH <0.01% $0.316218 25.7025 $8.13 ETH <0.01% $0.013568 598.7515 $8.12 ETH <0.01% $0.352076 23.0616 $8.12 ETH <0.01% $5.56 1.4454 $8.04 ETH <0.01% $0.002138 3,721.5705 $7.96 ETH <0.01% $11.48 0.6892 $7.91 ETH <0.01% $0.067014 117.5803 $7.88 ETH <0.01% $0.04414 177.6143 $7.84 ETH <0.01% $3.36 2.3166 $7.78 ETH <0.01% $0.529058 14.6198 $7.73 ETH <0.01% $0.000423 18,185.5 $7.7 ETH <0.01% $250.74 0.0307 $7.7 ETH <0.01% $0.038768 198.1044 $7.68 ETH <0.01% $0.000003 2,354,216.2664 $7.65 ETH <0.01% $0.000001 12,071,724.986 $7.64 ETH <0.01% $0.006592 1,158.9272 $7.64 ETH <0.01% $0.005954 1,276.3425 $7.6 ETH <0.01% $0.013567 557.5858 $7.56 ETH <0.01% $1.15 6.3419 $7.29 ETH <0.01% $0.426776 16.8556 $7.19 ETH <0.01% $0.712601 9.9954 $7.12 ETH <0.01% $0.000001 5,415,101.5164 $6.99 ETH <0.01% $0.054206 128.2585 $6.95 ETH <0.01% $0.025942 267.637 $6.94 ETH <0.01% $0.000003 2,432,565.5784 $6.94 ETH <0.01% $0.051733 131.8716 $6.82 ETH <0.01% $0.00488 1,397.9727 $6.82 ETH <0.01% $0.000633 10,752.6099 $6.81 ETH <0.01% $0.013374 505.4572 $6.76 ETH <0.01% $0.403939 16.6671 $6.73 ETH <0.01% $0.056439 118.9514 $6.71 ETH <0.01% $0.017253 388.3221 $6.7 ETH <0.01% $0.002521 2,645.2751 $6.67 ETH <0.01% $0.004948 1,347.5917 $6.67 ETH <0.01% $0.000329 19,864.9225 $6.54 ETH <0.01% $8.46 0.7635 $6.46 ETH <0.01% $0.005359 1,194.0841 $6.4 ETH <0.01% $0.006364 994.3115 $6.33 ETH <0.01% $0.004754 1,296.5021 $6.16 ETH <0.01% $0.010414 586.8138 $6.11 ETH <0.01% $0.032057 189.7576 $6.08 ETH <0.01% $0.065846 92.0598 $6.06 ETH <0.01% $95.02 0.0618 $5.87 ETH <0.01% $0.001825 3,209.2724 $5.86 ETH <0.01% $0.001169 4,971.8871 $5.81 ETH <0.01% $0.002347 2,474.8185 $5.81 ETH <0.01% $2.06 2.8023 $5.77 ETH <0.01% $1 5.6601 $5.68 ETH <0.01% $0.002645 2,140 $5.66 ETH <0.01% $0.126605 44.3444 $5.61 ETH <0.01% $0.000348 16,098.0876 $5.6 ETH <0.01% $0.231913 24.1351 $5.6 ETH <0.01% $0.003655 1,530.6953 $5.6 ETH <0.01% $0.158154 35.1432 $5.56 ETH <0.01% $1.25 4.4159 $5.52 ETH <0.01% <$0.000001 644,772,423.3893 $5.49 ETH <0.01% $0.010847 500.5003 $5.43 ETH <0.01% $0.00008 67,400.6947 $5.41 ETH <0.01% <$0.000001 7,664,213,179,739.92 $5.4 ETH <0.01% $0.080603 67.0477 $5.4 ETH <0.01% $0.179742 29.8378 $5.36 ETH <0.01% $0.010909 488.8656 $5.33 ETH <0.01% $0.001911 2,784.6892 $5.32 ETH <0.01% $0.000223 23,705.7258 $5.29 ETH <0.01% $0.281917 18.5676 $5.23 ETH <0.01% $1.32 3.9603 $5.23 ETH <0.01% $0.009993 517.9824 $5.18 ETH <0.01% $0.05998 86.1451 $5.17 ETH <0.01% $0.313353 16.4745 $5.16 ETH <0.01% $0.004382 1,175.9628 $5.15 ETH <0.01% $0.000104 49,650.8023 $5.14 ETH <0.01% $0.260224 19.7299 $5.13 ETH <0.01% $0.001135 4,517.81 $5.13 ETH <0.01% $2.19 2.3249 $5.09 ETH <0.01% $0.00193 2,604.1194 $5.03 ETH <0.01% $0.002765 1,803.291 $4.99 ETH <0.01% $0.035526 140.2339 $4.98 ETH <0.01% $1,155.58 0.0042592 $4.92 ETH <0.01% $0.000032 152,399.9642 $4.92 ETH <0.01% $0.004764 1,027.1608 $4.89 ETH <0.01% $0.997799 4.8734 $4.86 ETH <0.01% $0.010958 438.2382 $4.8 ETH <0.01% $0.006472 740.1186 $4.79 ETH <0.01% <$0.000001 713,378,376.8977 $4.78 ETH <0.01% $0.003701 1,278.9995 $4.73 ETH <0.01% $0.000174 27,068.6062 $4.72 ETH <0.01% <$0.000001 124,935,311.9433 $4.7 ETH <0.01% $0.004046 1,156.5905 $4.68 ETH <0.01% $2,548.47 0.00182375 $4.65 ETH <0.01% $0.00688 675.3957 $4.65 ETH <0.01% $0.000553 8,390.6838 $4.64 ETH <0.01% $0.002048 2,253.6493 $4.62 ETH <0.01% $0.293108 15.7072 $4.6 ETH <0.01% $0.004754 961.4289 $4.57 ETH <0.01% $0.001292 3,534.6679 $4.57 ETH <0.01% $1.06 4.3053 $4.56 ETH <0.01% $0.555855 7.896 $4.39 ETH <0.01% $12.32 0.3537 $4.36 ETH <0.01% $0.000008 547,914.8365 $4.35 ETH <0.01% $0.013015 331.042 $4.31 ETH <0.01% $0.004189 1,026.9921 $4.3 ETH <0.01% <$0.000001 3,936,059,689.1904 $4.27 ETH <0.01% $0.004785 892.0367 $4.27 ETH <0.01% $1.1 3.8765 $4.26 ETH <0.01% $0.158139 26.906 $4.25 ETH <0.01% $0.001224 3,462.4907 $4.24 ETH <0.01% $4.14 1 $4.14 ETH <0.01% $0.00002 203,973.3617 $4.13 ETH <0.01% $0.003645 1,127.6813 $4.11 ETH <0.01% $0.001033 3,916.8046 $4.04 ETH <0.01% $0.006009 661.691 $3.98 ETH <0.01% $0.557143 7.1063 $3.96 ETH <0.01% $0.00114 3,458.3077 $3.94 ETH <0.01% $0.327686 12.027 $3.94 ETH <0.01% $0.03174 123.5025 $3.92 ETH <0.01% $0.092332 42.364 $3.91 ETH <0.01% $0.003499 1,107 $3.87 ETH <0.01% <$0.000001 57,247,047.4534 $3.87 ETH <0.01% $0.789778 4.8489 $3.83 ETH <0.01% $0.000203 18,796 $3.82 ETH <0.01% $0.238417 16.0244 $3.82 ETH <0.01% $0.000002 1,948,078.2642 $3.81 ETH <0.01% $307.38 0.0124 $3.8 ETH <0.01% $0.001806 2,099.2401 $3.79 ETH <0.01% $0.226323 16.7051 $3.78 ETH <0.01% $0.000313 12,068.767 $3.77 ETH <0.01% $0.01686 221.2978 $3.73 ETH <0.01% $0.018146 203.683 $3.7 ETH <0.01% $0.019877 185.8439 $3.69 ETH <0.01% $3.41 1 $3.41 ETH <0.01% $0.275905 12.2671 $3.38 ETH <0.01% <$0.000001 796,126,914.8531 $3.34 ETH <0.01% $0.150534 21.9486 $3.3 ETH <0.01% $0.000084 39,325.2376 $3.3 ETH <0.01% $0.000601 5,456.1261 $3.28 ETH <0.01% $0.004736 677.2708 $3.21 ETH <0.01% $0.001044 3,038.9492 $3.17 ETH <0.01% $0.006638 474.3074 $3.15 ETH <0.01% $0.000419 7,505.691 $3.15 ETH <0.01% $22.09 0.1419 $3.13 ETH <0.01% $0.003401 912.64 $3.1 ETH <0.01% $0.995272 3.1157 $3.1 ETH <0.01% $0.115257 26.4869 $3.05 ETH <0.01% $0.00021 14,495.0159 $3.05 ETH <0.01% $0.123876 24.5911 $3.05 ETH <0.01% $0.014238 213.536 $3.04 ETH <0.01% $0.045486 66.3171 $3.02 ETH <0.01% $1.09 2.741 $2.99 ETH <0.01% $0.019957 148.4688 $2.96 ETH <0.01% $0.000603 4,906.3456 $2.96 ETH <0.01% $0.281917 10.4823 $2.96 ETH <0.01% $0.008361 353.2398 $2.95 ETH <0.01% $0.111243 26.5332 $2.95 ETH <0.01% $0.002793 1,047.7012 $2.93 ETH <0.01% $0.034321 85.2611 $2.93 ETH <0.01% $0.089501 32.6868 $2.93 ETH <0.01% $0.315472 9.2153 $2.91 ETH <0.01% <$0.000001 700,033,124.4583 $2.86 ETH <0.01% $0.020756 137.7077 $2.86 ETH <0.01% $0.01261 224.067 $2.83 ETH <0.01% $0.247508 11.3771 $2.82 ETH <0.01% $0.012328 227.5982 $2.81 ETH <0.01% $22.83 0.1207 $2.76 ETH <0.01% $0.011118 246.3781 $2.74 ETH <0.01% $0.022614 120.3506 $2.72 ETH <0.01% $0.000692 3,927.3104 $2.72 ETH <0.01% $3.54 0.7545 $2.67 ETH <0.01% $15.05 0.177 $2.66 ETH <0.01% $0.157925 16.803 $2.65 ETH <0.01% $0.228699 11.5967 $2.65 ETH <0.01% $2,404.77 0.00110105 $2.65 ETH <0.01% $1.64 1.6107 $2.64 ETH <0.01% $0.001275 2,064.7493 $2.63 ETH <0.01% $0.006134 423.3728 $2.6 ETH <0.01% $65,979.94 0.0000389 $2.57 ETH <0.01% $0.005478 467.2833 $2.56 ETH <0.01% $0.01454 174.2797 $2.53 ETH <0.01% $0.053471 47.1264 $2.52 ETH <0.01% $17.41 0.1447 $2.52 ETH <0.01% $0.06823 36.6272 $2.5 ETH <0.01% $0.000017 144,794.8903 $2.5 ETH <0.01% $0.0784 31.8061 $2.49 ETH <0.01% $54.5 0.0457 $2.49 ETH <0.01% $4,203.17 0.00059008 $2.48 ETH <0.01% $0.028197 87.7671 $2.47 ETH <0.01% $0.000007 343,904.5702 $2.45 ETH <0.01% <$0.000001 31,319,607.6978 $2.44 ETH <0.01% $15.9 0.1518 $2.41 ETH <0.01% $0.005947 402.9429 $2.4 ETH <0.01% $0.005544 431.4546 $2.39 ETH <0.01% $0.00042 5,695.1999 $2.39 ETH <0.01% $0.073179 32.2861 $2.36 ETH <0.01% $0.000339 6,953.4708 $2.35 ETH <0.01% $0.030753 76.0822 $2.34 ETH <0.01% <$0.000001 7,451,991,585.7836 $2.34 ETH <0.01% $0.001189 1,955.3898 $2.33 ETH <0.01% $0.001469 1,582.4391 $2.32 ETH <0.01% $0.000155 14,755.3314 $2.28 ETH <0.01% $0.001832 1,237.5312 $2.27 ETH <0.01% <$0.000001 176,973,029.3878 $2.26 ETH <0.01% $0.008833 253.1828 $2.24 ETH <0.01% $0.000004 561,308.6958 $2.21 ETH <0.01% <$0.000001 2,005,186,034.278 $2.2 ETH <0.01% $7.99 0.2695 $2.15 ETH <0.01% $0.047571 44.9286 $2.14 ETH <0.01% $0.000332 6,275.999 $2.09 ETH <0.01% $0.003749 554.3723 $2.08 ETH <0.01% $0.011582 175.2665 $2.03 ETH <0.01% $0.006123 330.0339 $2.02 ETH <0.01% $0.001624 1,209.9715 $1.96 ETH <0.01% $230.7 0.00850802 $1.96 ETH <0.01% $0.292863 6.6786 $1.96 ETH <0.01% $0.04062 48.0927 $1.95 ETH <0.01% $0.000088 22,106.4451 $1.95 ETH <0.01% $0.000472 4,118.9304 $1.94 ETH <0.01% $0.000007 277,486.2649 $1.94 ETH <0.01% $0.0666 28.6111 $1.91 ETH <0.01% $12.72 0.1495 $1.9 ETH <0.01% $0.750128 2.5306 $1.9 ETH <0.01% $0.004349 431.3689 $1.88 ETH <0.01% $0.175228 10.6857 $1.87 ETH <0.01% $0.000944 1,982.6495 $1.87 ETH <0.01% $0.00013 14,313.0241 $1.87 ETH <0.01% $0.005212 354.1876 $1.85 ETH <0.01% $0.070883 26.0111 $1.84 ETH <0.01% $0.000553 3,335.0822 $1.84 ETH <0.01% $0.18539 9.907 $1.84 ETH <0.01% $2,547.36 0.00071157 $1.81 ETH <0.01% $0.0005 3,624.5644 $1.81 ETH <0.01% $0.027108 66.0777 $1.79 ETH <0.01% $0.028571 62.4518 $1.78 ETH <0.01% $0.000008 225,488.9703 $1.77 ETH <0.01% $0.233603 7.5667 $1.77 ETH <0.01% $0.192973 9.1202 $1.76 ETH <0.01% $0.004972 348.9801 $1.74 ETH <0.01% <$0.000001 679,396,197,089.621 $1.74 ETH <0.01% $0.112309 15.4329 $1.73 ETH <0.01% <$0.000001 6,322,861.4263 $1.69 ETH <0.01% $0.006921 237.2769 $1.64 ETH <0.01% $0.002299 710.2133 $1.63 ETH <0.01% $0.48229 3.3841 $1.63 ETH <0.01% $0.000985 1,650.0542 $1.63 ETH <0.01% <$0.000001 6,896,275,985.8208 $1.61 ETH <0.01% <$0.000001 57,328,764,352,240,100 $1.61 ETH <0.01% $0.117422 13.5596 $1.59 ETH <0.01% $0.010979 144.0655 $1.58 ETH <0.01% $0.000154 10,204.2217 $1.58 ETH <0.01% $0.100127 15.6924 $1.57 ETH <0.01% <$0.000001 9,015,224.7137 $1.55 ETH <0.01% <$0.000001 230,705,144.8653 $1.54 ETH <0.01% $0.003139 490.1207 $1.54 ETH <0.01% $0.000004 342,152.4267 $1.52 ETH <0.01% $0.000648 2,338.2704 $1.52 ETH <0.01% $0.236408 6.3753 $1.51 ETH <0.01% $0.323481 4.6075 $1.49 ETH <0.01% $0.000164 9,093.8239 $1.49 ETH <0.01% $0.030817 47.9703 $1.48 ETH <0.01% $0.14959 9.8473 $1.47 ETH <0.01% <$0.000001 21,702,904.0014 $1.47 ETH <0.01% $0.000016 90,697.1798 $1.46 ETH <0.01% $0.001085 1,349.825 $1.46 ETH <0.01% $0.004967 294.3181 $1.46 ETH <0.01% $0.003475 419.6061 $1.46 ETH <0.01% $2.99 0.4882 $1.46 ETH <0.01% $0.007825 181.1054 $1.42 ETH <0.01% $0.000244 5,800.3048 $1.42 ETH <0.01% $0.000107 13,168.5973 $1.4 ETH <0.01% $0.090528 15.4402 $1.4 ETH <0.01% $0.001029 1,336.5911 $1.38 ETH <0.01% $0.059657 23.0328 $1.37 ETH <0.01% $2.69 0.5096 $1.37 ETH <0.01% $0.000003 415,386.904 $1.37 ETH <0.01% $0.012344 110.3027 $1.36 ETH <0.01% <$0.000001 39,772,685.6568 $1.36 ETH <0.01% $16.02 0.0846 $1.36 ETH <0.01% $0.0009 1,500.7273 $1.35 ETH <0.01% $27.93 0.0482 $1.35 ETH <0.01% $0.366207 3.6679 $1.34 ETH <0.01% $0.01617 82.8741 $1.34 ETH <0.01% $0.000967 1,380.3878 $1.33 ETH <0.01% $0.142756 9.2992 $1.33 ETH <0.01% $0.004333 301.0391 $1.3 ETH <0.01% <$0.000001 1,787,825,848.4903 $1.28 ETH <0.01% $0.004561 276.6988 $1.26 ETH <0.01% $0.094214 13.3955 $1.26 ETH <0.01% $0.035982 34.7381 $1.25 ETH <0.01% $105.3 0.0119 $1.25 ETH <0.01% $0.016198 75.7502 $1.23 ETH <0.01% $0.000003 356,962.9089 $1.21 ETH <0.01% $0.026044 46.3498 $1.21 ETH <0.01% $0.00115 1,047.6854 $1.21 ETH <0.01% $26.54 0.0449 $1.19 ETH <0.01% $0.021081 56.3616 $1.19 ETH <0.01% $0.000941 1,254.0874 $1.18 ETH <0.01% $0.006527 179.8003 $1.17 ETH <0.01% $0.040081 29.2425 $1.17 ETH <0.01% $0.012981 90.2189 $1.17 ETH <0.01% $0.005012 233.3044 $1.17 ETH <0.01% $0.01586 73.4587 $1.17 ETH <0.01% $0.187795 6.1405 $1.15 ETH <0.01% $17.18 0.0669 $1.15 ETH <0.01% <$0.000001 10,155,603.0322 $1.15 ETH <0.01% $0.00002 57,062.0862 $1.13 ETH <0.01% $0.000161 6,919.3818 $1.11 ETH <0.01% $6.19 0.1781 $1.1 ETH <0.01% $0.063077 17.3629 $1.1 ETH <0.01% $0.356803 3.0469 $1.09 ETH <0.01% $0.000002 432,562.5618 $1.08 ETH <0.01% $0.000051 21,065.9856 $1.07 ETH <0.01% $0.073692 14.518 $1.07 ETH <0.01% $0.048248 22.1017 $1.07 ETH <0.01% $0.000012 85,686.2938 $1.06 ETH <0.01% $0.000038 27,354.2391 $1.05 ETH <0.01% $0.001041 990.5609 $1.03 ETH <0.01% $0.000505 2,033.2043 $1.03 ETH <0.01% $0.360281 2.8233 $1.02 ETH <0.01% <$0.000001 2,821,757 $1.02 ETH <0.01% $0.001585 638.2721 $1.01 ETH <0.01% $0.01352 74.3761 $1.01 ETH <0.01% $0.000542 1,851.1342 $1 ETH <0.01% $0.23002 4.3301 $0.996 ETH <0.01% $0.024176 41.0582 $0.9926 ETH <0.01% $1.01 0.9798 $0.9875 ETH <0.01% $0.007754 125.848 $0.9757 ETH <0.01% $2,468.48 0.00038529 $0.951 ETH <0.01% $0.086734 10.9146 $0.9466 ETH <0.01% $0.000438 2,133.0412 $0.9339 ETH <0.01% <$0.000001 1,879,277,810,155.58 $0.9323 ETH <0.01% $0.000039 24,038.4918 $0.9266 ETH <0.01% $0.088314 10.4381 $0.9218 ETH <0.01% $0.496902 1.8276 $0.9081 ETH <0.01% $0.013278 68.2109 $0.9056 ETH <0.01% $0.001091 805.6725 $0.8787 ETH <0.01% $0.042745 20.5407 $0.878 ETH <0.01% $553.07 0.00158684 $0.8776 ETH <0.01% <$0.000001 318,037,696.2098 $0.8739 ETH <0.01% $0.000653 1,320.716 $0.8618 ETH <0.01% $0.037574 22.2566 $0.8362 ETH <0.01% $0.004477 186.0042 $0.8327 ETH <0.01% $0.000131 6,365.0314 $0.8306 ETH <0.01% <$0.000001 362,418,597.7422 $0.7926 ETH <0.01% $0.01099 72.0621 $0.7919 ETH <0.01% $4.77 0.1629 $0.7769 ETH <0.01% $0.011742 65.4495 $0.7684 ETH <0.01% $0.005008 152.2775 $0.7625 ETH <0.01% $0.000245 3,101.0237 $0.7588 ETH <0.01% $1.08 0.6989 $0.7576 ETH <0.01% $1.09 0.6919 $0.7519 ETH <0.01% $0.017259 41.8349 $0.722 ETH <0.01% $0.041378 17.2323 $0.713 ETH <0.01% $0.096684 7.3287 $0.7085 ETH <0.01% $0.005052 139.0412 $0.7023 ETH <0.01% $0.022323 31.4472 $0.7019 ETH <0.01% $0.161092 4.3414 $0.6993 ETH <0.01% $0.085645 8.1361 $0.6968 ETH <0.01% $9.94 0.069 $0.6861 ETH <0.01% $0.041282 16.5695 $0.684 ETH <0.01% $155.24 0.0043601 $0.6768 ETH <0.01% $0.005004 135.0168 $0.6756 ETH <0.01% $0.000002 398,544.5653 $0.6735 ETH <0.01% $2,422.41 0.00027545 $0.6672 ETH <0.01% $0.003626 180.2128 $0.6533 ETH <0.01% $0.004383 148.2669 $0.6497 ETH <0.01% $0.003878 164.1962 $0.6368 ETH <0.01% $0.001526 413.2967 $0.6307 ETH <0.01% <$0.000001 176,886,833.5706 $0.6263 ETH <0.01% $0.000818 763.4569 $0.6242 ETH <0.01% $0.030871 20.0049 $0.6175 ETH <0.01% $0.000137 4,507.4502 $0.6174 ETH <0.01% $0.781752 0.7883 $0.6162 ETH <0.01% $0.000677 909.9774 $0.616 ETH <0.01% $1.78 0.3439 $0.6131 ETH <0.01% $2.69 0.2253 $0.6061 ETH <0.01% <$0.000001 1,255,815,362.2743 $0.5995 ETH <0.01% $0.000001 728,872.1771 $0.5911 ETH <0.01% $0.001332 431.5546 $0.5748 ETH <0.01% $0.000107 5,243.7477 $0.5622 ETH <0.01% $0.003081 179.9923 $0.5545 ETH <0.01% $0.034279 15.8991 $0.5449 ETH <0.01% $0.199128 2.7304 $0.5436 ETH <0.01% $0.048567 11.1874 $0.5433 ETH <0.01% $0.009543 56.862 $0.5426 ETH <0.01% $0.262137 2.0648 $0.5412 ETH <0.01% $0.010193 52.7329 $0.5375 ETH <0.01% $0.000568 937.2117 $0.5326 ETH <0.01% $0.017826 29.486 $0.5256 ETH <0.01% $0.032278 16.1752 $0.5221 ETH <0.01% $0.015441 33.6108 $0.5189 ETH <0.01% <$0.000001 150,094,726,912.478 $0.5151 ETH <0.01% $0.025719 20.0094 $0.5146 ETH <0.01% $0.000703 731.301 $0.5137 ETH <0.01% $0.003114 164.2147 $0.5114 ETH <0.01% <$0.000001 35,423,218.8023 $0.5057 ETH <0.01% $0.000168 2,997.6515 $0.5049 ETH <0.01% $0.173578 2.8942 $0.5023 ETH <0.01% $0.001754 282.6617 $0.4958 ETH <0.01% <$0.000001 51,196,146.7754 $0.4932 ETH <0.01% $0.000336 1,462.2376 $0.492 ETH <0.01% <$0.000001 308,557,697.4594 $0.4918 ETH <0.01% <$0.000001 360,195,408.1182 $0.4895 ETH <0.01% <$0.000001 66,010,389,605 $0.4872 ETH <0.01% $0.000009 56,673.4042 $0.4867 ETH <0.01% $0.415573 1.1608 $0.4823 ETH <0.01% $4,409.14 0.00010733 $0.4732 ETH <0.01% <$0.000001 59,333,544,084.7825 $0.4689 ETH <0.01% $0.010917 41.071 $0.4483 ETH <0.01% $0.000471 946.5608 $0.4456 ETH <0.01% <$0.000001 923,378.1298 $0.4422 ETH <0.01% $0.004762 92.6971 $0.4414 ETH <0.01% $0.109241 4.0308 $0.4403 ETH <0.01% $0.037135 11.8556 $0.4402 ETH <0.01% <$0.000001 136,538,510.332 $0.4399 ETH <0.01% $0.000179 2,441.0016 $0.437 ETH <0.01% $0.000227 1,913.1192 $0.4342 ETH <0.01% $0.005508 78.4201 $0.4319 ETH <0.01% $0.000399 1,052.1606 $0.4198 ETH <0.01% $0.000255 1,634.6814 $0.4162 ETH <0.01% $0.015818 25.252 $0.3994 ETH <0.01% $0.000023 16,944.3916 $0.3942 ETH <0.01% $0.006414 61.3354 $0.3934 ETH <0.01% $0.001715 229.4513 $0.3934 ETH <0.01% $0.222212 1.7333 $0.3851 ETH <0.01% $0.002216 172.5032 $0.3822 ETH <0.01% $0.001023 365.6922 $0.3741 ETH <0.01% $0.009834 37.6371 $0.3701 ETH <0.01% $250,775.1 0.00000147 $0.3675 ETH <0.01% $0.000035 10,311.9202 $0.3645 ETH <0.01% $0.007066 51.2931 $0.3624 ETH <0.01% $0.000293 1,217.1424 $0.3564 ETH <0.01% $0.01525 22.5148 $0.3433 ETH <0.01% $0.000006 59,802.14 $0.3301 ETH <0.01% $0.001806 178.0387 $0.3215 ETH <0.01% <$0.000001 41,241,548.7315 $0.314 ETH <0.01% $0.001293 241.8491 $0.3126 ETH <0.01% <$0.000001 618,927,654.5155 $0.3114 ETH <0.01% <$0.000001 3,956,432.6387 $0.3025 ETH <0.01% $0.098314 3.0571 $0.3005 ETH <0.01% $0.153293 1.9453 $0.2982 ETH <0.01% $0.001681 177.3405 $0.2981 ETH <0.01% $0.000001 205,139.7894 $0.2954 ETH <0.01% $0.001996 146.587 $0.2925 ETH <0.01% $0.00022 1,325.9848 $0.2923 ETH <0.01% $0.001072 267.6776 $0.2868 ETH <0.01% $0.039607 7.1084 $0.2815 ETH <0.01% $0.00288 96.8211 $0.2788 ETH <0.01% $0.004264 64.0295 $0.273 ETH <0.01% $0.000521 509.1793 $0.2654 ETH <0.01% <$0.000001 561,305,192,759.141 $0.2646 ETH <0.01% $0.000365 725.0918 $0.2646 ETH <0.01% $0.000045 5,672.2748 $0.2578 ETH <0.01% $0.036816 6.9884 $0.2572 ETH <0.01% $2.66 0.0967 $0.2572 ETH <0.01% $0.000168 1,507.399 $0.2534 ETH <0.01% $0.009749 25.6774 $0.2503 ETH <0.01% $0.001533 162.4806 $0.2491 ETH <0.01% $0.000035 7,031.0488 $0.2427 ETH <0.01% $2,598.15 0.00009296 $0.2415 ETH <0.01% $0.011912 19.9448 $0.2375 ETH <0.01% $3.34 0.0688 $0.23 ETH <0.01% $0.455629 0.5035 $0.2294 ETH <0.01% <$0.000001 1,149,413,815.4681 $0.229 ETH <0.01% <$0.000001 7,131,022.628 $0.2278 ETH <0.01% $0.000146 1,554.0575 $0.2275 ETH <0.01% $0.086389 2.6318 $0.2273 ETH <0.01% $0.000417 544.5952 $0.2271 ETH <0.01% $0.006842 32.6616 $0.2234 ETH <0.01% $1.2 0.1856 $0.2232 ETH <0.01% $1.06 0.2068 $0.2185 ETH <0.01% $0.005866 36.8909 $0.2164 ETH <0.01% $0.007624 28.198 $0.2149 ETH <0.01% $0.000322 662.4627 $0.2132 ETH <0.01% $0.001115 190.9022 $0.2129 ETH <0.01% $0.008679 24.1233 $0.2093 ETH <0.01% $0.000366 572.0548 $0.2091 ETH <0.01% $0.005754 36.3068 $0.2089 ETH <0.01% $0.04853 4.2548 $0.2064 ETH <0.01% $0.000008 26,635 $0.2053 ETH <0.01% $0.013453 15.2418 $0.205 ETH <0.01% $0.058187 3.4842 $0.2027 ETH <0.01% $0.041164 4.8742 $0.2006 ETH <0.01% $0.061092 3.2246 $0.1969 ETH <0.01% $0.000352 555.2505 $0.1951 ETH <0.01% $0.016356 11.7866 $0.1927 ETH <0.01% <$0.000001 5,919,595,485,320.97 $0.1886 ETH <0.01% $0.000528 353.4618 $0.1867 ETH <0.01% $0.003656 50.4323 $0.1843 ETH <0.01% $0.000005 40,142.6139 $0.1822 ETH <0.01% $0.000051 3,546.9786 $0.1798 ETH <0.01% $0.001833 97.5415 $0.1787 ETH <0.01% $0.202348 0.8732 $0.1766 ETH <0.01% <$0.000001 433,105,798.0477 $0.1747 ETH <0.01% $0.000846 203.6616 $0.1723 ETH <0.01% $0.071578 2.4056 $0.1721 ETH <0.01% $0.193442 0.8826 $0.1707 ETH <0.01% $0.002352 72.5157 $0.1705 ETH <0.01% $0.000114 1,485.198 $0.1693 ETH <0.01% $0.016285 10.1101 $0.1646 ETH <0.01% $0.003762 41.4341 $0.1558 ETH <0.01% $0.018598 8.3788 $0.1558 ETH <0.01% $0.006194 24.99 $0.1547 ETH <0.01% $0.002103 72.1903 $0.1518 ETH <0.01% $0.071248 2.1255 $0.1514 ETH <0.01% $0.005793 25.7902 $0.1494 ETH <0.01% $0.000001 174,183.7767 $0.1477 ETH <0.01% $0.000636 230.9376 $0.1468 ETH <0.01% $2.39 0.0603 $0.1441 ETH <0.01% <$0.000001 7,222,288.1516 $0.1416 ETH <0.01% $0.118821 1.1774 $0.1398 ETH <0.01% $0.000013 10,960.1745 $0.1394 ETH <0.01% $0.020043 6.8931 $0.1381 ETH <0.01% $0.000471 290.1991 $0.1367 ETH <0.01% $0.000419 318.8784 $0.1337 ETH <0.01% <$0.000001 710,363,258.7799 $0.1326 ETH <0.01% $0.019769 6.6657 $0.1317 ETH <0.01% $0.000059 2,227.8539 $0.1314 ETH <0.01% <$0.000001 1,901,754.7839 $0.1304 ETH <0.01% $0.000521 249.7458 $0.1301 ETH <0.01% $0.00032 398.5913 $0.1276 ETH <0.01% $0.507712 0.2513 $0.1276 ETH <0.01% $0.000055 2,303.6781 $0.1263 ETH <0.01% $0.000007 16,730.1571 $0.1248 ETH <0.01% $2.3 0.0535 $0.1231 ETH <0.01% $0.000171 711.1123 $0.1218 ETH <0.01% $0.000013 9,263.8339 $0.1161 ETH <0.01% <$0.000001 119,092,084.3655 $0.1151 ETH <0.01% $0.001394 81.3597 $0.1134 ETH <0.01% $0.018215 5.9626 $0.1086 ETH <0.01% $0.093055 1.1572 $0.1076 ETH <0.01% $0.928526 0.113 $0.1048 ETH <0.01% $0.0067 15.5141 $0.1039 ETH <0.01% $0.002363 43.2502 $0.1021 ETH <0.01% $0.000001 144,216.6256 $0.1014 ETH <0.01% $0.000165 612.6759 $0.1011 POL <0.01% $0.019241 14,537.2554 $279.7 POL <0.01% $264.15 0.6272 $165.68 POL <0.01% $0.000004 25,474,786.5636 $104.7 POL <0.01% $0.001004 69,998.3309 $70.31 POL <0.01% $0.00356 17,100.6078 $60.88 POL <0.01% <$0.000001 2,548,630,246.171 $33.13 POL <0.01% <$0.000001 1,556,076,740.7121 $14.32 POL <0.01% $1.29 10.7992 $13.93 POL <0.01% <$0.000001 1,219,567,213.7366 $13.05 POL <0.01% $0.999775 9.1029 $9.1 POL <0.01% $0.145925 53.3122 $7.78 POL <0.01% $0.217129 35.1876 $7.64 POL <0.01% $0.555437 13.7541 $7.64 POL <0.01% $0.99686 7.21 $7.19 POL <0.01% $0.036638 159.5212 $5.84 POL <0.01% $0.00037 15,336.5219 $5.68 POL <0.01% $0.757119 6.0944 $4.61 POL <0.01% $0.008381 543.2158 $4.55 POL <0.01% $0.003904 1,141.9183 $4.46 POL <0.01% <$0.000001 429,429,517.051 $4.25 POL <0.01% $0.005483 757.9307 $4.16 POL <0.01% $0.032042 122.6158 $3.93 POL <0.01% <$0.000001 393,342,804.2872 $3.74 POL <0.01% $0.332884 10.4934 $3.49 POL <0.01% $0.004397 772.7571 $3.4 POL <0.01% $0.001678 1,901.9196 $3.19 POL <0.01% $0.401592 7.7655 $3.12 POL <0.01% $1.21 1.9178 $2.31 POL <0.01% $0.000016 135,970.6251 $2.2 POL <0.01% $0.00327 627.3244 $2.05 POL <0.01% $0.003485 585.1498 $2.04 POL <0.01% $0.000057 35,920.0381 $2.03 POL <0.01% $0.014023 140.9413 $1.98 POL <0.01% $0.011827 165.5536 $1.96 POL <0.01% $0.00096 1,828.8486 $1.76 POL <0.01% $0.001203 1,396.2036 $1.68 POL <0.01% $0.01549 100.964 $1.56 POL <0.01% $0.000007 209,260.8709 $1.37 POL <0.01% $0.332689 3.1334 $1.04 POL <0.01% $0.005515 182.3653 $1.01 POL <0.01% $0.004349 210.4839 $0.9153 POL <0.01% $0.000061 14,112.5815 $0.8659 POL <0.01% $0.002252 375.1926 $0.845 POL <0.01% $0.000376 2,245.2253 $0.8443 POL <0.01% $0.000529 1,581.8357 $0.8365 POL <0.01% $0.005287 149.4746 $0.7902 POL <0.01% $22.51 0.0348 $0.7824 POL <0.01% $0.004325 165.0689 $0.7139 POL <0.01% $0.000007 97,354.6556 $0.6746 POL <0.01% $0.129884 4.4734 $0.581 POL <0.01% $0.999619 0.5715 $0.5712 POL <0.01% $0.034225 15.9271 $0.5451 POL <0.01% $0.001949 269.9718 $0.5262 POL <0.01% $7.09 0.0696 $0.4933 POL <0.01% $0.020161 23.0966 $0.4656 POL <0.01% $0.062525 7.4032 $0.4628 POL <0.01% $0.213067 2.1598 $0.4601 POL <0.01% $0.000978 461.5479 $0.4512 POL <0.01% $0.005438 77.1664 $0.4195 POL <0.01% $17.44 0.0231 $0.4026 POL <0.01% $0.11327 3.5515 $0.4022 POL <0.01% $0.117422 3.1088 $0.365 POL <0.01% $0.000772 460.1548 $0.3554 POL <0.01% $0.035371 10 $0.3537 POL <0.01% $0.001189 292.361 $0.3475 POL <0.01% $0.161374 2.1315 $0.3439 POL <0.01% $0.092782 3.5666 $0.3309 POL <0.01% $0.139052 2.2121 $0.3075 POL <0.01% $0.000099 3,100 $0.3071 POL <0.01% $1.06 0.2796 $0.2954 POL <0.01% $0.086733 2.8448 $0.2467 POL <0.01% $0.001429 155.14 $0.2216 POL <0.01% $0.038547 5.6996 $0.2197 POL <0.01% $0.000006 35,043.9049 $0.2123 POL <0.01% $0.266046 0.7587 $0.2018 POL <0.01% $0.000423 429.7642 $0.1816 POL <0.01% $0.000845 207.4754 $0.1753 POL <0.01% $0.99675 0.1637 $0.1631 POL <0.01% $41.17 0.00388701 $0.16 POL <0.01% $1.5 0.104 $0.1557 POL <0.01% $0.004451 34.1523 $0.1519 POL <0.01% $0.020118 7.4852 $0.1505 POL <0.01% $0.000025 5,869.5349 $0.1446 POL <0.01% $0.007623 18.7062 $0.1425 POL <0.01% $0.000747 185.1166 $0.1382 POL <0.01% $0.07722 1.7679 $0.1365 POL <0.01% $0.000038 3,504.1474 $0.1338 POL <0.01% $0.006516 19.8417 $0.1292 POL <0.01% $0.013186 9.6292 $0.1269 POL <0.01% $0.427057 0.2817 $0.1203 POL <0.01% $0.014631 7.9531 $0.1163 ARB <0.01% $0.000005 58,839,028.8417 $280.07 ARB <0.01% $264.03 0.6381 $168.48 ARB <0.01% $0.13727 66.6419 $9.15 ARB <0.01% $1 5.8369 $5.84 ARB <0.01% <$0.000001 15,846,400,926.6528 $4.75 ARB <0.01% $0.025889 164.0348 $4.25 ARB <0.01% $0.006503 484.4411 $3.15 ARB <0.01% $0.022721 123.4047 $2.8 ARB <0.01% $0.948696 2.1931 $2.08 ARB <0.01% $2,862.68 0.00070585 $2.02 ARB <0.01% $0.097198 20.6099 $2 ARB <0.01% $0.025249 64.6577 $1.63 ARB <0.01% $0.040667 39.072 $1.59 ARB <0.01% $0.228344 6.4505 $1.47 ARB <0.01% $0.248243 4.8346 $1.2 ARB <0.01% $0.000485 2,131.8513 $1.03 ARB <0.01% $0.002229 407.0071 $0.9072 ARB <0.01% $0.009819 87.0112 $0.8543 ARB <0.01% $0.000018 43,928.37 $0.7937 ARB <0.01% $0.056807 8.7722 $0.4983 ARB <0.01% $0.000404 834.0675 $0.3368 ARB <0.01% $206.7 0.00129113 $0.2668 ARB <0.01% <$0.000001 3,862,668.0332 $0.2611 ARB <0.01% $2,710.3 0.00009583 $0.2597 ARB <0.01% $0.996736 0.2263 $0.2255 ARB <0.01% $0.07955 2.1339 $0.1697 ARB <0.01% $0.1103 1.5272 $0.1684 ARB <0.01% $0.014768 11.2745 $0.1664 ARB <0.01% $0.006629 24.63 $0.1632 ARB <0.01% $0.049908 3.1545 $0.1574 AVAX <0.01% $263.72 1.1016 $290.52 AVAX <0.01% <$0.000001 1,024,226,968.1646 $18.95 AVAX <0.01% <$0.000001 69,156,186.6748 $9.94 AVAX <0.01% $0.000017 528,983.1278 $8.91 AVAX <0.01% $0.994487 7.9003 $7.86 AVAX <0.01% <$0.000001 113,238,295.4753 $7.56 AVAX <0.01% $6.81 0.7594 $5.17 AVAX <0.01% $0.448449 10.5931 $4.75 AVAX <0.01% $1 4.1813 $4.18 AVAX <0.01% $0.022533 185.5255 $4.18 AVAX <0.01% $0.000483 8,251.2655 $3.99 AVAX <0.01% $0.022723 169.5419 $3.85 AVAX <0.01% $0.003003 1,186.0635 $3.56 AVAX <0.01% $0.999948 3.2133 $3.21 AVAX <0.01% $1.64 1.9019 $3.11 AVAX <0.01% $4.28 0.7163 $3.06 AVAX <0.01% $0.248049 11.193 $2.78 AVAX <0.01% $0.095292 29.0327 $2.77 AVAX <0.01% $0.007485 347.6851 $2.6 AVAX <0.01% $0.003026 853.6534 $2.58 AVAX <0.01% $0.000013 198,047.2875 $2.5 AVAX <0.01% $0.10181 24.4414 $2.49 AVAX <0.01% $0.062547 31.4133 $1.96 AVAX <0.01% $0.331481 5.0138 $1.66 AVAX <0.01% $0.000485 2,772.165 $1.34 AVAX <0.01% $0.000023 56,159.5143 $1.31 AVAX <0.01% $0.00297 431.9421 $1.28 AVAX <0.01% $0.003556 330.7591 $1.18 AVAX <0.01% $0.146803 7.9704 $1.17 AVAX <0.01% $0.132232 8.5319 $1.13 AVAX <0.01% $0.097361 9.8701 $0.9609 AVAX <0.01% $0.020209 45.0644 $0.9107 AVAX <0.01% $0.060055 8.7596 $0.526 AVAX <0.01% $0.00058 884.709 $0.513 AVAX <0.01% $1 0.4867 $0.4867 AVAX <0.01% $1.09 0.3392 $0.3695 AVAX <0.01% $0.229437 1.4716 $0.3376 AVAX <0.01% $0.002674 123.3146 $0.3297 AVAX <0.01% $0.000373 702.8489 $0.2623 AVAX <0.01% $0.010453 18.03 $0.1884 AVAX <0.01% <$0.000001 14,805,087.3919 $0.1687 AVAX <0.01% $0.000013 12,962.8524 $0.1669 AVAX <0.01% $0.149052 1.0295 $0.1534 AVAX <0.01% $0.000201 677.4343 $0.1363 AVAX <0.01% $0.013174 8.0679 $0.1062 GNO <0.01% $0.103366 2,666.0706 $275.58 GNO <0.01% $1 29.4125 $29.41 GNO <0.01% $0.000315 14,021.852 $4.41 GNO <0.01% $3.16 1.3725 $4.34 BASE <0.01% $0.003705 9,964.536 $36.92 BASE <0.01% $0.0027 1,330 $3.59 OP <0.01% $67,759 0.00006897 $4.67 OP <0.01% $0.000025 105,652.179 $2.69 OP <0.01% $24.25 0.0639 $1.55 OP <0.01% $1.27 0.8417 $1.07 OP <0.01% $0.076418 9.4459 $0.7218 OP <0.01% $0.07192 7.5514 $0.543 OP <0.01% $0.055705 8.4481 $0.4706 OP <0.01% $10.32 0.0409 $0.4218 OP <0.01% $0.07192 2.8589 $0.2056 OP <0.01% $1.72 0.0686 $0.1179 MANTLE <0.01% $0.554739 0.00001 $0.000006 Loading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
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.Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.