Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Available on 9 networks: Ethereum mainnet, Linea, Polygon, Optimism, BNB Chain, zkSync Era, Base, Avalanche.
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.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$82.93 (@ $3,415.82/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (>200)0.00012932 alETHAlchemix ETH (alETH)$0.43@3,342.520.01774941 CLEVCLever Token (CLEV)$0.27@14.990.38700164 CTRConcentrator... (CTR)$0.17@0.44341,657.52387319 EMRLDEMERALD (EMRLD)$4.51@0.00272.78761639 ICSAIcosa (ICSA)$0.33@0.117337.45971531 MAZZEMAZZE (MAZZE)$0.10@0.0025122.43452382 SPXSPX6900 (SPX)$96.12@0.7851482,643 TRXCTRONCLASSIC (TRXC)$0.04@0.0010,304.38837311 WSMWall Street ... (WSM)$9.88@0.00120,960.48256678 WOJAKWojak Coin (WOJAK)$19.13@0.00090.01546929 0xBTC0xBitcoin To... (0xBTC)$0.00@0.10974.0718663 1INCH1INCH Token (1INCH)$1.64@0.4022675,539,864,954,566 4CHAN4CHAN (4CHAN)$15.58@0.000 ERN@EthernityCh... (ERN)$0.00@2.733,536,660,490.04109 CAWA Hunters Dr... (CAW)$210.50@0.00137.04518636 AAGAAG (AAG)$0.17@0.00120.000001 aEthUSDCAave Ethereu... (aEthUS...)$0.00@1.000.03819286 aLINKAave interes... (aLINK)$0.92@24.040.00000001 aWBTCAave interes... (aWBTC)$0.00@93,339.000.08748333 aWETHAave interes... (aWETH)$298.42@3,411.1210.27703872 ADSAdshares (ADS)$7.72@0.75161.58550215 ATHAethir Token (ATH)$4.94@0.08026.00168752 AGRSAgoras Token (AGRS)$7.80@1.3010.09304662 AINAI Network (AIN)$0.08@0.00823,189.1954273 AIAiDoge (AI)$0.01@0.002.25745388 AIOZAIOZ Network (AIOZ)$2.12@0.940.1735 ASTAirSwap (AST)$0.02@0.113712,012,150.5611896 AKITAAkita Inu (AKITA)$1.33@0.0013.80888793 ALDAladdin Toke... (ALD)$0.81@0.05850.00235409 ALCXAlchemix (ALCX)$0.05@20.043.51563968 ACHAlchemy (ACH)$0.09@0.024451.52799504 ALEPHaleph.im v2 (ALEPH)$6.84@0.1327135.19175663 ALPHAlephium (Al... (ALPH)$201.44@1.490.026862 ALICEALICE (ALICE)$0.03@1.19112.97082173 NXRAAllianceBloc... (NXRA)$5.75@0.05090.09830037 AMKTAlongside Cr... (AMKT)$27.11@275.83148.04472668 ALTAltLayer Tok... (ALT)$17.84@0.1205243.27718337 OMIKAMIAMATERASU OM... (OMIKAM...)$9.39@0.0386199.91834026 WALLETAmbire Walle... (WALLET)$2.52@0.0126306,453,755.569503 AMCAMC (AMC)$4.36@0.0015,069.57644782 AMOAmino (AMO)$3.18@0.00028,752.75796348 AMMXAMMX (AMMX)$5.89@0.00070 AMPAmp (AMP)$0.00@0.00810.11925133 AMPLAmpleforth (AMPL)$0.13@1.10239.8889262 ANGLEANGLE (ANGLE)$5.47@0.0228939.92185428 ANKRAnkr Network (ANKR)$35.15@0.03740.00007224 ankrETHAnkr Staked ... (ankrET...)$0.29@4,005.3222.00182535 ANYAnyswap (ANY)$135.76@6.170433.11086029 APEApeCoin (APE)$40.73@1.232,489,040.60811 NFTAPENFT (NFT)$1.33@0.000.60478959 API3API3 (API3)$1.00@1.6543.26092859 APUFFAPUFF (APUFF)$0.19@0.00440 ANTAragon Netwo... (ANT)$0.00@1.1241.82798974 RBISArbismart To... (RBIS)$0.00@0.00010.35378865 AIUSArbius (AIUS)$25.39@71.7538114.46809295 ARCARC (ARC)$3.51@0.03060 ABTArcBlock (ABT)$0.00@1.522.09662229 ARCXArchitex (ARCX)$0.96@0.45560.1534239 ARIA20ARIANEE (ARIA20)$0.02@0.1212.09622039 ARKMArkham (ARKM)$3.27@1.56090.00607403 ARTHARTH Valueco... (ARTH)1,232.79020827 ALIArtificial L... (ALI)$13.76@0.01120.00054654 ASXAsymetrix Go... (ASX)$0.00@0.008735.65395973 AUDIOAudius (AUDIO)$5.70@0.1657.8356823 AURAAura (AURA)$23.38@0.40430.15478605 AURORAAurora (AURORA)$0.03@0.22041.1521379 URUSAurox Token (URUS)$3.31@2.8730.4945361 AVAILAvail (AVAIL)$3.77@0.123642.076981 AXLAxelar (AXL)$32.52@0.7730.51952854 AXSAxie Infinit... (AXS)$3.45@6.652.10488316 AXIAxioms (AXI)$0.02@0.009142.34912407 AZURAzuro (AZUR)$9.93@0.06982.92303019 BXXBaanx (BXX)$0.13@0.0434227,927.90220514 BEPEBaby Pepe (BEPE)$40.03@0.000213,548,162,179.7619 Babydoge2.0Babydoge 2.0 (Babydo...)$0.02@0.001.54520935 BADGERBadger (BADGER)$6.66@4.3110.92321179 BALBalancer (BAL)$29.16@2.670 B-80BAL-20WETHBalancer 80 ... (B-80BA...)$0.00@9.191.1118794 BANANABanana (BANANA)$46.11@41.470 BCATBananaCat (BCAT)$0.00@0.00570.39480667 BANDBandToken (BAND)$0.60@1.51611.92853455 BANKBankless Tok... (BANK)$0.64@0.0011,037.82084273 BAOBao Token V2 (BAO)$0.70@0.0007630,588,898.4603 SOLANABarbieCrashB... (SOLANA)$0.80@0.000.16539166 BONDBarnBridge G... (BOND)$0.06@0.35330.31333523 BASEBase Protoco... (BASE)$0.47@1.4927.20747834 BDIDBDID (BDID)$0.01@0.000386.81031047 BDPBDPToken (BDP)$10.07@0.116263.05682061 BEAMBeam (BEAM)$7.73@0.02940.001502 EYEBehodler.io (EYE)$0.00@0.0842480.67543995 BENDBend Token (BEND)$0.29@0.00060.10038856 BENTBent Token (BENT)$0.00@0.0288143.31573443 BMDABermuda (BMDA)$1.57@0.0110.003793 TRYbBiLira (TRYb)$0.00@0.02830.00029133 BBTCBinance Wrap... (BBTC)$27.20@93,358.005,344,004.46255141 BIRDDOGBird Dog (BIRDDO...)$106.03@0.00137,474.44913716 BIRDDOGBird Dog (BIRDDO...)$0.15@0.000.26730259 BIRDBird.Money (BIRD)$0.19@0.71130.20788511 btcbitcoin (btc)$0.04@0.17511.49299086 BTC20Bitcoin20 (BTC20)$0.19@0.124922.5299574 CRYPTOBitcoinEther... (CRYPTO)$0.16@0.007217.65111615 BITBitDAO (BIT)$20.83@1.180 BITTBITTOKEN (BITT)$0.00@0.0008518,713.05763039 BTTBitTorrent (BTT)$0.60@0.001.84961345 BPTBlackPool To... (BPT)$0.07@0.03559,782.50516968 GUILDBlockchainSp... (GUILD)$20.15@0.00219.00314113 BSTBlocksquareT... (BST)$2.18@0.2426,119.26034439 VEEBLOCKv (VEE)$72.37@0.01180 BOBBOB (BOB)$0.00@0.0012,446,274.5121058 BOBOBOBO (BOBO)$11.83@0.0034.09882355 BLIDBolide (BLID)0 BONDLYBondly (BONDLY)$0.00@0.001870.06585328 BOOEBook of Ethe... (BOOE)$20.86@0.2978947,013,641.782009 BOPPYBoppy The Ba... (BOPPY)$2.44@0.000.02854701 BOSONBoson Token (BOSON)$0.01@0.314942.04920222 BOTTOBotto (BOTTO)$33.93@0.8071.2030768 AuctionBounce Token (Auctio...)$24.41@20.2947.45626566 BRETTBrett (BRETT)$0.97@0.020563.78980409 BKNBrickken (BKN)$25.14@0.394114,656.81547797 BUSINESSBusiness Coi... (BUSINE...)$127.50@0.00870.02032237 INFRABware (INFRA)$0.00@0.18981.06214005 BYTESBYTES (BYTES)$7.71@7.26140.15790124 CADCAD (CAD)$0.00@0.001835.51796642 CANTOCanto (CANTO)$0.89@0.02524,389.3821848 CARDCardstack (CARD)$6.80@0.001613.69518195 CRECarryToken (CRE)$0.06@0.0045238.96921392 CTSICartesi Toke... (CTSI)$38.09@0.1594140.9571607 CELLCellframe To... (CELL)$157.87@1.120.0004 CELCelsius (CEL)$0.00@0.20070.75555267 CFGCentrifuge (CFG)$0.24@0.320.00334232 CERESCeres (CERES)$0.03@7.564.04141356 FLIPChainflip (FLIP)$4.43@1.0950.05302917 LINKChainLink To... (LINK)$1.28@24.150.26245342 CDTCheckDot (CDT)$0.06@0.21581.17236914 CHZchiliZ (CHZ)$0.11@0.090925.13231173 CHEXChintai Exch... (CHEX)$13.34@0.53072.77273357 CHOchoise.com T... (CHO)$0.06@0.022814,567.22713522 CNDCindicator (CND)$6.36@0.000413.56639604 CovalCircuitsOfVa... (Coval)$0.03@0.00220.35055278 CLOSEDAIClosedAI (CLOSED...)$0.00@0.00040.00000322 cbETHCoinbase Wra... (cbETH)$0.01@3,700.110.40694836 XCMCoinMetro To... (XCM)$0.03@0.06710.01134032 CPDCoinspaid (CPD)$0.00@0.0138161,734.14661288 CONANConan (CONAN)$0.16@0.001,316.88542903 PEOPLEConstitution... (PEOPLE)$58.26@0.04420.10269083 cvxFXSConvex FXS (cvxFXS)$0.22@2.1437228.7108433 cvxPrismaConvex Prism... (cvxPri...)$12.48@0.05466.37828171 CVXConvex Token (CVX)$31.34@4.9128470.6698605 CORCOR Token (COR)$0.14@0.00030 COTICOTI Token (COTI)$0.00@0.12753.04760502 CQTCovalent Que... (CQT)$0.02@0.00573.04760502 CXTCovalent X T... (CXT)$0.38@0.1240.0345987 CREAMCream (CREAM)$0.55@15.878.20991874 CREOCreoEngine (CREO)$0.33@0.04011.93676933 CROCronos Coin (CRO)$0.31@0.1606206.2938163 CRPTCRPT (CRPT)$3.69@0.01794.91718297 CRUCRUST (CRU)$2.49@0.50622.83556114 CUDOSCudosToken (CUDOS)$0.26@0.01124,351.6259669 CULTCult DAO (CULT)$0.01@0.003.01688628 CGT2.0Curio Gas To... (CGT2.0)$0.03@0.01120.02935729 3CrvCurve.fi DAI... (3Crv)$0.03@1.038110.76076993 crvUSDCurve.Fi USD... (crvUSD)$110.64@0.99895.84152136 CYBERCyberConnect (CYBER)$20.68@3.5494.60570944 DAFIDAFI Token (DAFI)$0.09@0.001107,149.96064798 triangledancing tria... (triang...)$55.81@0.00052.87663607 DAODAO Maker (DAO)$0.98@0.3414328.607 DECDarkEnergyCr... (DEC)$0.27@0.00080.01422511 DUSDDavos.xyz US... (DUSD)$0.01@0.99821.08976523 DXNDBXen Token (DXN)$1.08@0.99228.89965706 DGDecentral Ga... (DG)$0.13@0.014515.57211196 MANADecentraland (MANA)$7.83@0.50314.23442353 USDDDecentralize... (USDD)$4.23@0.999618.32784279 DWEBDecentraweb (DWEB)$0.30@0.016684.11993076 DFIDeFiChain To... (DFI)$2.20@0.02610.08167308 DPIDefiPulse In... (DPI)$12.70@155.490 DEGENDEGEN Index (DEGEN)$0.00@0.000.55627214 DHVDeHive.finan... (DHV)$0.01@0.012925.38275283 TSUKADejitaru Tsu... (TSUKA)$0.18@0.00710.00225005 DERCDeRace Token (DERC)$0.00@0.1167184,188.08672593 DERPDERP Coin (DERP)$0.21@0.000 DEUSDEUS (DEUS)$0.00@24.206.75502906 DVFDeversiFi To... (DVF)$4.07@0.60290.05619151 DEVVEDevvE (DEVVE)$0.05@0.91410.7089801 DEXEDexe (DEXE)$8.94@12.610.00923392 USXdForce USD (USX)$0.01@0.99270 DFXDFX Token (DFX)$0.00@0.02340.1144208 DHTdHedge DAO T... (DHT)$0.01@0.08560.19069382 DIADIAToken (DIA)$0.13@0.69840.00018235 DIGGDigg (DIGG)$0.11@624.26127.08338098 DMTRDimitra Toke... (DMTR)$9.64@0.07586,023.1541471 DINODinoLFG (DINO)$36.55@0.0061688.66963139 DZHVDizzyHavoc (DZHV)$0.43@0.00061.54474424 DMTDMarket (DMT)$0.00@0.00090.08155924 DODODODO bird (DODO)$0.01@0.1526170,548.08782813 DCDogechain To... (DC)$48.38@0.000320,198.92295463 DOGE20Dogecoin20 (DOGE20)$0.20@0.000.0000966 DOGEGFDogeGF (DOGEGF)$0.00@0.00256,832,563.552359 ELONDogelon (ELON)$57.04@0.003,186.0203133 DOGEVERSEDogeverse (DOGEVE...)$0.03@0.000.09111482 dogwifhatdogwifhat (dogwif...)$0.00@0.011NFT Tokens (114)groknewyear.com'GROK Mysterybox NFTERC-1155Liquid-tether.com1 BOX FOR YOUERC-1155ETH-Events.com10000 USD FOR FREEERC-1155claim rewards on aavetoken.netaavetoken.netERC-1155claim rewards on agixcoin.netagixcoin.netERC-1155apy-aave.comapy-aave.comERC-1155claim rewards on apyshib.netapyshib.netERC-1155claim rewards on apyusd.comapyusd.comERC-1155claim rewards on beamprotocol.netbeamprotocol.netERC-1155claim rewards on beamprotocol.orgbeamprotocol.orgERC-1155claim rewards on clinkevent.netclinkevent.netERC-1155dojo.giftDojo BlackBox NFTERC-1155claim rewards on dydxnetwork.orgdydxnetwork.orgERC-1155claim rewards on ensfoundation.orgensfoundation.orgERC-1155claim rewards on fetchfinance.netfetchfinance.netERC-1155claim rewards on fetpool.orgfetpool.orgERC-1155Official Authorize credentialFRAX: Airdrop NFT VoucherERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155claim rewards on galaevent.orggalaevent.orgERC-1155GNUSGenius Token & NFT CollectionsERC-1155claim rewards on getcronos.orggetcronos.orgERC-1155claim rewards on getquant.orggetquant.orgERC-1155claim rewards on grtprotocol.comgrtprotocol.comERC-1155claim rewards on injectivepool.orginjectivepool.orgERC-1155IItemsERC-1155claim rewards on jasmyprotocol.comjasmyprotocol.comERC-1155claim rewards on o-ether.orgo-ether.orgERC-1155claim rewards on ondopool.comondopool.comERC-1155claim rewards on pepedao.netpepedao.netERC-1155Puffer Mystery Box NFT pufether.orgPuffer Mystery Box NFT pufether.orgERC-1155claim rewards qntnetwork.orgqntnetwork.orgERC-1155claim rewards on renderpool.orgrenderpool.orgERC-1155claim rewards on renderportal.netrenderportal.netERC-1155claim rewards riotoken.orgriotoken.orgERC-1155claim rewards on snxtoken.comsnxtoken.comERC-1155claim rewards on stakedeth.iostakedeth.ioERC-1155claim rewards on univ4lab.netuniv4lab.netERC-1155ether-origin.comWithdrawal NFT ether-origin.comERC-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*[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]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]
More Info
Private Name Tags
ContractCreator
Multichain Info
- 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 21 from a total of 21 transactions
Transaction Hash MethodBlockFromToTransfer 21329033 2024-12-04 12:07:47 19 days ago 1733314067 IN 1.5 ETH$5,123.73 0.00050679 21.37284806 Set Withdraw Fee 20191498 2024-06-28 16:52:23 178 days ago 1719593543 IN 0 ETH$0.00 0.00039358 7.97372262 Transfer 20119204 2024-06-18 14:22:11 188 days ago 1718720531 IN 3.17647059 ETH$10,850.24 0.00054688 23.06380536 Transfer 19291412 2024-02-23 16:14:35 304 days ago 1708704875 IN 0.975 ETH$3,330.42 0.00166347 70.15348362 Transfer 18570531 2023-11-14 13:46:23 405 days ago 1699969583 IN 2.22 ETH$7,583.11 0.00094275 39.7586095 Withdraw 18284031 2023-10-05 11:32:11 445 days ago 1696505531 IN 0 ETH$0.00 0.00080472 6.28430128 Wrap 18283991 2023-10-05 11:24:11 445 days ago 1696505051 IN 0 ETH$0.00 0.000297 5.90217056 Set Bridge Conne... 18272604 2023-10-03 21:12:11 447 days ago 1696367531 IN 0 ETH$0.00 0.00065664 15.15587846 Set Bridge Conne... 17620749 2023-07-04 13:06:11 538 days ago 1688475971 IN 0 ETH$0.00 0.00090284 20.83839315 Set Bridge Conne... 17620008 2023-07-04 10:36:47 538 days ago 1688467007 IN 0 ETH$0.00 0.00088559 20.44024756 Set Bridge Conne... 17588387 2023-06-30 0:00:23 543 days ago 1688083223 IN 0 ETH$0.00 0.00096594 22.29489655 Set Withdraw Fee 17585741 2023-06-29 15:06:23 543 days ago 1688051183 IN 0 ETH$0.00 0.00782604 54.86145048 Set Swap Fee 17585741 2023-06-29 15:06:23 543 days ago 1688051183 IN 0 ETH$0.00 0.002709 54.86145048 Authorize 17585679 2023-06-29 14:53:59 543 days ago 1688050439 IN 0 ETH$0.00 0.00187591 35.3533266 Authorize 17585679 2023-06-29 14:53:59 543 days ago 1688050439 IN 0 ETH$0.00 0.00187591 35.3533266 Transfer 17565551 2023-06-26 19:04:35 546 days ago 1687806275 IN 2.7 ETH$9,222.71 0.00039193 16.52886982 Withdraw 16878337 2023-03-21 20:19:35 643 days ago 1679429975 IN 0 ETH$0.00 0.00093934 18.78613195 Authorize 16878333 2023-03-21 20:18:47 643 days ago 1679429927 IN 0 ETH$0.00 0.00107229 20.20372462 Transfer 16875708 2023-03-21 11:26:47 643 days ago 1679398007 IN 2.1825 ETH$7,455.02 0.00030486 12.85696094 Transfer 16840120 2023-03-16 11:29:59 648 days ago 1678966199 IN 1.95 ETH$6,660.84 0.00054616 23.03328075 Authorize 16835623 2023-03-15 20:18:59 649 days ago 1678911539 IN 0 ETH$0.00 0.00130848 24.6540455 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block FromTo21469414 2024-12-24 2:40:59 2 hrs ago 1735008059 0 ETH$0.00 21469064 2024-12-24 1:30:47 3 hrs ago 1735003847 0.00006519 ETH$0.22 21469062 2024-12-24 1:30:23 3 hrs ago 1735003823 0.0000003 ETH$0.00 21466010 2024-12-23 15:14:23 14 hrs ago 1734966863 1 wei$0.00 21464788 2024-12-23 11:08:23 18 hrs ago 1734952103 0.00002328 ETH$0.08 21460272 2024-12-22 19:58:11 33 hrs ago 1734897491 0.01846101 ETH$63.06 21457365 2024-12-22 10:13:11 43 hrs ago 1734862391 0.00013836 ETH$0.47 21452937 2024-12-21 19:21:35 2 days ago 1734808895 0.00526371 ETH$17.98 21452873 2024-12-21 19:08:35 2 days ago 1734808115 0.00032772 ETH$1.12 21451139 2024-12-21 13:19:47 2 days ago 1734787187 1 wei$0.00 21445746 2024-12-20 19:13:35 3 days ago 1734722015 0.15437574 ETH$527.32 21444034 2024-12-20 13:28:47 3 days ago 1734701327 1 wei$0.00 21443469 2024-12-20 11:35:11 3 days ago 1734694511 0.05218436 ETH$178.25 21443409 2024-12-20 11:23:11 3 days ago 1734693791 1 wei$0.00 21440111 2024-12-20 0:20:35 4 days ago 1734654035 0.00095482 ETH$3.26 21438323 2024-12-19 18:21:47 4 days ago 1734632507 0.02628785 ETH$89.79 21438054 2024-12-19 17:27:23 4 days ago 1734629243 0.00080038 ETH$2.73 21437803 2024-12-19 16:36:59 4 days ago 1734626219 0.00070933 ETH$2.42 21437753 2024-12-19 16:26:59 4 days ago 1734625619 0.00508392 ETH$17.37 21437416 2024-12-19 15:19:23 4 days ago 1734621563 0.0016677 ETH$5.70 21432855 2024-12-19 0:00:35 5 days ago 1734566435 0.00131273 ETH$4.48 21429026 2024-12-18 11:09:35 5 days ago 1734520175 0.00001928 ETH$0.07 21426174 2024-12-18 1:36:11 6 days ago 1734485771 0.00001987 ETH$0.07 21425406 2024-12-17 23:01:11 6 days ago 1734476471 0.00074211 ETH$2.53 21420665 2024-12-17 7:08:47 6 days ago 1734419327 1 wei$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 POL 69.18% $0.01208 4,643,429.7513 $56,090.96 POL 0.10% $14.96 5.5227 $82.62 POL 0.10% $361.3 0.219 $79.11 POL 0.08% $0.057252 1,163.8607 $66.63 POL 0.08% $1.84 36.0171 $66.27 POL 0.08% <$0.000001 4,829,669,690.2141 $62.3 POL 0.08% $0.212718 289.1662 $61.51 POL 0.08% $0.02047 2,973.1824 $60.86 POL 0.07% $1 55.9861 $56.04 POL 0.07% $24.2 2.2393 $54.19 POL 0.07% $0.215607 245.3783 $52.91 POL 0.06% $0.044088 1,065.8943 $46.99 POL 0.06% $0.946117 47.4792 $44.92 POL 0.05% $0.000295 130,961.8622 $38.58 POL 0.05% $1 36.9563 $36.96 POL 0.04% $0.502499 71.0932 $35.72 POL 0.04% $0.052039 633.7395 $32.98 POL 0.04% $3,409.14 0.00949828 $32.38 POL 0.04% $0.000004 7,875,136.6767 $32.37 POL 0.04% $0.999153 29.241 $29.22 POL 0.04% $0.003056 9,405.2006 $28.75 POL 0.03% $0.113743 248.3048 $28.24 POL 0.03% $379.35 0.0712 $26.99 POL 0.03% $0.010486 2,150.1747 $22.55 POL 0.03% $0.001377 15,635.8338 $21.52 POL 0.03% $0.014903 1,375.8306 $20.5 POL 0.02% $0.000032 625,695.4582 $19.99 POL 0.02% $1.07 18.1556 $19.48 POL 0.02% $0.079837 220.6377 $17.62 POL 0.02% $3.81 4.4527 $16.96 POL 0.02% $0.191373 84.8494 $16.24 POL 0.02% $0.001397 11,281.5912 $15.75 POL 0.02% $0.020717 755.9516 $15.66 POL 0.02% $0.015464 954.1977 $14.76 POL 0.02% $0.00068 21,102.8385 $14.34 POL 0.02% $0.449895 30.5104 $13.73 POL 0.02% $0.849209 15.7277 $13.36 POL 0.02% <$0.000001 59,322,340.9566 $13.16 POL 0.02% $4,040.87 0.00324712 $13.12 POL 0.02% $0.001728 7,498.9725 $12.96 POL 0.02% $0.000022 542,131.4803 $12.17 POL 0.01% $0.003978 2,910.1046 $11.58 POL 0.01% $0.002193 5,149.7902 $11.3 POL 0.01% $1 11.1461 $11.16 POL 0.01% $0.005022 2,167.2046 $10.88 POL 0.01% $0.355064 30.432 $10.81 POL 0.01% $0.000753 14,173.3033 $10.67 POL 0.01% $0.000001 9,265,933.6397 $10.3 POL 0.01% $0.636818 16.0479 $10.22 POL 0.01% $0.58622 17.177 $10.07 POL 0.01% $7.8 1.2503 $9.75 POL 0.01% $2.67 3.5427 $9.46 POL 0.01% $2.1 4.3959 $9.23 POL 0.01% $1.04 8.625 $8.94 POL 0.01% $0.028466 313.0519 $8.91 POL 0.01% $0.099285 88.2212 $8.76 POL 0.01% $0.002605 3,345.6007 $8.71 POL 0.01% $3,408.16 0.00250261 $8.53 POL 0.01% $0.000011 756,002.3592 $8.13 POL 0.01% $1.04 7.81 $8.13 POL <0.01% $0.503556 15.8573 $7.99 POL <0.01% $0.000237 33,393.1676 $7.9 POL <0.01% $0.001124 6,877.9078 $7.73 POL <0.01% $0.089156 81.2301 $7.24 POL <0.01% $0.040895 173.7906 $7.11 POL <0.01% $0.998254 6.751 $6.74 POL <0.01% $0.007147 933.9686 $6.68 POL <0.01% $0.022687 280.5626 $6.37 POL <0.01% $0.218568 29.0432 $6.35 POL <0.01% $1.91 3.2894 $6.28 POL <0.01% $0.011134 556.8421 $6.2 POL <0.01% $0.000022 275,370.8901 $6.11 POL <0.01% $0.999958 6.0202 $6.02 POL <0.01% $0.134217 41.9267 $5.63 POL <0.01% $0.014356 378.0525 $5.43 POL <0.01% $0.004265 1,248.0214 $5.32 POL <0.01% $0.051933 100.575 $5.22 POL <0.01% $0.999441 5.1853 $5.18 POL <0.01% $0.033411 150.6022 $5.03 POL <0.01% $84.39 0.0588 $4.96 POL <0.01% $0.027405 176.861 $4.85 POL <0.01% <$0.000001 20,167,045.9115 $4.76 POL <0.01% $0.005048 906.0911 $4.57 POL <0.01% $1 4.5411 $4.54 POL <0.01% $0.048941 90.917 $4.45 POL <0.01% $0.75228 5.9093 $4.45 POL <0.01% $38.89 0.1114 $4.33 POL <0.01% $0.002135 1,984.8418 $4.24 POL <0.01% $0.003747 1,118.8146 $4.19 POL <0.01% $2.48 1.684 $4.17 POL <0.01% $0.000899 4,522.3112 $4.06 POL <0.01% $1.52 2.6274 $3.99 POL <0.01% $382.92 0.0103 $3.93 POL <0.01% $0.999861 3.8982 $3.9 POL <0.01% $155.34 0.0248 $3.85 POL <0.01% $0.004796 799.9257 $3.84 POL <0.01% $0.000355 10,741.6056 $3.81 POL <0.01% $383.19 0.00993161 $3.81 POL <0.01% $0.025993 141.7832 $3.69 POL <0.01% $0.007833 459.2901 $3.6 POL <0.01% $3.51 1.0113 $3.55 POL <0.01% $0.961291 3.6059 $3.47 POL <0.01% $0.011819 290.8379 $3.44 POL <0.01% $0.009353 365.3352 $3.42 POL <0.01% $0.162357 20.8765 $3.39 POL <0.01% $0.000007 478,128.2236 $3.23 POL <0.01% $0.000034 93,386.0252 $3.19 POL <0.01% $0.006559 481.5821 $3.16 POL <0.01% $0.56284 5.5938 $3.15 POL <0.01% $0.00347 901.6082 $3.13 POL <0.01% $0.013335 232.4738 $3.1 POL <0.01% $0.004401 673.4763 $2.96 POL <0.01% $0.006357 465.9209 $2.96 POL <0.01% $0.003746 782.4658 $2.93 POL <0.01% $0.12021 23.8677 $2.87 POL <0.01% $0.001092 2,492.7597 $2.72 POL <0.01% $275.59 0.00974153 $2.68 POL <0.01% $0.02395 109.6139 $2.63 POL <0.01% $0.234877 11 $2.58 POL <0.01% <$0.000001 273,534,094.2042 $2.52 POL <0.01% $0.996382 2.4897 $2.48 POL <0.01% <$0.000001 163,994,521.2472 $2.48 POL <0.01% $0.097724 25.2495 $2.47 POL <0.01% <$0.000001 65,766,670.6724 $2.43 POL <0.01% $0.002846 812.6642 $2.31 POL <0.01% $0.111559 19.9598 $2.23 POL <0.01% $0.000468 4,730.5038 $2.22 POL <0.01% $0.003068 715.4341 $2.19 POL <0.01% $1.04 2.0596 $2.15 POL <0.01% $3.17 0.661 $2.1 POL <0.01% $0.047596 42.8751 $2.04 POL <0.01% $0.005693 353.76 $2.01 POL <0.01% $0.956203 2.0623 $1.97 POL <0.01% $0.012527 156.6308 $1.96 POL <0.01% $0.547135 3.522 $1.93 POL <0.01% $1,609.98 0.00119354 $1.92 POL <0.01% $0.00091 2,066.0786 $1.88 POL <0.01% $0.000155 12,082.1707 $1.87 POL <0.01% $1.06 1.7583 $1.87 POL <0.01% $0.501359 3.6067 $1.81 POL <0.01% $0.001024 1,743.5437 $1.79 POL <0.01% $0.037367 45.8087 $1.71 POL <0.01% $3.33 0.5068 $1.69 POL <0.01% $0.116892 14.0547 $1.64 POL <0.01% $0.001358 1,206.0476 $1.64 POL <0.01% $0.311145 5.1957 $1.62 POL <0.01% $0.001708 921.2607 $1.57 POL <0.01% $0.005966 258.4928 $1.54 POL <0.01% $0.000007 217,011.3081 $1.47 POL <0.01% $0.001497 973.4075 $1.46 POL <0.01% $0.381373 3.6462 $1.39 POL <0.01% $0.002233 611.8003 $1.37 POL <0.01% $0.168984 7.9652 $1.35 POL <0.01% $0.004571 293.3072 $1.34 POL <0.01% $0.014536 91.8709 $1.34 POL <0.01% $0.000222 5,981.4202 $1.33 POL <0.01% $0.001182 1,107.7168 $1.31 POL <0.01% $0.002093 610.0298 $1.28 POL <0.01% $1.24 1 $1.24 POL <0.01% $0.000028 42,875.209 $1.2 POL <0.01% $0.000191 6,246.2664 $1.19 POL <0.01% $0.00028 4,214.3094 $1.18 POL <0.01% $0.848048 1.3847 $1.17 POL <0.01% $0.000988 1,184.2083 $1.17 POL <0.01% $0.005821 197.0706 $1.15 POL <0.01% $0.039487 26.5068 $1.05 POL <0.01% $0.370189 2.7948 $1.03 POL <0.01% $0.207714 4.9767 $1.03 POL <0.01% $0.075377 13.5595 $1.02 POL <0.01% $2,631.62 0.00038785 $1.02 POL <0.01% $2.1 0.4837 $1.02 POL <0.01% $0.013158 77.1352 $1.01 POL <0.01% $0.440212 2.2715 $0.9999 POL <0.01% $0.048724 20.4887 $0.9982 POL <0.01% $0.001172 817.727 $0.9584 POL <0.01% $0.001171 817.0754 $0.9566 POL <0.01% $0.267874 3.5636 $0.9545 POL <0.01% $0.975445 0.9555 $0.932 POL <0.01% $0.178698 5.0166 $0.8964 POL <0.01% $0.007587 117.8237 $0.8939 POL <0.01% $0.192823 4.6309 $0.8929 POL <0.01% $0.020139 43.6524 $0.8791 POL <0.01% $0.000213 4,041.5662 $0.8616 POL <0.01% $0.037118 22.844 $0.8479 POL <0.01% $0.028971 28.4026 $0.8228 POL <0.01% $0.597375 1.3512 $0.8071 POL <0.01% $0.01549 52.0252 $0.8058 POL <0.01% $0.004355 183.8442 $0.8005 POL <0.01% $0.402386 1.9509 $0.785 POL <0.01% $1.03 0.7603 $0.7838 POL <0.01% $0.305267 2.5656 $0.7831 POL <0.01% $0.000002 447,416.4778 $0.7561 POL <0.01% $0.50441 1.4288 $0.7207 POL <0.01% $1 0.7187 $0.7194 POL <0.01% $1.15 0.6186 $0.7113 POL <0.01% $0.000736 965.9502 $0.7106 POL <0.01% $0.116892 5.8905 $0.6885 POL <0.01% $3.19 0.2106 $0.6718 POL <0.01% $0.22131 3.0315 $0.6708 POL <0.01% $0.019997 32.1574 $0.643 POL <0.01% $53.45 0.0116 $0.619 POL <0.01% $94,200 0.00000657 $0.6188 POL <0.01% $94,171 0.00000647 $0.6092 POL <0.01% $0.00746 80.9639 $0.6039 POL <0.01% $7.3 0.0817 $0.5964 POL <0.01% $0.005371 110.3154 $0.5925 POL <0.01% $0.000608 941.8123 $0.573 POL <0.01% $0.046034 12.2984 $0.5661 POL <0.01% $0.001289 433.8534 $0.5593 POL <0.01% $0.00004 14,049.1519 $0.5563 POL <0.01% $0.315686 1.7556 $0.5542 POL <0.01% $0.117326 4.5747 $0.5367 POL <0.01% $0.006367 84.1307 $0.5356 POL <0.01% $0.010672 49.7591 $0.531 POL <0.01% $0.00082 644.5618 $0.5287 POL <0.01% $14.06 0.0356 $0.50 POL <0.01% $0.02371 21.0087 $0.4981 POL <0.01% $0.99917 0.4981 $0.4977 POL <0.01% $0.017113 29.0628 $0.4973 POL <0.01% $0.000175 2,819.062 $0.4929 POL <0.01% $0.000351 1,356.7986 $0.4768 POL <0.01% $0.000001 426,260.0307 $0.4688 POL <0.01% $0.001942 232.4154 $0.4512 POL <0.01% $0.005685 78.6328 $0.4469 POL <0.01% $0.039331 11.096 $0.4364 POL <0.01% $0.000677 630.0976 $0.4263 POL <0.01% $191.13 0.00222073 $0.4244 POL <0.01% $3 0.1394 $0.4182 POL <0.01% $1.14 0.3624 $0.4131 POL <0.01% $0.030267 13.3451 $0.4039 POL <0.01% $0.000088 4,441.9971 $0.3889 POL <0.01% $0.003726 102.4982 $0.3819 POL <0.01% $0.574759 0.664 $0.3816 POL <0.01% $1.14 0.3254 $0.3724 POL <0.01% $0.085664 4.2538 $0.3643 POL <0.01% $3,821.6 0.00009329 $0.3565 POL <0.01% $1.58 0.2237 $0.3534 POL <0.01% $0.000409 853.3732 $0.3488 POL <0.01% $0.006191 54.9599 $0.3402 POL <0.01% $0.145844 2.2774 $0.3321 POL <0.01% $0.175456 1.8727 $0.3285 POL <0.01% $0.019498 16.4803 $0.3213 POL <0.01% $1.36 0.2283 $0.3104 POL <0.01% $0.011728 26.1243 $0.3063 POL <0.01% $2.27 0.1317 $0.2989 POL <0.01% $0.017283 17.0732 $0.295 POL <0.01% $93,684 0.00000302 $0.2829 POL <0.01% $0.005101 54.9515 $0.2802 POL <0.01% $0.995343 0.2793 $0.278 POL <0.01% $0.010876 25.2854 $0.275 POL <0.01% $24.17 0.0112 $0.2703 POL <0.01% $0.011965 22.5646 $0.2699 POL <0.01% $0.047512 5.6389 $0.2679 POL <0.01% $1.05 0.2526 $0.2644 POL <0.01% $0.00945 27.8643 $0.2633 POL <0.01% $8,972.82 0.00002923 $0.2622 POL <0.01% $0.001939 132.6878 $0.2573 POL <0.01% $0.000096 2,657.4111 $0.256 POL <0.01% $0.092782 2.6553 $0.2463 POL <0.01% $0.002292 101.5407 $0.2327 POL <0.01% $0.061833 3.7296 $0.2306 POL <0.01% $0.202424 1.1236 $0.2274 POL <0.01% $0.255598 0.8812 $0.2252 POL <0.01% $1.23 0.182 $0.2238 POL <0.01% $3,380.01 0.00006574 $0.2221 POL <0.01% $0.00181 121.7583 $0.2204 POL <0.01% $0.000342 632.6163 $0.2162 POL <0.01% $0.639042 0.3377 $0.2158 POL <0.01% $0.001955 108.6022 $0.2123 POL <0.01% $7.22 0.0281 $0.2026 POL <0.01% $0.000162 1,243.7738 $0.2018 POL <0.01% $1.36 0.1479 $0.2011 POL <0.01% $0.016636 12.0442 $0.2003 POL <0.01% $0.000464 431.5939 $0.2001 POL <0.01% $0.328523 0.5727 $0.1881 POL <0.01% $0.004517 39.9393 $0.1803 POL <0.01% $0.993585 0.18 $0.1788 POL <0.01% $1.06 0.1617 $0.1715 POL <0.01% $0.737269 0.2272 $0.1675 POL <0.01% $6.69 0.0243 $0.1622 POL <0.01% $0.732071 0.2208 $0.1616 POL <0.01% $0.000306 527.6255 $0.1612 POL <0.01% <$0.000001 19,754,412.462 $0.158 POL <0.01% $0.000162 959.0637 $0.1556 POL <0.01% $37.08 0.00408616 $0.1515 POL <0.01% $67.19 0.00217328 $0.146 POL <0.01% $0.003562 39.441 $0.1405 POL <0.01% $3,696.76 0.00003767 $0.1392 POL <0.01% $0.00076 180.0792 $0.1368 POL <0.01% $0.231022 0.5629 $0.13 POL <0.01% $0.314762 0.3959 $0.1246 POL <0.01% $0.005123 23.8359 $0.1221 POL <0.01% $0.999892 0.1194 $0.1194 POL <0.01% $0.000879 132.2431 $0.1162 POL <0.01% $0.010844 10.7203 $0.1162 POL <0.01% $0.181099 0.6384 $0.1156 POL <0.01% $0.571203 0.188 $0.1074 POL <0.01% $0.003644 28.8296 $0.105 POL <0.01% $0.506764 0.000000000000000002 <$0.000001 ETH 0.77% <$0.000001 5,401,179,268.262 $620.42 ETH 0.61% $1 496.2174 $496.22 ETH 0.54% $0.000001 442,539,935.3562 $435.45 ETH 0.46% $0.001971 187,205.5926 $368.94 ETH 0.37% $3,411.12 0.0875 $298.42 ETH 0.35% $378.92 0.7527 $285.2 ETH 0.35% $0.160724 1,765.156 $283.7 ETH 0.35% $0.000018 15,519,533.2841 $283.7 ETH 0.35% $94,252 0.00299597 $282.38 ETH 0.27% $0.000023 9,665,033.9626 $222.48 ETH 0.26% $0.710556 299.0936 $212.52 ETH 0.26% <$0.000001 3,536,660,490.0411 $210.5 ETH 0.25% $1.49 135.1918 $201.44 ETH 0.24% $1.77 110.6782 $195.61 ETH 0.21% $0.005465 30,722.7863 $167.91 ETH 0.20% $0.003377 49,002.0269 $165.49 ETH 0.20% $3,415.82 0.0478 $163.44 ETH 0.20% $487.02 0.3347 $163 ETH 0.20% $1.21 134.6123 $162.71 ETH 0.20% $0.000007 24,020,732.0823 $161.46 ETH 0.19% $1.12 140.9572 $157.87 ETH 0.18% $0.568235 255.567 $145.22 ETH 0.18% $0.416162 343.3396 $142.88 ETH 0.17% $1 140.4071 $140.55 ETH 0.17% $6.17 22.0018 $135.76 ETH 0.16% $0.591427 224.6639 $132.87 ETH 0.16% $190.88 0.6785 $129.52 ETH 0.16% $0.008699 14,656.8155 $127.5 ETH 0.15% $0.113995 1,080.1709 $123.13 ETH 0.15% $0.000069 1,738,141.6803 $120.49 ETH 0.14% $0.94554 123.958 $117.21 ETH 0.14% $0.011262 10,341.1336 $116.46 ETH 0.14% $0.490768 237.2447 $116.43 ETH 0.14% $0.998941 110.7608 $110.64 ETH 0.14% $3,406.62 0.0322 $109.56 ETH 0.13% $0.000022 4,866,340.8143 $109.25 ETH 0.13% $3,823.16 0.0282 $107.71 ETH 0.13% $0.028354 3,773.5066 $107 ETH 0.13% <$0.000001 2,879,487,451.5181 $106.49 ETH 0.13% $0.000004 29,306,460.6854 $106.39 ETH 0.13% $0.00002 5,344,004.4626 $106.03 ETH 0.13% $1.36 76.8454 $104.2 ETH 0.12% $0.011811 8,341.7567 $98.52 ETH 0.12% $84.39 1.1614 $98.01 ETH 0.12% $0.785088 122.4345 $96.12 ETH 0.12% $0.999022 93.9221 $93.83 ETH 0.11% $0.008966 10,363.2673 $92.92 ETH 0.11% $1.61 57.4087 $92.43 ETH 0.11% $0.99935 92.1824 $92.12 ETH 0.11% $0.040395 2,280.219 $92.11 ETH 0.11% $0.208119 442.0826 $92.01 ETH 0.11% $0.010963 8,265.9776 $90.62 ETH 0.11% $0.450876 196.932 $88.79 ETH 0.11% $0.035746 2,479.836 $88.64 ETH 0.11% $1.03 84.3327 $86.69 ETH 0.11% <$0.000001 438,744,246.2683 $85.68 ETH 0.11% $0.026824 3,187.5113 $85.5 ETH Ether (ETH)0.10% $3,415.82 0.0243 $82.93 ETH 0.10% $0.160723 507.9249 $81.64 ETH 0.10% $0.006112 12,880.0331 $78.72 ETH 0.10% $118.76 0.6603 $78.42 ETH 0.10% $0.044303 1,769.3778 $78.39 ETH 0.09% $0.974616 77.7112 $75.74 ETH 0.09% $0.006406 11,783.0435 $75.48 ETH 0.09% $0.223113 338.1564 $75.45 ETH 0.09% $0.000115 650,137.5599 $74.97 ETH 0.09% $27.95 2.6339 $73.62 ETH 0.09% $1.09 67.6068 $73.45 ETH 0.09% $0.004963 14,796.7893 $73.43 ETH 0.09% $0.011827 6,119.2603 $72.37 ETH 0.09% $8.56 8.146 $69.71 ETH 0.09% $0.059708 1,157.3465 $69.1 ETH 0.08% $4.95 13.8244 $68.43 ETH 0.08% $1.02 66.6557 $67.73 ETH 0.08% $0.064368 1,038.4996 $66.85 ETH 0.08% $0.202537 326.3558 $66.1 ETH 0.07% $0.266859 225.505 $60.18 ETH 0.07% $0.043886 1,340.3953 $58.82 ETH 0.07% $1 58.74 $58.8 ETH 0.07% $0.023952 2,435.0544 $58.33 ETH 0.07% $0.044243 1,316.8854 $58.26 ETH 0.07% $0.999096 58.2101 $58.16 ETH 0.07% <$0.000001 256,832,563.5524 $57.04 ETH 0.07% $0.000004 13,877,137.063 $56.9 ETH 0.07% $0.000521 107,149.9606 $55.81 ETH 0.07% $5.67 9.8382 $55.78 ETH 0.07% $94,150 0.0005899 $55.54 ETH 0.07% $94,461 0.00056903 $53.75 ETH 0.07% $0.591198 89.4954 $52.91 ETH 0.07% $0.256522 206.0137 $52.85 ETH 0.06% $1.44 36.2415 $52.19 ETH 0.06% $1.52 33.5746 $51.03 ETH 0.06% $0.124574 403.2867 $50.24 ETH 0.06% $3.19 15.6425 $49.9 ETH 0.06% $1.58 31.2229 $49.33 ETH 0.06% $0.502443 98.0749 $49.28 ETH 0.06% $0.000266 182,259.2382 $48.55 ETH 0.06% $0.000284 170,548.0878 $48.38 ETH 0.06% $0.020625 2,303.6241 $47.51 ETH 0.06% $0.000028 1,702,868.9229 $47.36 ETH 0.06% $0.006493 7,218.1056 $46.87 ETH 0.06% $41.47 1.1119 $46.11 ETH 0.06% $1.64 27.7726 $45.55 ETH 0.06% $6.88 6.586 $45.34 ETH 0.06% $1.66 27.011 $44.84 ETH 0.06% $0.000177 252,053.0886 $44.68 ETH 0.05% $0.073426 604.6911 $44.4 ETH 0.05% $5.27 8.185 $43.13 ETH 0.05% $0.996351 41.4824 $41.33 ETH 0.05% $1.23 33.1109 $40.73 ETH 0.05% $0.000176 227,927.9022 $40.03 ETH 0.05% $0.027658 1,439.866 $39.82 ETH 0.05% $0.016438 2,394.0619 $39.35 ETH 0.05% $0.000226 173,923.2628 $39.31 ETH 0.05% $0.311536 124.9454 $38.93 ETH 0.05% $0.211735 181.9726 $38.53 ETH 0.05% $260.89 0.147 $38.34 ETH 0.05% $0.997252 38.3653 $38.26 ETH 0.05% $0.159394 238.9692 $38.09 ETH 0.05% $0.018377 2,066.4998 $37.98 ETH 0.05% <$0.000001 29,365,053,379.4436 $37.55 ETH 0.05% $5.62 6.6633 $37.45 ETH 0.05% $0.000012 3,122,679.2337 $37.44 ETH 0.05% $45.82 0.8146 $37.33 ETH 0.05% $0.182414 203.8134 $37.18 ETH 0.05% $0.217779 169.6832 $36.95 ETH 0.05% $0.177177 206.4084 $36.57 ETH 0.05% $0.006069 6,023.1541 $36.55 ETH 0.04% $0.061596 583.6904 $35.95 ETH 0.04% $0.152514 233.3116 $35.58 ETH 0.04% $0.024984 1,421.8115 $35.52 ETH 0.04% $0.994737 35.3958 $35.21 ETH 0.04% $0.037394 939.9219 $35.15 ETH 0.04% $0.008932 3,925.0084 $35.06 ETH 0.04% $0.221129 157.8742 $34.91 ETH 0.04% $0.000379 92,124.8907 $34.88 ETH 0.04% $20.84 1.6683 $34.77 ETH 0.04% $0.800103 43.4287 $34.75 ETH 0.04% $0.107538 317.8185 $34.18 ETH 0.04% $0.806992 42.0492 $33.93 ETH 0.04% $24.74 1.3692 $33.87 ETH 0.04% $0.450326 75.2149 $33.87 ETH 0.04% $23.09 1.4614 $33.74 ETH 0.04% $1.53 21.9021 $33.51 ETH 0.04% $0.000684 48,361.8016 $33.08 ETH 0.04% $0.003681 8,938.0824 $32.9 ETH 0.04% $0.772965 42.077 $32.52 ETH 0.04% $0.604806 52.4851 $31.74 ETH 0.04% $4.91 6.3783 $31.34 ETH 0.04% $3.04 10.2536 $31.17 ETH 0.04% $115.94 0.2671 $30.97 ETH 0.04% <$0.000001 19,788,278,948,680.582 $30.65 ETH 0.04% $2.67 10.9232 $29.16 ETH 0.04% <$0.000001 191,621,136.4947 $28.66 ETH 0.04% $0.047178 606 $28.59 ETH 0.03% $0.517942 53.795 $27.86 ETH 0.03% <$0.000001 76,630,570.7736 $27.64 ETH 0.03% $1 27.5503 $27.55 ETH 0.03% $0.012076 2,275.2061 $27.48 ETH 0.03% $19.33 1.4174 $27.4 ETH 0.03% $0.476279 57.5085 $27.39 ETH 0.03% $93,358 0.00029133 $27.2 ETH 0.03% $275.83 0.0983 $27.11 ETH 0.03% $1.36 19.2738 $26.21 ETH 0.03% $0.058669 446.5265 $26.2 ETH 0.03% $0.98838 26.1214 $25.82 ETH 0.03% $0.585205 43.5864 $25.51 ETH 0.03% $71.75 0.3538 $25.39 ETH 0.03% $0.394117 63.7898 $25.14 ETH 0.03% $0.825783 30.3726 $25.08 ETH 0.03% $0.075715 324.5082 $24.57 ETH 0.03% $0.014447 1,698.0249 $24.53 ETH 0.03% $20.29 1.2031 $24.41 ETH 0.03% $0.480808 50.6178 $24.34 ETH 0.03% $1.04 23.2988 $24.23 ETH 0.03% $2.51 9.5938 $24.08 ETH 0.03% $0.404255 57.8357 $23.38 ETH 0.03% $0.053602 420.7588 $22.55 ETH 0.03% $0.266306 84.4759 $22.5 ETH 0.03% $0.039074 574.1337 $22.43 ETH 0.03% $49.39 0.4499 $22.22 ETH 0.03% $270.34 0.0822 $22.21 ETH 0.03% $0.631604 34.9457 $22.07 ETH 0.03% $5.41 4.0095 $21.69 ETH 0.03% $3,513.62 0.00617285 $21.69 ETH 0.03% $0.297751 70.0659 $20.86 ETH 0.03% $1.18 17.6511 $20.83 ETH 0.03% $4.77 4.3538 $20.77 ETH 0.03% $3.54 5.8415 $20.68 ETH 0.03% $1 20.3584 $20.4 ETH 0.02% $0.00206 9,782.5052 $20.15 ETH 0.02% $293.62 0.068 $19.97 ETH 0.02% $0.504731 39.5177 $19.95 ETH 0.02% $0.222146 89.0164 $19.77 ETH 0.02% $3 6.4631 $19.39 ETH 0.02% $0.000912 20,960.4826 $19.13 ETH 0.02% $1.2 15.5086 $18.61 ETH 0.02% $0.547178 33.8636 $18.53 ETH 0.02% $0.015888 1,131.0471 $17.97 ETH 0.02% $0.000001 33,150,718.4543 $17.93 ETH 0.02% $0.120509 148.0447 $17.84 ETH 0.02% $3,566.71 0.0049837 $17.78 ETH 0.02% $14.09 1.2128 $17.09 ETH 0.02% $2.28 7.4616 $17.01 ETH 0.02% <$0.000001 46,763,040.8487 $16.74 ETH 0.02% $0.010809 1,441.9835 $15.59 ETH 0.02% <$0.000001 675,539,864,954,565.88 $15.58 ETH 0.02% $0.002491 6,100.6002 $15.2 ETH 0.02% $1.87 8.1137 $15.15 ETH 0.02% $1.13 13.2661 $14.99 ETH 0.02% $17.62 0.848 $14.94 ETH 0.02% $0.001023 14,416.023 $14.75 ETH 0.02% $17.37 0.8334 $14.48 ETH 0.02% <$0.000001 2,225,081,330.5233 $14.39 ETH 0.02% $0.047323 302.7808 $14.33 ETH 0.02% $0.000601 22,923.757 $13.77 ETH 0.02% $0.202172 68.0482 $13.76 ETH 0.02% $0.011159 1,232.7902 $13.76 ETH 0.02% $0.042874 316.2181 $13.56 ETH 0.02% $0.530672 25.1323 $13.34 ETH 0.02% $154.02 0.0866 $13.34 ETH 0.02% $0.218626 60.2828 $13.18 ETH 0.02% $0.000565 22,784.7371 $12.87 ETH 0.02% $1.26 10.111 $12.74 ETH 0.02% $0.461593 27.532 $12.71 ETH 0.02% $155.49 0.0817 $12.7 ETH 0.02% $5.43 2.3134 $12.56 ETH 0.02% $0.054587 228.7108 $12.48 ETH 0.02% $0.004382 2,788.8931 $12.22 ETH 0.02% $0.00019 64,279.4919 $12.2 ETH 0.02% $0.001142 10,649.3344 $12.17 ETH 0.01% $0.133923 90.0651 $12.06 ETH 0.01% $0.000223 53,876.3684 $12.04 ETH 0.01% $0.036545 327.4796 $11.97 ETH 0.01% $0.135356 88.0906 $11.92 ETH 0.01% $0.210958 56.1438 $11.84 ETH 0.01% $0.240807 49.1818 $11.84 ETH 0.01% $0.000001 12,446,274.5121 $11.83 ETH 0.01% $0.993912 11.7804 $11.71 ETH 0.01% $5,592.04 0.0020767 $11.61 ETH 0.01% $22.74 0.5083 $11.56 ETH 0.01% $0.203212 56.4798 $11.48 ETH 0.01% $0.006364 1,788.0681 $11.38 ETH 0.01% $0.005539 2,039.0074 $11.29 ETH 0.01% $0.000002 4,890,772.1631 $11.22 ETH 0.01% $1.13 9.6881 $10.95 ETH 0.01% $21.17 0.5138 $10.88 ETH 0.01% $0.000818 13,070.1068 $10.7 ETH 0.01% $0.018377 580.1064 $10.66 ETH 0.01% $3,427.59 0.00307632 $10.54 ETH 0.01% $2.08 4.9918 $10.38 ETH 0.01% $0.000028 366,808.3237 $10.25 ETH 0.01% <$0.000001 1,746,453,593.8417 $10.2 ETH 0.01% <$0.000001 3,059,713,101,797.9541 $10.16 ETH 0.01% $0.116032 86.8103 $10.07 ETH 0.01% $0.001064 9,455.2348 $10.06 ETH 0.01% $0.005683 1,750.23 $9.95 ETH 0.01% $0.058809 169.06 $9.94 ETH 0.01% $0.069776 142.3491 $9.93 ETH 0.01% $3,603.26 0.00274623 $9.9 ETH 0.01% $0.000959 10,304.3884 $9.88 ETH 0.01% $0.015885 618.2866 $9.82 ETH 0.01% <$0.000001 590,349,532.8158 $9.78 ETH 0.01% $0.468046 20.6588 $9.67 ETH 0.01% $0.075828 127.0834 $9.64 ETH 0.01% $0.02892 332.8391 $9.63 ETH 0.01% $0.000147 64,898.1727 $9.57 ETH 0.01% $0.038597 243.2772 $9.39 ETH 0.01% $1.22 7.6901 $9.38 ETH 0.01% $0.033492 277.3175 $9.29 ETH 0.01% $0.148058 61.4303 $9.1 ETH 0.01% $12.61 0.709 $8.94 ETH 0.01% $3.34 2.6547 $8.86 ETH 0.01% $0.04507 190.4067 $8.58 ETH 0.01% $0.014838 577.3614 $8.57 ETH 0.01% $7.02 1.2166 $8.54 ETH 0.01% $0.440243 19.3197 $8.51 ETH <0.01% $1.84 4.3944 $8.09 ETH <0.01% $0.139201 57.649 $8.02 ETH <0.01% $0.002884 2,759.0578 $7.96 ETH <0.01% $0.503124 15.5721 $7.83 ETH <0.01% $0.598448 13.087 $7.83 ETH <0.01% $1.3 6.0017 $7.8 ETH <0.01% $0.029399 263.0568 $7.73 ETH <0.01% $0.750976 10.277 $7.72 ETH <0.01% $1.19 6.4825 $7.71 ETH <0.01% $7.26 1.0621 $7.71 ETH <0.01% $0.033296 230.5309 $7.68 ETH <0.01% $0.492016 15.1914 $7.47 ETH <0.01% $0.012808 581.7548 $7.45 ETH <0.01% $0.00508 1,437.8784 $7.3 ETH <0.01% $0.376787 19.0108 $7.16 ETH <0.01% $0.000564 12,263.4565 $6.92 ETH <0.01% $0.029708 232.0914 $6.89 ETH <0.01% $0.132676 51.528 $6.84 ETH <0.01% $0.00155 4,389.3822 $6.8 ETH <0.01% $2.17 3.1096 $6.75 ETH <0.01% $0.200277 33.6261 $6.73 ETH <0.01% $3,501.03 0.0019078 $6.68 ETH <0.01% $3,403.54 0.00196207 $6.68 ETH <0.01% $4.31 1.5452 $6.66 ETH <0.01% $0.153162 42.7643 $6.55 ETH <0.01% $0.267858 24.4408 $6.55 ETH <0.01% $0.000067 97,547.7043 $6.54 ETH <0.01% $0.000203 31,955.3806 $6.5 ETH <0.01% $0.126202 51.3821 $6.48 ETH <0.01% $0.092419 69.6736 $6.44 ETH <0.01% $0.547999 11.6755 $6.4 ETH <0.01% $0.000001 4,653,994.2576 $6.38 ETH <0.01% $0.000436 14,567.2271 $6.36 ETH <0.01% $0.736116 8.6216 $6.35 ETH <0.01% $0.001244 5,095.3493 $6.34 ETH <0.01% $3,586.53 0.00176357 $6.33 ETH <0.01% $0.000898 7,022.3688 $6.31 ETH <0.01% $1.07 5.911 $6.3 ETH <0.01% $0.999353 6.2871 $6.28 ETH <0.01% $0.099437 63.1026 $6.27 ETH <0.01% $1.52 4.1011 $6.23 ETH <0.01% $0.027422 227.0062 $6.22 ETH <0.01% $12.05 0.5107 $6.15 ETH <0.01% $0.83322 7.2429 $6.03 ETH <0.01% <$0.000001 72,344,183.5156 $6.01 ETH <0.01% $2.44 2.431 $5.92 ETH <0.01% $7.3 0.8102 $5.91 ETH <0.01% $0.000673 8,752.758 $5.89 ETH <0.01% $0.000045 131,425.2082 $5.85 ETH <0.01% $0.05087 112.9708 $5.75 ETH <0.01% $0.000006 925,087.9153 $5.74 ETH <0.01% $0.322902 17.7357 $5.73 ETH <0.01% $0.16 35.654 $5.7 ETH <0.01% $0.792415 7.1709 $5.68 ETH <0.01% <$0.000001 114,919,665.7427 $5.66 ETH <0.01% $2.32 2.4327 $5.64 ETH <0.01% $2.32 2.4136 $5.6 ETH <0.01% $0.000261 21,374.9262 $5.58 ETH <0.01% $0.022816 239.8889 $5.47 ETH <0.01% $2.09 2.5612 $5.35 ETH <0.01% $0.000041 128,251.9601 $5.26 ETH <0.01% $0.012351 418.2783 $5.17 ETH <0.01% $47.17 0.1092 $5.15 ETH <0.01% $0.00323 1,547.3848 $5 ETH <0.01% $0.080177 61.5855 $4.94 ETH <0.01% $0.111508 42.1687 $4.7 ETH <0.01% <$0.000001 1,782,477,115.5742 $4.63 ETH <0.01% $0.003958 1,154.7475 $4.57 ETH <0.01% $0.004581 996.4952 $4.56 ETH <0.01% $0.869217 5.1972 $4.52 ETH <0.01% $0.00272 1,657.5239 $4.51 ETH <0.01% $0.09712 46.0524 $4.47 ETH <0.01% $1.1 4.0414 $4.43 ETH <0.01% $0.029237 150.6853 $4.41 ETH <0.01% <$0.000001 306,453,755.5695 $4.36 ETH <0.01% $0.000001 5,555,368.1287 $4.36 ETH <0.01% $0.000002 1,803,208.1748 $4.32 ETH <0.01% $0.00132 3,227.0841 $4.26 ETH <0.01% $0.9996 4.2344 $4.23 ETH <0.01% $0.111088 37.9945 $4.22 ETH <0.01% $1.25 3.367 $4.21 ETH <0.01% $535.23 0.00779326 $4.17 ETH <0.01% $0.970514 4.2802 $4.15 ETH <0.01% $1.42 2.926 $4.14 ETH <0.01% $0.000002 2,304,139.2201 $4.08 ETH <0.01% $0.602906 6.755 $4.07 ETH <0.01% $0.296993 13.7128 $4.07 ETH <0.01% $0.400569 10.0243 $4.02 ETH <0.01% $8,957.96 0.0004446 $3.98 ETH <0.01% $0.001179 3,350.2236 $3.95 ETH <0.01% $7.97 0.4945 $3.94 ETH <0.01% $0.167402 23.5028 $3.93 ETH <0.01% $0.024468 156.2529 $3.82 ETH <0.01% $3.78 1 $3.78 ETH <0.01% $0.12356 30.4945 $3.77 ETH <0.01% $1.03 3.6481 $3.76 ETH <0.01% $0.000003 1,119,665.2925 $3.71 ETH <0.01% $0.017895 206.2938 $3.69 ETH <0.01% $0.001691 2,180.9871 $3.69 ETH <0.01% $0.213514 17.1313 $3.66 ETH <0.01% $0.004142 879.6705 $3.64 ETH <0.01% <$0.000001 39,392,908.1072 $3.54 ETH <0.01% $0.030639 114.4681 $3.51 ETH <0.01% $0.998773 3.5065 $3.5 ETH <0.01% $6.65 0.5195 $3.45 ETH <0.01% $0.000001 5,894,503.4739 $3.39 ETH <0.01% $9.58 0.3527 $3.38 ETH <0.01% $0.07955 42.3414 $3.37 ETH <0.01% $107.11 0.0311 $3.33 ETH <0.01% $0.00127 2,622.1585 $3.33 ETH <0.01% $1,611.8 0.0020611 $3.32 ETH <0.01% $2.87 1.1521 $3.31 ETH <0.01% $0.483593 6.8314 $3.3 ETH <0.01% $0.135045 24.4173 $3.3 ETH <0.01% $1.56 2.0962 $3.27 ETH <0.01% $0.208683 15.6119 $3.26 ETH <0.01% $0.276621 11.7029 $3.24 ETH <0.01% $0.000211 15,069.5764 $3.18 ETH <0.01% $0.030291 104.6883 $3.17 ETH <0.01% $0.070883 44.5841 $3.16 ETH <0.01% $148.32 0.0212 $3.15 ETH <0.01% $36.81 0.0849 $3.13 ETH <0.01% $0.022361 139.7867 $3.13 ETH <0.01% $23.8 0.1288 $3.06 ETH <0.01% $1.03 2.9668 $3.04 ETH <0.01% $0.000006 528,821.8145 $3.03 ETH <0.01% $0.268469 11.1383 $2.99 ETH <0.01% $2.81 1.0635 $2.99 ETH <0.01% $0.001643 1,818.364 $2.99 ETH <0.01% $0.000403 7,133.8405 $2.88 ETH <0.01% $0.905462 3.1677 $2.87 ETH <0.01% <$0.000001 14,689,022.1812 $2.85 ETH <0.01% $0.231375 12.3145 $2.85 ETH <0.01% $0.028498 98.8376 $2.82 ETH <0.01% $0.034135 82.1292 $2.8 ETH <0.01% $0.007062 380.7096 $2.69 ETH <0.01% $0.012726 210.7614 $2.68 ETH <0.01% $3.15 0.8299 $2.61 ETH <0.01% $0.111315 23.3004 $2.59 ETH <0.01% $0.727336 3.5245 $2.56 ETH <0.01% $2.61 0.975 $2.54 ETH <0.01% $0.05052 50.3554 $2.54 ETH <0.01% $0.012595 199.9183 $2.52 ETH <0.01% $0.505979 4.9172 $2.49 ETH <0.01% $0.019815 125.1437 $2.48 ETH <0.01% <$0.000001 947,013,641.782 $2.44 ETH <0.01% $3,411.15 0.0007088 $2.42 ETH <0.01% $0.132994 18.0828 $2.4 ETH <0.01% $1.45 1.6425 $2.38 ETH <0.01% $204.61 0.0115 $2.36 ETH <0.01% $0.039504 59.3493 $2.34 ETH <0.01% $0.032731 71.0523 $2.33 ETH <0.01% $2.22 1.0462 $2.32 ETH <0.01% $0.081835 27.2134 $2.23 ETH <0.01% $0.310971 7.152 $2.22 ETH <0.01% $71.92 0.0309 $2.22 ETH <0.01% $0.001429 1,549.1979 $2.21 ETH <0.01% $2.76 0.7985 $2.2 ETH <0.01% $0.026134 84.1199 $2.2 ETH <0.01% $0.241969 9.0031 $2.18 ETH <0.01% <$0.000001 177,451,924.9151 $2.16 ETH <0.01% $0.939964 2.2575 $2.12 ETH <0.01% $0.002236 930.7315 $2.08 ETH <0.01% $0.00275 752.4574 $2.07 ETH <0.01% $0.002159 953.0372 $2.06 ETH <0.01% $0.000002 1,057,625.2466 $1.97 ETH <0.01% $0.000696 2,825.2881 $1.97 ETH <0.01% $0.02329 83.902 $1.95 ETH <0.01% $0.99749 1.9249 $1.92 ETH <0.01% $0.033036 58.0477 $1.92 ETH <0.01% <$0.000001 493,700,282.3523 $1.87 ETH <0.01% $0.012972 143.1141 $1.86 ETH <0.01% $0.024817 73.7551 $1.83 ETH <0.01% $0.000001 3,357,331.5281 $1.8 ETH <0.01% $0.088293 20.3649 $1.8 ETH <0.01% $0.162536 10.5205 $1.71 ETH <0.01% $0.037139 45.0859 $1.67 ETH <0.01% $0.999373 1.6463 $1.65 ETH <0.01% $0.402155 4.0719 $1.64 ETH <0.01% $0.010979 143.3157 $1.57 ETH <0.01% $0.006305 246.8209 $1.56 ETH <0.01% $0.002059 748.7586 $1.54 ETH <0.01% $0.000005 312,515.6691 $1.53 ETH <0.01% $0.001302 1,178.3495 $1.53 ETH <0.01% $0.001836 829.7789 $1.52 ETH <0.01% $0.234998 6.4649 $1.52 ETH <0.01% $0.631013 2.3559 $1.49 ETH <0.01% $246,313.86 0.00000592 $1.46 ETH <0.01% $0.038953 37.2695 $1.45 ETH <0.01% $0.009286 155.9393 $1.45 ETH <0.01% $0.026496 52.4182 $1.39 ETH <0.01% $0.017489 79.1776 $1.38 ETH <0.01% $0.000644 2,121.0789 $1.37 ETH <0.01% <$0.000001 111,199,657.6965 $1.36 ETH <0.01% $0.000105 12,913.2105 $1.35 ETH <0.01% $0.001659 809.0455 $1.34 ETH <0.01% $4,042.67 0.00033135 $1.34 ETH <0.01% $0.016005 83.2263 $1.33 ETH <0.01% $0.000001 2,489,040.6081 $1.33 ETH <0.01% <$0.000001 12,012,150.5612 $1.33 ETH <0.01% $378.92 0.00347967 $1.32 ETH <0.01% $0.048547 26.9223 $1.31 ETH <0.01% $719.33 0.00179845 $1.29 ETH <0.01% $0.018177 71.1252 $1.29 ETH <0.01% $0.01603 80.5711 $1.29 ETH <0.01% $24.15 0.053 $1.28 ETH <0.01% $0.438991 2.8441 $1.25 ETH <0.01% $0.008517 145.1235 $1.24 ETH <0.01% $0.013681 89.4805 $1.22 ETH <0.01% $0.001298 936.8754 $1.22 ETH <0.01% $0.010795 109.8951 $1.19 ETH <0.01% $0.002039 580.8548 $1.18 ETH <0.01% $1.95 0.6041 $1.18 ETH <0.01% $0.54468 2.1378 $1.16 ETH <0.01% $0.00337 336.0024 $1.13 ETH <0.01% $0.008595 130.4348 $1.12 ETH <0.01% $0.000131 8,560.5412 $1.12 ETH <0.01% $0.06181 17.9021 $1.11 ETH <0.01% $0.232848 4.7279 $1.1 ETH <0.01% $0.114722 9.5736 $1.1 ETH <0.01% $0.992211 1.0898 $1.08 ETH <0.01% $0.09431 11.3964 $1.07 ETH <0.01% $0.021509 49.2892 $1.06 ETH <0.01% $0.309075 3.3794 $1.04 ETH <0.01% $1.65 0.6048 $0.9979 ETH <0.01% $1.83 0.5434 $0.9968 ETH <0.01% $0.341429 2.8766 $0.9821 ETH <0.01% $0.379803 2.5712 $0.9765 ETH <0.01% $46.1 0.0212 $0.9764 ETH <0.01% $0.000004 248,548.1658 $0.976 ETH <0.01% $0.000032 30,540.6396 $0.9757 ETH <0.01% $0.020517 47.4563 $0.9736 ETH <0.01% $3,816.91 0.00025321 $0.9664 ETH <0.01% $0.993872 0.9616 $0.9556 ETH <0.01% $0.455582 2.0966 $0.9551 ETH <0.01% $1.95 0.4734 $0.9231 ETH <0.01% $24.04 0.0382 $0.9181 ETH <0.01% $0.003066 298.5846 $0.9153 ETH <0.01% $0.00114 798.0104 $0.9095 ETH <0.01% $0.069015 13.1371 $0.9066 ETH <0.01% <$0.000001 248,054,921.4784 $0.9063 ETH <0.01% $0.025179 35.518 $0.8943 ETH <0.01% $0.053576 16.685 $0.8939 ETH <0.01% $0.000757 1,171.0259 $0.8866 ETH <0.01% $6.52 0.1355 $0.8841 ETH <0.01% $0.701141 1.2396 $0.8691 ETH <0.01% $3,514.49 0.00024721 $0.8688 ETH <0.01% $0.110002 7.7678 $0.8544 ETH <0.01% $0.090249 9.3243 $0.8415 ETH <0.01% $0.002122 394.194 $0.8365 ETH <0.01% $1 0.8268 $0.8268 ETH <0.01% $0.021431 37.8005 $0.8101 ETH <0.01% $0.058537 13.8089 $0.8083 ETH <0.01% <$0.000001 630,588,898.4603 $0.8027 ETH <0.01% $0.005004 156.9403 $0.7853 ETH <0.01% $0.036102 21.7258 $0.7843 ETH <0.01% $0.063912 12.1023 $0.7734 ETH <0.01% $0.027582 27.9033 $0.7696 ETH <0.01% $0.000003 227,031.4197 $0.7696 ETH <0.01% $0.392836 1.9358 $0.7604 ETH <0.01% $0.000205 3,637.7349 $0.7446 ETH <0.01% $0.398296 1.8651 $0.7428 ETH <0.01% $10.17 0.0729 $0.7414 ETH <0.01% $0.141044 5.1736 $0.7297 ETH <0.01% $0.754413 0.949 $0.7159 ETH <0.01% <$0.000001 4,497,547.3425 $0.71 ETH <0.01% $0.000678 1,037.8208 $0.7031 ETH <0.01% $0.065844 10.6682 $0.7024 ETH <0.01% $0.003993 175.6487 $0.7013 ETH <0.01% $37.46 0.0186 $0.6981 ETH <0.01% $0.000001 1,163,578.0656 $0.6946 ETH <0.01% $0.117823 5.6287 $0.6631 ETH <0.01% $0.582893 1.1257 $0.6561 ETH <0.01% $0.843915 0.7625 $0.6435 ETH <0.01% $0.040827 15.6657 $0.6395 ETH <0.01% $0.001041 611.9285 $0.6373 ETH <0.01% <$0.000001 1,649,246.3181 $0.6367 ETH <0.01% $0.611437 1.0368 $0.6339 ETH <0.01% $0.000114 5,440.8298 $0.6207 ETH <0.01% $0.116386 5.2482 $0.6108 ETH <0.01% $0.139293 4.313 $0.6007 ETH <0.01% $0.01897 31.6195 $0.5998 ETH <0.01% $0.000001 518,713.0576 $0.5993 ETH <0.01% $1.51 0.3948 $0.5961 ETH <0.01% $0.001703 348.137 $0.5928 ETH <0.01% $0.050815 11.5802 $0.5884 ETH <0.01% $1.18 0.4931 $0.5819 ETH <0.01% $0.060692 9.5842 $0.5816 ETH <0.01% $0.115873 4.8478 $0.5617 ETH <0.01% $3,491.93 0.00015877 $0.5544 ETH <0.01% $0.000222 2,484.0098 $0.5509 ETH <0.01% $15.87 0.0346 $0.549 ETH <0.01% <$0.000001 6,988,107.9282 $0.5472 ETH <0.01% $0.00194 278.3165 $0.5399 ETH <0.01% $0.125363 4.2928 $0.5381 ETH <0.01% $1.28 0.4181 $0.535 ETH <0.01% $2.18 0.2364 $0.5149 ETH <0.01% $0.06037 8.4419 $0.5096 ETH <0.01% $0.00078 653.6556 $0.5095 ETH <0.01% $0.000699 725.1489 $0.5068 ETH <0.01% $0.008917 56.4226 $0.5031 ETH <0.01% $0.117389 4.2679 $0.501 ETH <0.01% $0.003193 156.8888 $0.501 ETH <0.01% $0.001285 382.8287 $0.4921 ETH <0.01% $0.001231 395.6269 $0.4868 ETH <0.01% $0.002451 197.8658 $0.485 ETH <0.01% $0.53979 0.8963 $0.4838 ETH <0.01% $0.040655 11.8375 $0.4812 ETH <0.01% $0.036916 13.0155 $0.4804 ETH <0.01% $0.000203 2,349.1793 $0.4778 ETH <0.01% $1.49 0.3133 $0.4668 ETH <0.01% $0.012449 36.5416 $0.4549 ETH <0.01% $0.261791 1.7032 $0.4458 ETH <0.01% $0.004023 110.7005 $0.4453 ETH <0.01% $0.000304 1,452.1221 $0.4418 ETH <0.01% $0.001506 291.885 $0.4395 ETH <0.01% $0.214559 2.0293 $0.4354 ETH <0.01% $0.000629 688.6696 $0.4329 ETH <0.01% $3,342.52 0.00012932 $0.4322 ETH <0.01% $0.01506 28.6321 $0.4311 ETH <0.01% $93,888.73 0.00000458 $0.4303 ETH <0.01% $0.005171 82.4229 $0.4261 ETH <0.01% $19.88 0.0214 $0.4257 ETH <0.01% $0.000022 18,903.1579 $0.4188 ETH <0.01% $0.006145 66.8132 $0.4105 ETH <0.01% $0.288624 1.4084 $0.4064 ETH <0.01% $0.063908 6.275 $0.401 ETH <0.01% $0.016239 24.6495 $0.4002 ETH <0.01% $1.01 0.3889 $0.392 ETH <0.01% $0.004044 96.1255 $0.3887 ETH <0.01% $0.932508 0.4117 $0.3838 ETH <0.01% $0.027488 13.9546 $0.3835 ETH <0.01% $0.123952 3.0476 $0.3777 ETH <0.01% $0.000078 4,684.2922 $0.3632 ETH <0.01% $0.539945 0.6676 $0.3604 ETH <0.01% $0.001519 236.0177 $0.3584 ETH <0.01% $0.000001 673,254.1366 $0.3574 ETH <0.01% $0.989404 0.3524 $0.3486 ETH <0.01% $0.000001 524,481.3652 $0.3393 ETH <0.01% $0.000002 194,553.6858 $0.3336 ETH <0.01% $0.144983 2.2767 $0.33 ETH <0.01% $0.040109 8.2099 $0.3292 ETH <0.01% $0.117321 2.7876 $0.327 ETH <0.01% $0.164954 1.9746 $0.3257 ETH <0.01% <$0.000001 1,326,837,119.0208 $0.3257 ETH <0.01% $0.087629 3.7041 $0.3245 ETH <0.01% $0.185879 1.7422 $0.3238 ETH <0.01% $0.000021 15,598.844 $0.3208 ETH <0.01% $0.954254 0.3348 $0.3194 ETH <0.01% $0.002128 149.2719 $0.3176 ETH <0.01% $0.001182 264.718 $0.3129 ETH <0.01% $0.160628 1.9368 $0.311 ETH <0.01% $0.006531 47.453 $0.3099 ETH <0.01% $0.016636 18.3278 $0.3048 ETH <0.01% $0.000315 966.4404 $0.3042 ETH <0.01% $0.732781 0.4125 $0.3022 ETH <0.01% $7.86 0.0375 $0.2947 ETH <0.01% $0.001066 274.5169 $0.2925 ETH <0.01% $3,609.13 0.00008102 $0.2924 ETH <0.01% $4,005.32 0.00007224 $0.2893 ETH <0.01% $0.000595 480.6754 $0.2862 ETH <0.01% $0.097315 2.91 $0.2831 ETH <0.01% $0.008181 33.9776 $0.2779 ETH <0.01% $0.059325 4.6494 $0.2758 ETH <0.01% <$0.000001 2,406,167.7918 $0.2703 ETH <0.01% $15.85 0.017 $0.2698 ETH <0.01% $0.000815 328.607 $0.2677 ETH <0.01% $0.002793 95.6469 $0.2671 ETH <0.01% $14.99 0.0177 $0.266 ETH <0.01% $0.305936 0.8524 $0.2607 ETH <0.01% $7.8 0.0333 $0.2594 ETH <0.01% $0.03319 7.7907 $0.2585 ETH <0.01% $0.011181 22.8356 $0.2553 ETH <0.01% $0.169552 1.5042 $0.255 ETH <0.01% $0.017308 14.6247 $0.2531 ETH <0.01% $0.00537 46.7992 $0.2512 ETH <0.01% $0.772888 0.3208 $0.2479 ETH <0.01% $0.000328 754.4583 $0.2475 ETH <0.01% $67.19 0.00367144 $0.2466 ETH <0.01% $0.000461 528.4427 $0.2435 ETH <0.01% $0.319995 0.7556 $0.2417 ETH <0.01% $1.05 0.2248 $0.2369 ETH <0.01% $0.559076 0.4184 $0.2339 ETH <0.01% $24.36 0.0095518 $0.2326 ETH <0.01% $0.058031 3.9855 $0.2312 ETH <0.01% $0.001754 126.8915 $0.2226 ETH <0.01% $0.000182 1,212.5275 $0.221 ETH <0.01% $2.14 0.1027 $0.2201 ETH <0.01% $0.017096 12.8731 $0.22 ETH <0.01% $0.000154 1,424.982 $0.2195 ETH <0.01% $0.002946 74.2626 $0.2187 ETH <0.01% $0.25356 0.8609 $0.2182 ETH <0.01% $0.047536 4.5411 $0.2158 ETH <0.01% $0.09439 2.2831 $0.2155 ETH <0.01% $1.28 0.1677 $0.2146 ETH <0.01% $0.023153 9.269 $0.2146 ETH <0.01% $0.000001 184,188.0867 $0.2116 ETH <0.01% <$0.000001 5,302,145.127 $0.2064 ETH <0.01% $0.00001 20,198.923 $0.202 ETH <0.01% $0.040897 4.9054 $0.2006 ETH <0.01% $0.000974 203.58 $0.1982 ETH <0.01% $0.972228 0.2035 $0.1978 ETH <0.01% $0.211018 0.9056 $0.1911 ETH <0.01% $14,716.48 0.00001298 $0.191 ETH <0.01% <$0.000001 511,871.437 $0.1907 ETH <0.01% $0.711262 0.2673 $0.1901 ETH <0.01% $0.004393 43.2609 $0.19 ETH <0.01% $0.124891 1.493 $0.1864 ETH <0.01% $0.000004 43,733.0041 $0.1819 ETH <0.01% $0.007058 25.3828 $0.1791 ETH <0.01% $0.074533 2.3849 $0.1777 ETH <0.01% $0.002039 86.095 $0.1755 ETH <0.01% $0.003302 52.3997 $0.173 ETH <0.01% $0.4434 0.387 $0.1715 ETH <0.01% $0.00125 137.0452 $0.1712 ETH <0.01% $1 0.1685 $0.169 ETH <0.01% $0.069486 2.3922 $0.1662 ETH <0.01% $0.000622 260.7143 $0.1621 ETH <0.01% <$0.000001 1,480,336.7126 $0.1621 ETH <0.01% $0.007191 22.53 $0.162 ETH <0.01% $0.000001 161,734.1466 $0.1612 ETH <0.01% $0.05114 3.1474 $0.1609 ETH <0.01% $0.000548 292.4141 $0.1601 ETH <0.01% <$0.000001 2,135,234.1959 $0.1584 ETH <0.01% <$0.000001 424,662.3349 $0.1584 ETH <0.01% $0.07519 2.0901 $0.1571 ETH <0.01% $0.000001 137,474.4491 $0.1527 ETH <0.01% $0.001663 90.9417 $0.1512 ETH <0.01% $0.002896 51.6526 $0.1495 ETH <0.01% $27.99 0.00533573 $0.1493 ETH <0.01% $0.023164 6.4426 $0.1492 ETH <0.01% <$0.000001 341,200.4421 $0.1486 ETH <0.01% $0.00002 7,298.6229 $0.145 ETH <0.01% $0.364005 0.3925 $0.1428 ETH <0.01% $0.000001 119,080.4694 $0.1417 ETH <0.01% $0.000299 470.6699 $0.1405 ETH <0.01% $0.215437 0.6347 $0.1367 ETH <0.01% $0.698372 0.1907 $0.1331 ETH <0.01% $0.006482 20.5145 $0.1329 ETH <0.01% $1.1 0.1193 $0.1311 ETH <0.01% $0.000542 240.2742 $0.1301 ETH <0.01% $0.001864 69.3411 $0.1292 ETH <0.01% $0.014527 8.8997 $0.1292 ETH <0.01% $0.043376 2.923 $0.1267 ETH <0.01% $15.12 0.00813314 $0.1229 ETH <0.01% $0.232008 0.5227 $0.1212 ETH <0.01% $0.000075 1,598.464 $0.1194 ETH <0.01% $0.503329 0.2365 $0.119 ETH <0.01% $0.128571 0.903 $0.1161 ETH <0.01% $0.100963 1.1372 $0.1148 ETH <0.01% $1.04 0.1102 $0.1145 ETH <0.01% $624.26 0.00018235 $0.1138 ETH <0.01% $0.000284 399.7959 $0.1135 ETH <0.01% $0.00094 119.133 $0.1119 ETH <0.01% $0.021372 5.1913 $0.1109 ETH <0.01% $0.000001 164,285.3717 $0.1103 ETH <0.01% $0.010631 10.3727 $0.1102 ETH <0.01% $0.018292 5.967 $0.1091 ETH <0.01% $0.732895 0.1481 $0.1085 ETH <0.01% $0.014622 7.3801 $0.1079 ETH <0.01% $0.026013 4.1381 $0.1076 ETH <0.01% $0.234756 0.4566 $0.1071 ETH <0.01% <$0.000001 10,799,484.6419 $0.1069 ETH <0.01% $0.000559 191.0963 $0.1068 ETH <0.01% $0.090939 1.1724 $0.1066 ETH <0.01% <$0.000001 22,822,349.1178 $0.1047 ETH <0.01% $0.009871 10.5559 $0.1041 ETH <0.01% $0.320715 0.3244 $0.104 ETH <0.01% $0.00613 16.6495 $0.102 ETH <0.01% $0.006522 15.473 $0.1009 ETH <0.01% $0.340405 0.2952 $0.1004 FTM 2.04% <$0.000001 10,474,850,417.7579 $1,653.98 FTM 0.07% $1.03 55.0481 $56.53 FTM 0.07% $1 55.0679 $55.23 FTM 0.04% $94,221 0.00035204 $33.17 FTM 0.04% $1.03 29.5978 $30.46 FTM 0.04% $1 29.1319 $29.16 FTM 0.02% $1.19 10.2533 $12.2 FTM 0.01% $0.004096 2,813.0074 $11.52 FTM 0.01% $0.338988 28.8042 $9.76 FTM 0.01% $0.037391 251.6311 $9.41 FTM 0.01% $24.16 0.3793 $9.16 FTM 0.01% $0.01897 454.276 $8.62 FTM <0.01% $0.034982 227.3608 $7.95 FTM <0.01% $0.266077 24.4807 $6.51 FTM <0.01% $0.977509 5.063 $4.95 FTM <0.01% $0.311557 14.5559 $4.53 FTM <0.01% $378.32 0.0107 $4.07 FTM <0.01% $28.58 0.1396 $3.99 FTM <0.01% $1.03 3.5843 $3.68 FTM <0.01% $0.073545 48.4729 $3.56 FTM <0.01% $3,414.38 0.00092549 $3.16 FTM <0.01% $0.993228 3.145 $3.12 FTM <0.01% $0.000032 92,881.6078 $2.96 FTM <0.01% $94,221 0.00002943 $2.77 FTM <0.01% $3,414.38 0.00071624 $2.45 FTM <0.01% $0.996306 2.3555 $2.35 FTM <0.01% $0.001287 1,495.3248 $1.93 FTM <0.01% $0.912228 1.9293 $1.76 FTM <0.01% $1.03 1.6683 $1.71 FTM <0.01% $8,957.74 0.000188 $1.68 FTM <0.01% <$0.000001 8,293,531,740.583 $1.66 FTM <0.01% $1 1.6244 $1.63 FTM <0.01% $38.87 0.0418 $1.62 FTM <0.01% $361.32 0.0044954 $1.62 FTM <0.01% $0.000012 103,306.9923 $1.24 FTM <0.01% $0.000696 1,743.4158 $1.21 FTM <0.01% $0.503605 2.2999 $1.16 FTM <0.01% $1.52 0.7516 $1.14 FTM <0.01% $0.02036 53.9097 $1.1 FTM <0.01% $0.01824 49.8677 $0.9095 FTM <0.01% $0.999505 0.7149 $0.7145 FTM <0.01% $0.051912 13.2478 $0.6877 FTM <0.01% $0.608029 1.0802 $0.6567 FTM <0.01% $0.00031 1,884.03 $0.5843 FTM <0.01% <$0.000001 2,235,089.0467 $0.3862 FTM <0.01% $0.995937 0.3505 $0.349 FTM <0.01% $0.003729 83.193 $0.3101 FTM <0.01% $0.000288 1,050.3667 $0.3024 FTM <0.01% $24.69 0.00969902 $0.2394 FTM <0.01% $0.000777 283.4851 $0.2201 FTM <0.01% $0.003572 56.5254 $0.2019 FTM <0.01% $0.003455 56.1993 $0.1941 FTM <0.01% $88,939 0.000002 $0.1778 FTM <0.01% $0.026234 6.1166 $0.1604 FTM <0.01% <$0.000001 794,121,452.2312 $0.1588 FTM <0.01% $0.008295 16.0832 $0.1334 FTM <0.01% $0.011889 9.394 $0.1116 FTM <0.01% $0.547742 0.1924 $0.1053 BSC 0.49% $0.009053 44,067.2239 $398.92 BSC 0.12% $691.23 0.1418 $98.05 BSC 0.10% $3,409.14 0.0248 $84.6 BSC 0.07% $0.01187 4,491.5426 $53.31 BSC 0.05% $0.066038 661.9905 $43.72 BSC 0.05% $1.45 26.5637 $38.52 BSC 0.04% $692.03 0.0516 $35.71 BSC 0.04% $0.999153 32.395 $32.37 BSC 0.04% $0.001512 20,728.5038 $31.34 BSC 0.04% $0.000022 1,397,141.4777 $31.3 BSC 0.04% $0.110098 265.3247 $29.21 BSC 0.03% $1 28.0846 $28.15 BSC 0.03% $0.276768 89.5201 $24.78 BSC 0.03% $0.035557 599.4531 $21.31 BSC 0.02% $0.494659 40.3483 $19.96 BSC 0.02% $0.000016 1,230,011.008 $19.3 BSC 0.02% $1.12 16.2866 $18.24 BSC 0.02% $3.81 4.3915 $16.73 BSC 0.02% $3.36 4.8751 $16.38 BSC 0.02% $0.006111 2,659.0812 $16.25 BSC 0.02% $0.030013 538.867 $16.17 BSC 0.02% <$0.000001 434,731,140.8547 $16.07 BSC 0.02% $0.000018 813,190.5995 $14.88 BSC 0.02% $1 14.6658 $14.67 BSC 0.02% $0.374057 38.488 $14.4 BSC 0.02% $0.146197 95.5603 $13.97 BSC 0.02% $84.23 0.1634 $13.76 BSC 0.02% $0.000012 1,094,600.8881 $13.1 BSC 0.02% $0.000203 64,285.0785 $13.07 BSC 0.01% $7.32 1.6279 $11.91 BSC 0.01% $0.215455 47.8238 $10.3 BSC 0.01% $0.06823 148.8652 $10.16 BSC 0.01% $0.097095 102.5601 $9.96 BSC 0.01% $0.139427 69.6762 $9.71 BSC 0.01% $0.773865 12.3696 $9.57 BSC 0.01% $94,192.71 0.00009592 $9.04 BSC 0.01% $0.154699 57.7347 $8.93 BSC 0.01% <$0.000001 54,992,252.8852 $8.69 BSC 0.01% $0.000001 15,901,774.8828 $8.5 BSC 0.01% $7.86 1.0722 $8.43 BSC 0.01% $0.001225 6,854.1421 $8.39 BSC 0.01% $0.009409 878.2988 $8.26 BSC 0.01% $40.88 0.2001 $8.18 BSC <0.01% $0.008537 927.4963 $7.92 BSC <0.01% $0.048339 161.5591 $7.81 BSC <0.01% $1.1 7.0883 $7.8 BSC <0.01% $14.05 0.5482 $7.7 BSC <0.01% $0.000415 18,469.0408 $7.66 BSC <0.01% $0.020793 360.0658 $7.49 BSC <0.01% $0.175732 41.9419 $7.37 BSC <0.01% $0.040354 181.1296 $7.31 BSC <0.01% $0.048618 147.8895 $7.19 BSC <0.01% $1.3 5.4717 $7.13 BSC <0.01% $0.014427 482.4427 $6.96 BSC <0.01% $0.027587 244.2679 $6.74 BSC <0.01% $0.103322 65.0212 $6.72 BSC <0.01% $0.146056 45.8268 $6.69 BSC <0.01% $5.26 1.2647 $6.65 BSC <0.01% $0.000366 17,510.5534 $6.42 BSC <0.01% $0.268443 23.7108 $6.37 BSC <0.01% $22.76 0.2758 $6.28 BSC <0.01% $0.847086 7.1055 $6.02 BSC <0.01% $0.03808 156.5093 $5.96 BSC <0.01% $0.268239 21.4174 $5.74 BSC <0.01% $0.322089 17.8067 $5.74 BSC <0.01% $2.93 1.932 $5.66 BSC <0.01% $0.012811 441.4493 $5.66 BSC <0.01% $0.008201 673.033 $5.52 BSC <0.01% $0.004049 1,246.8231 $5.05 BSC <0.01% $0.468356 10.7319 $5.03 BSC <0.01% $2.26 2.174 $4.91 BSC <0.01% $0.053688 87.2766 $4.69 BSC <0.01% $0.000005 989,358.6989 $4.63 BSC <0.01% $5.69 0.8045 $4.58 BSC <0.01% $0.138659 32.9668 $4.57 BSC <0.01% $0.231248 19.3669 $4.48 BSC <0.01% $0.218568 20.4276 $4.46 BSC <0.01% $0.439849 10.1448 $4.46 BSC <0.01% $0.410664 10.7084 $4.4 BSC <0.01% $0.05014 84.5798 $4.24 BSC <0.01% $0.000598 6,969.7612 $4.17 BSC <0.01% $1.19 3.4538 $4.11 BSC <0.01% $0.037313 109.9229 $4.1 BSC <0.01% $0.004326 923.7303 $4 BSC <0.01% <$0.000001 161,680,462.3099 $3.96 BSC <0.01% $0.011485 343.8399 $3.95 BSC <0.01% $0.01283 302.5945 $3.88 BSC <0.01% $0.318029 12.0994 $3.85 BSC <0.01% $0.001062 3,621.9437 $3.85 BSC <0.01% $0.091682 41.3751 $3.79 BSC <0.01% $0.004394 850.8718 $3.74 BSC <0.01% $0.012721 283.4655 $3.61 BSC <0.01% $0.583448 6.1692 $3.6 BSC <0.01% $0.005957 591.6283 $3.52 BSC <0.01% $0.039863 87.8753 $3.5 BSC <0.01% $0.090469 38.0367 $3.44 BSC <0.01% $0.208082 16.3056 $3.39 BSC <0.01% $0.912643 3.6811 $3.36 BSC <0.01% $0.069975 47.0427 $3.29 BSC <0.01% $0.065205 50.1328 $3.27 BSC <0.01% $1.5 2.1738 $3.27 BSC <0.01% $0.009439 340.2567 $3.21 BSC <0.01% $3.04 1.044 $3.17 BSC <0.01% $0.023902 131.7892 $3.15 BSC <0.01% $0.034574 90.0171 $3.11 BSC <0.01% $0.000817 3,664.5214 $3 BSC <0.01% $0.023006 124.3561 $2.86 BSC <0.01% $1.26 2.2664 $2.85 BSC <0.01% $0.000398 7,102.2994 $2.83 BSC <0.01% $0.002363 1,186.5287 $2.8 BSC <0.01% $0.547414 5.1084 $2.8 BSC <0.01% $0.001707 1,634.8449 $2.79 BSC <0.01% $0.201769 13.7436 $2.77 BSC <0.01% $0.009225 296.709 $2.74 BSC <0.01% $1.6 1.6529 $2.64 BSC <0.01% $0.402386 6.514 $2.62 BSC <0.01% $0.000764 3,353.6713 $2.56 BSC <0.01% $0.100626 25.3263 $2.55 BSC <0.01% $0.09442 26.7234 $2.52 BSC <0.01% $0.022152 113.1585 $2.51 BSC <0.01% $361.3 0.00667891 $2.41 BSC <0.01% $0.000669 3,545.728 $2.37 BSC <0.01% $0.012681 186.8123 $2.37 BSC <0.01% $0.339505 6.9184 $2.35 BSC <0.01% $0.089586 25.9781 $2.33 BSC <0.01% $5.62 0.4073 $2.29 BSC <0.01% $0.322663 7.049 $2.27 BSC <0.01% $1.95 1.154 $2.25 BSC <0.01% $0.144591 15.5472 $2.25 BSC <0.01% $0.000151 14,828.2826 $2.23 BSC <0.01% $0.004571 487.844 $2.23 BSC <0.01% $20.24 0.1102 $2.23 BSC <0.01% $0.047512 46.8269 $2.22 BSC <0.01% $0.999793 2.1856 $2.19 BSC <0.01% $0.341761 6.3579 $2.17 BSC <0.01% $0.75228 2.8207 $2.12 BSC <0.01% $0.105638 19.835 $2.1 BSC <0.01% $1.15 1.7976 $2.07 BSC <0.01% $0.026313 78.1556 $2.06 BSC <0.01% $0.421 4.8466 $2.04 BSC <0.01% $0.081836 24.8021 $2.03 BSC <0.01% $0.159702 12.4498 $1.99 BSC <0.01% $0.153596 12.834 $1.97 BSC <0.01% $0.038903 50.6211 $1.97 BSC <0.01% $2.44 0.7886 $1.92 BSC <0.01% <$0.000001 9,823,340.0521 $1.92 BSC <0.01% $0.942338 2.029 $1.91 BSC <0.01% $0.009448 200.6904 $1.9 BSC <0.01% $0.032222 58.4857 $1.88 BSC <0.01% $9.75 0.1924 $1.88 BSC <0.01% $0.058397 31.746 $1.85 BSC <0.01% $5.18 0.3498 $1.81 BSC <0.01% $0.011965 150.0018 $1.79 BSC <0.01% $1.57 1.1304 $1.77 BSC <0.01% $3,511.41 0.00050184 $1.76 BSC <0.01% $0.000391 4,434.9616 $1.73 BSC <0.01% $0.002798 610.8382 $1.71 BSC <0.01% $0.000018 95,599.0453 $1.68 BSC <0.01% $2.5 0.6703 $1.68 BSC <0.01% $0.002329 704.6853 $1.64 BSC <0.01% $0.000001 1,398,458.4223 $1.62 BSC <0.01% $0.305267 5.2748 $1.61 BSC <0.01% $0.000138 11,452.9482 $1.58 BSC <0.01% $0.006568 238.7345 $1.57 BSC <0.01% $0.022356 69.8358 $1.56 BSC <0.01% $0.486937 3.1643 $1.54 BSC <0.01% $0.320176 4.7727 $1.53 BSC <0.01% $68.4 0.0222 $1.52 BSC <0.01% $0.000002 680,260.2644 $1.5 BSC <0.01% $0.000601 2,454.3137 $1.47 BSC <0.01% $0.43806 3.2979 $1.44 BSC <0.01% $15.94 0.0871 $1.39 BSC <0.01% $0.000611 2,269.2699 $1.39 BSC <0.01% $0.000655 2,117.3603 $1.39 BSC <0.01% $0.002622 524.1848 $1.37 BSC <0.01% $0.007805 170.3057 $1.33 BSC <0.01% $0.020139 65.9441 $1.33 BSC <0.01% $1 1.3018 $1.3 BSC <0.01% $0.000861 1,492.561 $1.28 BSC <0.01% $0.060378 20.6111 $1.24 BSC <0.01% $0.004371 284.4883 $1.24 BSC <0.01% <$0.000001 338,943,128.0693 $1.24 BSC <0.01% $0.092144 13.3956 $1.23 BSC <0.01% $0.012445 97.9438 $1.22 BSC <0.01% <$0.000001 399,321,685.4515 $1.21 BSC <0.01% $0.000032 36,658.2442 $1.17 BSC <0.01% $0.017139 67.3872 $1.15 BSC <0.01% $0.436927 2.6115 $1.14 BSC <0.01% $0.03739 30.364 $1.14 BSC <0.01% $0.070995 15.5752 $1.11 BSC <0.01% $0.019559 53.0985 $1.04 BSC <0.01% $0.311072 3.2871 $1.02 BSC <0.01% $0.584861 1.6853 $0.9856 BSC <0.01% $0.036632 26.868 $0.9842 BSC <0.01% $0.000885 1,100.3392 $0.9737 BSC <0.01% $0.019865 47.9683 $0.9529 BSC <0.01% $0.002929 318.5083 $0.9328 BSC <0.01% $0.1305 7.1 $0.9265 BSC <0.01% $0.000001 1,711,912.9288 $0.9154 BSC <0.01% $1.68 0.5362 $0.9007 BSC <0.01% $0.000808 1,107.6995 $0.8951 BSC <0.01% $0.000414 2,150.7965 $0.89 BSC <0.01% $0.997916 0.8765 $0.8746 BSC <0.01% $0.000397 2,187.7352 $0.8678 BSC <0.01% <$0.000001 590,690,076.6692 $0.8588 BSC <0.01% $0.010285 82.2162 $0.8455 BSC <0.01% $0.00166 503.023 $0.8349 BSC <0.01% $106.66 0.0075146 $0.8014 BSC <0.01% $0.000126 6,311.0808 $0.7954 BSC <0.01% <$0.000001 1,434,428,361.0648 $0.795 BSC <0.01% $0.042624 18.4902 $0.7881 BSC <0.01% $1.37 0.576 $0.7873 BSC <0.01% $0.000228 3,400.5492 $0.7737 BSC <0.01% <$0.000001 3,252,971,182.1604 $0.7508 BSC <0.01% <$0.000001 3,349,368.0182 $0.7444 BSC <0.01% $0.237259 3.0378 $0.7207 BSC <0.01% $0.006239 113.6079 $0.7088 BSC <0.01% $0.000325 2,160.6277 $0.7012 BSC <0.01% $0.004731 145.7341 $0.6895 BSC <0.01% $0.000261 2,622.7541 $0.6857 BSC <0.01% $0.010337 65.613 $0.6782 BSC <0.01% $0.03994 16.3039 $0.6511 BSC <0.01% $0.99052 0.6572 $0.6509 BSC <0.01% $0.453154 1.3806 $0.6256 BSC <0.01% $0.022456 27.3239 $0.6135 BSC <0.01% $0.004014 151.083 $0.6064 BSC <0.01% $0.000009 66,288.193 $0.5906 BSC <0.01% $0.066351 8.8535 $0.5874 BSC <0.01% $0.076389 7.5311 $0.5752 BSC <0.01% $0.069446 8.1948 $0.569 BSC <0.01% $0.041986 13.4741 $0.5657 BSC <0.01% $0.001037 543.6825 $0.5635 BSC <0.01% $0.491861 1.1333 $0.5574 BSC <0.01% $0.005948 92.4272 $0.5497 BSC <0.01% $0.003143 174.3877 $0.5481 BSC <0.01% $0.000039 14,147.6055 $0.5459 BSC <0.01% $1.45 0.3761 $0.5453 BSC <0.01% $0.007573 71.493 $0.5414 BSC <0.01% $0.000296 1,823.6534 $0.54 BSC <0.01% $0.023652 21.4176 $0.5065 BSC <0.01% $0.000389 1,294.025 $0.5032 BSC <0.01% $0.25549 1.9432 $0.4964 BSC <0.01% $0.113068 4.307 $0.4869 BSC <0.01% $0.080572 5.6691 $0.4567 BSC <0.01% $0.070888 6.3943 $0.4532 BSC <0.01% $6.88 0.0657 $0.4521 BSC <0.01% $0.003066 146.1425 $0.448 BSC <0.01% $0.021838 20.4684 $0.4469 BSC <0.01% $0.043732 10.2173 $0.4468 BSC <0.01% $0.003112 135.6516 $0.4221 BSC <0.01% $0.059179 7.1094 $0.4207 BSC <0.01% $0.000612 684.0889 $0.4185 BSC <0.01% $5.96 0.0699 $0.4166 BSC <0.01% $0.000666 616.5617 $0.4106 BSC <0.01% $0.000093 4,242.3221 $0.3958 BSC <0.01% $0.711037 0.5463 $0.3884 BSC <0.01% $460.1 0.00084283 $0.3877 BSC <0.01% $0.717153 0.528 $0.3786 BSC <0.01% $4,004.48 0.0000945 $0.3784 BSC <0.01% $0.019419 19.3922 $0.3765 BSC <0.01% $0.005306 69.7348 $0.37 BSC <0.01% $0.140542 2.473 $0.3475 BSC <0.01% $0.005368 64.3954 $0.3456 BSC <0.01% $0.060989 5.6613 $0.3452 BSC <0.01% $0.084073 4.0742 $0.3425 BSC <0.01% $0.503652 0.6699 $0.3373 BSC <0.01% $1.03 0.3233 $0.332 BSC <0.01% $0.008904 37.1837 $0.331 BSC <0.01% $0.022958 14.4019 $0.3306 BSC <0.01% $1.04 0.3147 $0.3282 BSC <0.01% $0.031898 10.2635 $0.3273 BSC <0.01% $0.000088 3,702.4607 $0.3267 BSC <0.01% $0.461353 0.6999 $0.3229 BSC <0.01% $0.598887 0.5369 $0.3215 BSC <0.01% $0.996382 0.3166 $0.3154 BSC <0.01% $0.001485 211.3153 $0.3138 BSC <0.01% $0.028466 10.7737 $0.3066 BSC <0.01% $0.992331 0.2867 $0.2844 BSC <0.01% <$0.000001 19,723,052.704 $0.278 BSC <0.01% $3.41 0.0792 $0.2697 BSC <0.01% $0.195099 1.3825 $0.2697 BSC <0.01% $0.035366 7.4458 $0.2633 BSC <0.01% $0.000066 3,988.7538 $0.2627 BSC <0.01% $0.000602 418.6933 $0.2518 BSC <0.01% $0.234985 1.069 $0.2511 BSC <0.01% $0.766045 0.3277 $0.251 BSC <0.01% $0.061071 4.053 $0.2475 BSC <0.01% $0.001887 128.7988 $0.243 BSC <0.01% $190.32 0.00127648 $0.2429 BSC <0.01% $0.93707 0.2574 $0.2412 BSC <0.01% $0.008022 29.8019 $0.239 BSC <0.01% $104,722 0.00000228 $0.2386 BSC <0.01% $0.205517 1.148 $0.2359 BSC <0.01% $0.000104 2,257.7467 $0.2354 BSC <0.01% $0.004585 50.7824 $0.2328 BSC <0.01% $0.207052 1.1112 $0.23 BSC <0.01% $0.291995 0.7778 $0.2271 BSC <0.01% $0.012485 18.078 $0.2257 BSC <0.01% $0.000026 8,546.6303 $0.2247 BSC <0.01% $0.001534 145.3838 $0.223 BSC <0.01% $0.00342 64.9338 $0.222 BSC <0.01% $0.00387 56.2983 $0.2178 BSC <0.01% $0.002402 88.9399 $0.2136 BSC <0.01% $0.009009 23.0019 $0.2072 BSC <0.01% $0.039031 5.2804 $0.2061 BSC <0.01% $0.004403 46.7425 $0.2057 BSC <0.01% $2.87 0.0707 $0.2029 BSC <0.01% $0.001023 197.6168 $0.202 BSC <0.01% $0.063169 3.1834 $0.201 BSC <0.01% $0.000037 5,442.9281 $0.201 BSC <0.01% $0.00998 20.1075 $0.2006 BSC <0.01% $0.004956 40.1007 $0.1987 BSC <0.01% $0.012856 14.9408 $0.192 BSC <0.01% $0.503556 0.3794 $0.191 BSC <0.01% $0.000689 270.3588 $0.1861 BSC <0.01% $0.060922 3.0508 $0.1858 BSC <0.01% $0.000275 674.3925 $0.1857 BSC <0.01% $0.135981 1.364 $0.1854 BSC <0.01% $24.18 0.00754421 $0.1824 BSC <0.01% $0.00324 55.0678 $0.1784 BSC <0.01% $0.000444 386.6579 $0.1716 BSC <0.01% $0.033737 5.0288 $0.1696 BSC <0.01% $1.39 0.1214 $0.1688 BSC <0.01% $0.173773 0.9201 $0.1598 BSC <0.01% $0.000103 1,546.5851 $0.1586 BSC <0.01% $0.008803 17.5075 $0.1541 BSC <0.01% $0.000465 329.2012 $0.1531 BSC <0.01% $0.000003 45,986.8994 $0.1522 BSC <0.01% $0.126431 1.1861 $0.1499 BSC <0.01% $0.000028 5,225.5124 $0.1464 BSC <0.01% $0.00107 133.9971 $0.1433 BSC <0.01% $0.015955 8.8997 $0.1419 BSC <0.01% $0.002159 65.1206 $0.1405 BSC <0.01% $0.000862 154.5892 $0.1332 BSC <0.01% $0.161428 0.8035 $0.1297 BSC <0.01% <$0.000001 9,577,419,279.9253 $0.1282 BSC <0.01% $0.023426 5.363 $0.1256 BSC <0.01% <$0.000001 755,101.3177 $0.1253 BSC <0.01% $0.044117 2.7904 $0.1231 BSC <0.01% $0.001886 64.882 $0.1223 BSC <0.01% $0.078563 1.5541 $0.122 BSC <0.01% $0.000331 368.009 $0.1217 BSC <0.01% $0.003771 30.5049 $0.115 BSC <0.01% $0.000137 835.9768 $0.1144 BSC <0.01% $0.268239 0.4205 $0.1128 BSC <0.01% $0.019503 5.6919 $0.111 BSC <0.01% $0.013212 8.2239 $0.1086 BSC <0.01% $0.004447 23.9993 $0.1067 BSC <0.01% $0.216341 0.4727 $0.1022 BSC <0.01% $0.003497 28.9309 $0.1011 BSC <0.01% $0.061732 1.6308 $0.1006 ARB 0.09% $0.991392 69.6818 $69.08 ARB 0.08% $0.99967 61.853 $61.83 ARB 0.07% $0.032507 1,760.5799 $57.23 ARB 0.07% $47.17 1.1877 $56.02 ARB 0.07% $1 55.5791 $55.58 ARB 0.04% $0.410815 87.1517 $35.8 ARB 0.04% $0.800092 37.7166 $30.18 ARB 0.03% $29.48 0.8291 $24.44 ARB 0.03% $94,086 0.00025343 $23.84 ARB 0.03% $0.9991 20.598 $20.58 ARB 0.02% $4,681.41 0.00361735 $16.93 ARB 0.02% $3,415.83 0.00479889 $16.39 ARB 0.02% $0.215236 75.2618 $16.2 ARB 0.02% $0.042799 356.4046 $15.25 ARB 0.02% $3,408.05 0.00437959 $14.93 ARB 0.02% $14.09 0.9929 $13.99 ARB 0.01% $24.16 0.486 $11.74 ARB 0.01% $0.065969 169.9029 $11.21 ARB 0.01% $3,412.55 0.00305765 $10.43 ARB 0.01% $18.01 0.5462 $9.84 ARB 0.01% $4,042.01 0.00224474 $9.07 ARB 0.01% $3,514.38 0.00254379 $8.94 ARB 0.01% $1.02 8.6977 $8.84 ARB 0.01% $0.996827 8.6925 $8.66 ARB 0.01% $2.08 4.0886 $8.5 ARB 0.01% $1.84 4.4414 $8.17 ARB 0.01% $0.000012 678,399.0295 $8.13 ARB <0.01% $0.000018 428,663.3798 $7.84 ARB <0.01% $1,120.97 0.00667988 $7.49 ARB <0.01% $5.27 1.4039 $7.4 ARB <0.01% $3,823.14 0.00192149 $7.35 ARB <0.01% $0.059207 119.7293 $7.09 ARB <0.01% $0.99917 7.0943 $7.09 ARB <0.01% $0.993937 6.7893 $6.75 ARB <0.01% $0.218722 30.7521 $6.73 ARB <0.01% $24.27 0.262 $6.36 ARB <0.01% $1.91 3.276 $6.26 ARB <0.01% $0.081764 76.0711 $6.22 ARB <0.01% $379.11 0.0162 $6.13 ARB <0.01% $2.43 2.4037 $5.84 ARB <0.01% $0.910501 6.1256 $5.58 ARB <0.01% $0.025288 207.3663 $5.24 ARB <0.01% <$0.000001 26,755,515.5651 $5.23 ARB <0.01% $0.013784 373.7065 $5.15 ARB <0.01% $94,152 0.00005288 $4.98 ARB <0.01% $0.008626 567.062 $4.89 ARB <0.01% $0.080948 58.2758 $4.72 ARB <0.01% $0.970379 4.772 $4.63 ARB <0.01% $0.083766 52.4549 $4.39 ARB <0.01% $2.17 2.024 $4.39 ARB <0.01% $0.003676 1,187.684 $4.37 ARB <0.01% $0.15415 28.0474 $4.32 ARB <0.01% $0.404426 10.6642 $4.31 ARB <0.01% $0.294337 14.3212 $4.22 ARB <0.01% $1.77 2.381 $4.21 ARB <0.01% $0.099293 42.1918 $4.19 ARB <0.01% $0.060393 69.332 $4.19 ARB <0.01% $0.312064 13.4107 $4.19 ARB <0.01% $0.042012 97.0157 $4.08 ARB <0.01% $0.58989 6.6278 $3.91 ARB <0.01% $3,449.02 0.00112373 $3.88 ARB <0.01% $1 3.7353 $3.74 ARB <0.01% $5,591.45 0.00057195 $3.2 ARB <0.01% $0.284385 11.1392 $3.17 ARB <0.01% $0.999034 3.1536 $3.15 ARB <0.01% $0.031517 94.2833 $2.97 ARB <0.01% $0.039499 72.9497 $2.88 ARB <0.01% $0.100884 26.1239 $2.64 ARB <0.01% $2.32 1.1322 $2.63 ARB <0.01% $0.80074 3.1455 $2.52 ARB <0.01% $4,004.11 0.00058881 $2.36 ARB <0.01% $3,771.34 0.00061645 $2.32 ARB <0.01% $0.000398 5,824.7517 $2.32 ARB <0.01% $0.000776 2,932.559 $2.27 ARB <0.01% $0.962446 2.3589 $2.27 ARB <0.01% $0.002477 902.1233 $2.23 ARB <0.01% $0.078784 28.2522 $2.23 ARB <0.01% $0.009285 238.2128 $2.21 ARB <0.01% $0.152406 13.9895 $2.13 ARB <0.01% $0.999602 2.0473 $2.05 ARB <0.01% $0.246953 8.1852 $2.02 ARB <0.01% $0.057889 34.3267 $1.99 ARB <0.01% $0.000017 113,099.9845 $1.95 ARB <0.01% $0.002503 763.4662 $1.91 ARB <0.01% $0.999033 1.8718 $1.87 ARB <0.01% $0.038815 48.086 $1.87 ARB <0.01% $94,295 0.00001963 $1.85 ARB <0.01% $0.022989 78.586 $1.81 ARB <0.01% $0.198322 8.6218 $1.71 ARB <0.01% $2.66 0.5589 $1.49 ARB <0.01% $0.000032 45,377.8212 $1.45 ARB <0.01% $0.026544 52.8962 $1.4 ARB <0.01% $94,210 0.00001418 $1.34 ARB <0.01% $0.732507 1.735 $1.27 ARB <0.01% $0.015827 79.3367 $1.26 ARB <0.01% $94,200 0.00001314 $1.24 ARB <0.01% $1.45 0.8499 $1.23 ARB <0.01% $3.2 0.3774 $1.21 ARB <0.01% $0.076166 15.7803 $1.2 ARB <0.01% $3,665.96 0.0003237 $1.19 ARB <0.01% $0.569607 2.0119 $1.15 ARB <0.01% $165.08 0.00688365 $1.14 ARB <0.01% $0.017303 62.9316 $1.09 ARB <0.01% $18.02 0.0604 $1.09 ARB <0.01% $1.52 0.6422 $0.9761 ARB <0.01% $20.83 0.0467 $0.9728 ARB <0.01% $3.53 0.2546 $0.8986 ARB <0.01% $0.0183 48.8877 $0.8946 ARB <0.01% $37.13 0.0238 $0.8827 ARB <0.01% $0.999613 0.8718 $0.8714 ARB <0.01% $0.080549 9.588 $0.7723 ARB <0.01% $2.5 0.3029 $0.7572 ARB <0.01% $0.003582 209.1647 $0.7491 ARB <0.01% $0.027781 26.4558 $0.7349 ARB <0.01% $0.202339 3.5572 $0.7197 ARB <0.01% $24.2 0.0283 $0.685 ARB <0.01% $1 0.6623 $0.6623 ARB <0.01% $0.143668 4.1079 $0.5901 ARB <0.01% $0.996225 0.5831 $0.5809 ARB <0.01% $0.060702 9.3854 $0.5697 ARB <0.01% $0.02399 23.67 $0.5678 ARB <0.01% $0.999958 0.5457 $0.5456 ARB <0.01% $0.033513 15.9558 $0.5347 ARB <0.01% $0.011747 43.2692 $0.5082 ARB <0.01% $0.720664 0.6627 $0.4775 ARB <0.01% $0.221219 2.1569 $0.4771 ARB <0.01% $0.012154 32.6079 $0.3963 ARB <0.01% $0.006503 60.1545 $0.3911 ARB <0.01% $0.44112 0.879 $0.3877 ARB <0.01% $0.002842 131.5378 $0.3738 ARB <0.01% $0.000099 3,473.2745 $0.3445 ARB <0.01% $3,697.51 0.00008975 $0.3318 ARB <0.01% $0.052707 6.2857 $0.3313 ARB <0.01% $0.000779 419.3624 $0.3267 ARB <0.01% $0.030228 9.6025 $0.2902 ARB <0.01% $1 0.2894 $0.2893 ARB <0.01% $0.948859 0.2687 $0.2549 ARB <0.01% $275.73 0.00088111 $0.2429 ARB <0.01% $2.51 0.0954 $0.2393 ARB <0.01% $2.76 0.0825 $0.2277 ARB <0.01% $94,501 0.00000238 $0.2249 ARB <0.01% $1.04 0.2158 $0.2248 ARB <0.01% $5.67 0.039 $0.2212 ARB <0.01% $0.000397 500 $0.1987 ARB <0.01% <$0.000001 36,012,969.763 $0.198 ARB <0.01% $0.33383 0.5699 $0.1902 ARB <0.01% $0.035096 5.3185 $0.1866 ARB <0.01% $0.000445 413.1556 $0.1838 ARB <0.01% $2.59 0.0683 $0.1768 ARB <0.01% $0.182901 0.929 $0.1699 ARB <0.01% $0.0108 14.6304 $0.158 ARB <0.01% $0.288475 0.5376 $0.155 ARB <0.01% $0.833355 0.1855 $0.1545 ARB <0.01% $0.052991 2.8452 $0.1507 ARB <0.01% $0.017115 7.6252 $0.1305 ARB <0.01% $1.04 0.1251 $0.1303 ARB <0.01% $0.845243 0.1528 $0.1291 ARB <0.01% $0.773119 0.1661 $0.1284 ARB <0.01% $0.026895 4.7199 $0.1269 ARB <0.01% $0.059151 1.9887 $0.1176 ARB <0.01% $0.003139 36.6938 $0.1151 ARB <0.01% $0.548175 0.2086 $0.1143 ARB <0.01% $1 0.1092 $0.1094 ARB <0.01% $1.01 0.1078 $0.1084 ARB <0.01% $0.387045 0.2777 $0.1074 ARB <0.01% $0.000028 3,772.5658 $0.1055 ARB <0.01% $270.73 0.00037003 $0.1001 AVAX 0.12% $0.999826 99.4759 $99.46 AVAX 0.12% $0.998565 95.9622 $95.82 AVAX 0.10% $38.82 2.1229 $82.42 AVAX 0.09% $45.76 1.5251 $69.79 AVAX 0.06% $0.000002 28,564,746.9985 $47.42 AVAX 0.02% $1 14.2487 $14.25 AVAX 0.02% $94,082 0.00014472 $13.62 AVAX 0.02% $94,302 0.0001388 $13.09 AVAX 0.01% $38.85 0.2918 $11.34 AVAX 0.01% <$0.000001 616,665,940.1582 $11.1 AVAX 0.01% $3,412.63 0.00284583 $9.71 AVAX <0.01% $0.062643 120.6717 $7.56 AVAX <0.01% $3,408.05 0.00220463 $7.51 AVAX <0.01% $0.589844 12.2612 $7.23 AVAX <0.01% $1.04 6.8153 $7.07 AVAX <0.01% $188.68 0.0367 $6.92 AVAX <0.01% $0.988169 6.4699 $6.39 AVAX <0.01% $5,591.45 0.00101099 $5.65 AVAX <0.01% $0.998565 4.5683 $4.56 AVAX <0.01% $44.31 0.0978 $4.34 AVAX <0.01% $0.007566 540.3281 $4.09 AVAX <0.01% $1 4.0435 $4.04 AVAX <0.01% $0.000003 1,228,558.9962 $4.02 AVAX <0.01% $0.00297 1,270.2484 $3.77 AVAX <0.01% $0.000005 780,231.4463 $3.63 AVAX <0.01% $24.17 0.1498 $3.62 AVAX <0.01% $0.997829 3.485 $3.48 AVAX <0.01% $1.04 3.036 $3.16 AVAX <0.01% $0.33027 9.3164 $3.08 AVAX <0.01% $0.002616 1,116.8428 $2.92 AVAX <0.01% $0.017437 149.7367 $2.61 AVAX <0.01% $0.009434 264.2341 $2.49 AVAX <0.01% $0.410668 5.6658 $2.33 AVAX <0.01% $0.546808 4.029 $2.2 AVAX <0.01% $0.000012 176,797.4326 $2.13 AVAX <0.01% $0.000435 4,439.9534 $1.93 AVAX <0.01% $0.112472 16.3399 $1.84 AVAX <0.01% $0.00796 218.0983 $1.74 AVAX <0.01% $0.0009 1,926.9609 $1.73 AVAX <0.01% $29.48 0.0523 $1.54 AVAX <0.01% $0.008042 173.9785 $1.4 AVAX <0.01% $0.020084 69.5074 $1.4 AVAX <0.01% $0.999958 1.3321 $1.33 AVAX <0.01% $473.53 0.00265868 $1.26 AVAX <0.01% $5.67 0.2027 $1.15 AVAX <0.01% $1.1 0.9684 $1.07 AVAX <0.01% $0.995569 1.022 $1.02 AVAX <0.01% $379.11 0.00200865 $0.7614 AVAX <0.01% $360.99 0.00174391 $0.6295 AVAX <0.01% $0.00028 2,180.2321 $0.6097 AVAX <0.01% $0.99917 0.5314 $0.5309 AVAX <0.01% $5.26 0.0912 $0.4797 AVAX <0.01% $1.51 0.292 $0.442 AVAX <0.01% $0.312134 1.3861 $0.4326 AVAX <0.01% $0.000398 818.1876 $0.3259 AVAX <0.01% $0.001395 206.0025 $0.2874 AVAX <0.01% $377.62 0.00072822 $0.2749 AVAX <0.01% $0.038186 7.1975 $0.2748 AVAX <0.01% $0.01252 21.8656 $0.2737 AVAX <0.01% $0.000742 314.3358 $0.2332 AVAX <0.01% $0.124104 1.7489 $0.217 AVAX <0.01% <$0.000001 6,415,801.1458 $0.1546 AVAX <0.01% $0.000054 2,860.002 $0.154 AVAX <0.01% $0.002031 72.7052 $0.1476 AVAX <0.01% $0.000121 1,151.8436 $0.1397 AVAX <0.01% $0.00042 295.2815 $0.124 AVAX <0.01% $0.037415 3.0613 $0.1145 AVAX <0.01% $0.011232 10.0723 $0.1131 AVAX <0.01% $14.09 0.00772156 $0.1087 OP 0.09% $1 74.2571 $74.26 OP 0.09% $3,412.63 0.0203 $69.24 OP 0.06% $0.991421 49.9611 $49.53 OP 0.06% $94,082 0.00051644 $48.59 OP 0.05% $1.92 22.4626 $43.07 OP 0.04% $3,416.93 0.0102 $34.84 OP 0.03% $0.182727 121.6897 $22.24 OP 0.02% $377.62 0.0519 $19.61 OP 0.02% $2.32 8.1982 $19.02 OP 0.02% $4,041.77 0.00352994 $14.27 OP 0.02% $362.54 0.0347 $12.59 OP 0.02% $0.999083 12.3224 $12.31 OP 0.01% $27.05 0.4418 $11.95 OP 0.01% $0.202339 57.9649 $11.73 OP 0.01% $1 10.5815 $10.58 OP <0.01% $0.834253 9.0018 $7.51 OP <0.01% $94,200 0.00006703 $6.31 OP <0.01% $3,386.39 0.0018507 $6.27 OP <0.01% $5.67 1.0924 $6.19 OP <0.01% $0.992381 5.864 $5.82 OP <0.01% $0.999107 5.0118 $5.01 OP <0.01% $0.992588 3.4823 $3.46 OP <0.01% $1.84 1.8778 $3.46 OP <0.01% $3,364.94 0.0010074 $3.39 OP <0.01% $0.229895 14.6856 $3.38 OP <0.01% $0.999978 3.0795 $3.08 OP <0.01% $0.095072 30.9478 $2.94 OP <0.01% $0.999958 2.8826 $2.88 OP <0.01% $0.996908 2.8145 $2.81 OP <0.01% $0.99968 1.8735 $1.87 OP <0.01% $1.03 1.661 $1.71 OP <0.01% $14.09 0.1065 $1.5 OP <0.01% $3,329.93 0.00043642 $1.45 OP <0.01% $0.085552 16.6406 $1.42 OP <0.01% $0.948352 1.1773 $1.12 OP <0.01% $0.182727 5.3336 $0.9745 OP <0.01% $0.000536 1,816.3023 $0.9735 OP <0.01% $0.998965 0.9566 $0.9556 OP <0.01% $1.01 0.6881 $0.6928 OP <0.01% $0.072777 9.3375 $0.6795 OP <0.01% $0.312134 2.1608 $0.6744 OP <0.01% $0.017303 38.8352 $0.6719 OP <0.01% $0.991465 0.5397 $0.535 OP <0.01% $0.001943 264.4842 $0.5139 OP <0.01% $0.045013 11.3826 $0.5123 OP <0.01% $0.023948 18.0951 $0.4333 OP <0.01% $0.821211 0.4876 $0.4003 OP <0.01% $2.1 0.188 $0.3948 OP <0.01% $379.11 0.00100204 $0.3798 OP <0.01% $3,408.05 0.00007803 $0.2659 OP <0.01% $0.01158 20.8603 $0.2415 OP <0.01% $0.017116 13.7127 $0.2347 OP <0.01% $0.999522 0.2036 $0.2035 OP <0.01% $0.009757 18.3371 $0.1789 OP <0.01% $0.031442 5.4764 $0.1721 OP <0.01% $2.66 0.0622 $0.1653 OP <0.01% $0.002176 75.4378 $0.1641 OP <0.01% $0.100876 1.6159 $0.163 OP <0.01% $0.000012 11,080.262 $0.1336 BASE 0.06% $0.00365 13,324.6182 $48.64 BASE 0.03% $0.001094 20,305.55 $22.2 BASE 0.01% <$0.000001 306,886,535 $11.57 BASE <0.01% $0.030286 124.0777 $3.76 BASE <0.01% $0.072096 33.689 $2.43 BASE <0.01% $0.000009 200,004.2069 $1.77 BASE <0.01% $0.007042 169 $1.19 BASE <0.01% $0.034764 11 $0.3824 BASE <0.01% $0.000946 274 $0.2592 BASE <0.01% <$0.000001 27,531,552 $0.2285 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.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.