├── .editorconfig ├── .gitignore ├── COPYRIGHT ├── LICENSE-APACHE ├── LICENSE-MIT ├── Makefile ├── README.md ├── _redirects ├── backend ├── build │ └── stub-debug.sh ├── migrations │ ├── 20190508172744-create-schema.js │ ├── 20190508173315-create-unique-messages.js │ ├── 20190606073105-add-block-height-index.js │ ├── 20190608002923-update-ask-expiry-len-type.js │ ├── 20190819173206-populate-ip-to-locations.js │ ├── 20190918130707-remove-block-nonce.js │ ├── IP2LOCATION-LITE-DB5.CSV.ZIP │ ├── ip_data │ │ ├── README.md │ │ ├── xaa.gz │ │ ├── xab.gz │ │ ├── xac.gz │ │ ├── xad.gz │ │ ├── xae.gz │ │ ├── xaf.gz │ │ ├── xag.gz │ │ ├── xah.gz │ │ ├── xai.gz │ │ ├── xaj.gz │ │ ├── xak.gz │ │ ├── xal.gz │ │ ├── xam.gz │ │ ├── xan.gz │ │ ├── xao.gz │ │ ├── xap.gz │ │ ├── xaq.gz │ │ ├── xar.gz │ │ ├── xas.gz │ │ ├── xat.gz │ │ ├── xau.gz │ │ ├── xav.gz │ │ ├── xaw.gz │ │ ├── xax.gz │ │ ├── xay.gz │ │ ├── xaz.gz │ │ ├── xba.gz │ │ ├── xbb.gz │ │ ├── xbc.gz │ │ ├── xbd.gz │ │ ├── xbe.gz │ │ ├── xbf.gz │ │ ├── xbg.gz │ │ ├── xbh.gz │ │ ├── xbi.gz │ │ ├── xbj.gz │ │ ├── xbk.gz │ │ ├── xbl.gz │ │ ├── xbm.gz │ │ ├── xbn.gz │ │ ├── xbo.gz │ │ ├── xbp.gz │ │ ├── xbq.gz │ │ ├── xbr.gz │ │ ├── xbs.gz │ │ ├── xbt.gz │ │ ├── xbu.gz │ │ ├── xbv.gz │ │ ├── xbw.gz │ │ ├── xbx.gz │ │ ├── xby.gz │ │ ├── xbz.gz │ │ ├── xca.gz │ │ ├── xcb.gz │ │ ├── xcc.gz │ │ ├── xcd.gz │ │ ├── xce.gz │ │ ├── xcf.gz │ │ ├── xcg.gz │ │ ├── xch.gz │ │ ├── xci.gz │ │ ├── xcj.gz │ │ ├── xck.gz │ │ ├── xcl.gz │ │ ├── xcm.gz │ │ ├── xcn.gz │ │ ├── xco.gz │ │ ├── xcp.gz │ │ ├── xcq.gz │ │ ├── xcr.gz │ │ ├── xcs.gz │ │ ├── xct.gz │ │ ├── xcu.gz │ │ ├── xcv.gz │ │ ├── xcw.gz │ │ ├── xcx.gz │ │ ├── xcy.gz │ │ ├── xcz.gz │ │ ├── xda.gz │ │ ├── xdb.gz │ │ ├── xdc.gz │ │ ├── xdd.gz │ │ ├── xde.gz │ │ ├── xdf.gz │ │ ├── xdg.gz │ │ ├── xdh.gz │ │ ├── xdi.gz │ │ ├── xdj.gz │ │ ├── xdk.gz │ │ ├── xdl.gz │ │ ├── xdm.gz │ │ ├── xdn.gz │ │ ├── xdo.gz │ │ ├── xdp.gz │ │ ├── xdq.gz │ │ ├── xdr.gz │ │ ├── xds.gz │ │ ├── xdt.gz │ │ ├── xdu.gz │ │ ├── xdv.gz │ │ ├── xdw.gz │ │ ├── xdx.gz │ │ ├── xdy.gz │ │ ├── xdz.gz │ │ ├── xea.gz │ │ ├── xeb.gz │ │ ├── xec.gz │ │ ├── xed.gz │ │ ├── xee.gz │ │ ├── xef.gz │ │ ├── xeg.gz │ │ ├── xeh.gz │ │ ├── xei.gz │ │ ├── xej.gz │ │ ├── xek.gz │ │ ├── xel.gz │ │ ├── xem.gz │ │ ├── xen.gz │ │ ├── xeo.gz │ │ ├── xep.gz │ │ ├── xeq.gz │ │ ├── xer.gz │ │ ├── xes.gz │ │ ├── xet.gz │ │ ├── xeu.gz │ │ ├── xev.gz │ │ ├── xew.gz │ │ ├── xex.gz │ │ ├── xey.gz │ │ ├── xez.gz │ │ ├── xfa.gz │ │ ├── xfb.gz │ │ ├── xfc.gz │ │ ├── xfd.gz │ │ ├── xfe.gz │ │ ├── xff.gz │ │ ├── xfg.gz │ │ ├── xfh.gz │ │ ├── xfi.gz │ │ ├── xfj.gz │ │ ├── xfk.gz │ │ ├── xfl.gz │ │ ├── xfm.gz │ │ ├── xfn.gz │ │ ├── xfo.gz │ │ ├── xfp.gz │ │ ├── xfq.gz │ │ ├── xfr.gz │ │ ├── xfs.gz │ │ ├── xft.gz │ │ ├── xfu.gz │ │ ├── xfv.gz │ │ ├── xfw.gz │ │ ├── xfx.gz │ │ ├── xfy.gz │ │ ├── xfz.gz │ │ ├── xga.gz │ │ ├── xgb.gz │ │ ├── xgc.gz │ │ ├── xgd.gz │ │ ├── xge.gz │ │ ├── xgf.gz │ │ ├── xgg.gz │ │ ├── xgh.gz │ │ ├── xgi.gz │ │ ├── xgj.gz │ │ ├── xgk.gz │ │ ├── xgl.gz │ │ ├── xgm.gz │ │ ├── xgn.gz │ │ ├── xgo.gz │ │ ├── xgp.gz │ │ ├── xgq.gz │ │ ├── xgr.gz │ │ ├── xgs.gz │ │ ├── xgt.gz │ │ ├── xgu.gz │ │ ├── xgv.gz │ │ ├── xgw.gz │ │ ├── xgx.gz │ │ ├── xgy.gz │ │ ├── xgz.gz │ │ ├── xha.gz │ │ ├── xhb.gz │ │ ├── xhc.gz │ │ ├── xhd.gz │ │ ├── xhe.gz │ │ ├── xhf.gz │ │ ├── xhg.gz │ │ ├── xhh.gz │ │ ├── xhi.gz │ │ ├── xhj.gz │ │ ├── xhk.gz │ │ ├── xhl.gz │ │ ├── xhm.gz │ │ ├── xhn.gz │ │ ├── xho.gz │ │ ├── xhp.gz │ │ ├── xhq.gz │ │ ├── xhr.gz │ │ ├── xhs.gz │ │ ├── xht.gz │ │ ├── xhu.gz │ │ ├── xhv.gz │ │ ├── xhw.gz │ │ ├── xhx.gz │ │ ├── xhy.gz │ │ ├── xhz.gz │ │ ├── xia.gz │ │ ├── xib.gz │ │ ├── xic.gz │ │ ├── xid.gz │ │ ├── xie.gz │ │ ├── xif.gz │ │ ├── xig.gz │ │ ├── xih.gz │ │ ├── xii.gz │ │ ├── xij.gz │ │ ├── xik.gz │ │ ├── xil.gz │ │ ├── xim.gz │ │ ├── xin.gz │ │ ├── xio.gz │ │ ├── xip.gz │ │ ├── xiq.gz │ │ ├── xir.gz │ │ ├── xis.gz │ │ ├── xit.gz │ │ ├── xiu.gz │ │ ├── xiv.gz │ │ ├── xiw.gz │ │ ├── xix.gz │ │ ├── xiy.gz │ │ ├── xiz.gz │ │ ├── xja.gz │ │ ├── xjb.gz │ │ ├── xjc.gz │ │ ├── xjd.gz │ │ ├── xje.gz │ │ ├── xjf.gz │ │ ├── xjg.gz │ │ ├── xjh.gz │ │ ├── xji.gz │ │ ├── xjj.gz │ │ ├── xjk.gz │ │ ├── xjl.gz │ │ ├── xjm.gz │ │ ├── xjn.gz │ │ ├── xjo.gz │ │ ├── xjp.gz │ │ ├── xjq.gz │ │ ├── xjr.gz │ │ ├── xjs.gz │ │ ├── xjt.gz │ │ ├── xju.gz │ │ ├── xjv.gz │ │ ├── xjw.gz │ │ ├── xjx.gz │ │ ├── xjy.gz │ │ ├── xjz.gz │ │ ├── xka.gz │ │ ├── xkb.gz │ │ ├── xkc.gz │ │ ├── xkd.gz │ │ ├── xke.gz │ │ ├── xkf.gz │ │ ├── xkg.gz │ │ ├── xkh.gz │ │ ├── xki.gz │ │ ├── xkj.gz │ │ ├── xkk.gz │ │ ├── xkl.gz │ │ ├── xkm.gz │ │ ├── xkn.gz │ │ ├── xko.gz │ │ ├── xkp.gz │ │ ├── xkq.gz │ │ ├── xkr.gz │ │ ├── xks.gz │ │ ├── xkt.gz │ │ ├── xku.gz │ │ ├── xkv.gz │ │ ├── xkw.gz │ │ ├── xkx.gz │ │ ├── xky.gz │ │ ├── xkz.gz │ │ ├── xla.gz │ │ ├── xlb.gz │ │ ├── xlc.gz │ │ └── xld.gz │ └── sqls │ │ ├── 20190508172744-create-schema-down.sql │ │ ├── 20190508172744-create-schema-up.sql │ │ ├── 20190508173315-create-unique-messages-down.sql │ │ ├── 20190508173315-create-unique-messages-up.sql │ │ ├── 20190606073105-add-block-height-index-down.sql │ │ ├── 20190606073105-add-block-height-index-up.sql │ │ ├── 20190608002923-update-ask-expiry-len-type-down.sql │ │ ├── 20190608002923-update-ask-expiry-len-type-up.sql │ │ ├── 20190819173206-populate-ip-to-locations-down.sql │ │ ├── 20190819173206-populate-ip-to-locations-up.sql │ │ ├── 20190918130707-remove-block-nonce-down.sql │ │ ├── 20190918130707-remove-block-nonce-up.sql │ │ └── README.md ├── package-lock.json ├── package.json ├── src │ ├── Backend.ts │ ├── Config.ts │ ├── Container.ts │ ├── client │ │ ├── ABI.ts │ │ ├── ChainClient.ts │ │ ├── FilecoinClient.ts │ │ ├── HTTPClient.ts │ │ ├── MinerClient.ts │ │ └── MinerUpdater.ts │ ├── domain │ │ ├── Block.ts │ │ ├── BlockFromClient.ts │ │ ├── BlockJSON.ts │ │ ├── Heartbeat.ts │ │ ├── Location.ts │ │ ├── Message.ts │ │ ├── MessageJSON.ts │ │ ├── MinerUpdate.ts │ │ ├── MiningPower.ts │ │ └── MiningStats.ts │ ├── main.ts │ ├── registry.ts │ ├── service │ │ ├── APIServer.ts │ │ ├── CacheService.ts │ │ ├── Chainsaw.ts │ │ ├── HeartbeatConsumer.ts │ │ ├── HeartbeatServer.ts │ │ ├── MaterializationService.ts │ │ ├── MiningPowerService.ts │ │ ├── NodeStatusService.ts │ │ ├── PGClient.ts │ │ ├── Service.ts │ │ ├── TimestampProvider.ts │ │ ├── api │ │ │ ├── IAPIService.ts │ │ │ ├── MinerStatsAPI.ts │ │ │ ├── StatsAPI.ts │ │ │ └── SyncAPI.ts │ │ └── dao │ │ │ ├── BlocksDAO.ts │ │ │ ├── ChainsawDAO.ts │ │ │ ├── GeolocationDAO.ts │ │ │ ├── MarketStatsDAO.ts │ │ │ ├── MinerCountsDAO.ts │ │ │ ├── MiningStatsDAO.ts │ │ │ ├── StorageStatsDAO.ts │ │ │ └── TokenStatsDAO.ts │ └── util │ │ ├── address.ts │ │ ├── conv.ts │ │ ├── durationPathRegex.ts │ │ ├── generateDurationSeries.ts │ │ ├── logger.ts │ │ ├── promisify.ts │ │ ├── providePeerInfo.ts │ │ └── synchronized.ts ├── tsconfig.json ├── types │ ├── IConnection.ts │ ├── Multiaddr.ts │ ├── bad-words.d.ts │ ├── blake2.d.ts │ ├── leb128.d.ts │ ├── libp2p-mplex.d.ts │ ├── libp2p-secio.d.ts │ ├── libp2p-tcp.d.ts │ ├── libp2p.d.ts │ ├── peer-id.d.ts │ ├── peer-info.d.ts │ ├── pull-split.d.ts │ └── pull-stream.d.ts └── vendor │ └── debug │ ├── index.js │ └── package.json ├── common ├── .gitignore ├── package-lock.json ├── package.json ├── src │ └── domain │ │ ├── Ask.ts │ │ ├── CategoryDatapoint.ts │ │ ├── ChartDuration.ts │ │ ├── CostCapacityForMinerStat.ts │ │ ├── HistogramDatapoint.ts │ │ ├── MinerStat.ts │ │ ├── Node.ts │ │ ├── Stats.ts │ │ └── TimeseriesDatapoint.ts └── tsconfig.json ├── docs ├── backend.md └── handoff │ ├── backend-architecture.md │ ├── cookbook.md │ ├── frontend-architecture.md │ └── stats-backend-architecture.png ├── example ├── backend.conf └── go-filecoin.conf ├── frontend ├── package-lock.json ├── package.json ├── src │ ├── assets │ │ ├── bars-solid.svg │ │ ├── change-networks-off.svg │ │ ├── change-networks-on.svg │ │ ├── chevron.svg │ │ ├── download.svg │ │ ├── home-off.svg │ │ ├── home-on.svg │ │ ├── icon.png │ │ ├── loader-dark.svg │ │ ├── loader.svg │ │ ├── logo-nopadding.svg │ │ ├── logo.svg │ │ ├── macroeconomics-off.svg │ │ ├── macroeconomics-on.svg │ │ ├── question-mark-greyscale.svg │ │ ├── question-mark-normal.svg │ │ ├── retrieval-off.svg │ │ ├── retrieval-on.svg │ │ ├── search.svg │ │ ├── sort.svg │ │ ├── storage-off.svg │ │ └── storage-on.svg │ ├── components │ │ ├── AnimatedMap.scss │ │ ├── AnimatedMap.tsx │ │ ├── AveragePriceTooltip.tsx │ │ ├── BaseDropdown.tsx │ │ ├── CapacityTooltip.tsx │ │ ├── ChangeNetworksModal.scss │ │ ├── ChangeNetworksModal.tsx │ │ ├── Chart.scss │ │ ├── Chart.tsx │ │ ├── ClickCopyable.scss │ │ ├── ClickCopyable.tsx │ │ ├── ContentArea.scss │ │ ├── ContentArea.tsx │ │ ├── ContentHeader.scss │ │ ├── ContentHeader.tsx │ │ ├── CurrencyWithTooltip.tsx │ │ ├── DateSwitchingChart.scss │ │ ├── DateSwitchingChart.tsx │ │ ├── DisclaimerModal.scss │ │ ├── DisclaimerModal.tsx │ │ ├── Dropdown.scss │ │ ├── Dropdown.tsx │ │ ├── FloatTimeago.tsx │ │ ├── GainLossTimelineChart.tsx │ │ ├── GlobalNav.scss │ │ ├── GlobalNav.tsx │ │ ├── GraphColors.ts │ │ ├── Grid.scss │ │ ├── Grid.tsx │ │ ├── HistogramChart.tsx │ │ ├── Home.tsx │ │ ├── LabelledTooltip.scss │ │ ├── LabelledTooltip.tsx │ │ ├── Loader.tsx │ │ ├── Macroeconomics.tsx │ │ ├── Main.scss │ │ ├── Main.tsx │ │ ├── Map.tsx │ │ ├── MinerCountTooltip.tsx │ │ ├── MiningSummary.scss │ │ ├── MiningSummary.tsx │ │ ├── NodeMap.scss │ │ ├── NodeMap.tsx │ │ ├── PageHeader.scss │ │ ├── PageHeader.tsx │ │ ├── PercentageLineChart.tsx │ │ ├── PowerTooltip.tsx │ │ ├── Retrieval.tsx │ │ ├── Rollover.scss │ │ ├── Rollover.tsx │ │ ├── Sidebar.scss │ │ ├── Sidebar.tsx │ │ ├── SingleStat.scss │ │ ├── SingleStat.tsx │ │ ├── StackedColumnChart.tsx │ │ ├── SubNavbar.scss │ │ ├── SubNavbar.tsx │ │ ├── SwitchableContent.scss │ │ ├── SwitchableContent.tsx │ │ ├── SwitchableDateSwitchingChart.scss │ │ ├── SwitchableDateSwitchingChart.tsx │ │ ├── Table.scss │ │ ├── Table.tsx │ │ ├── TimelineDateChart.tsx │ │ ├── Tooltip.scss │ │ ├── Tooltip.tsx │ │ ├── UtilizationTooltip.tsx │ │ ├── VolumeTransactedTooltip.tsx │ │ ├── Warning.scss │ │ ├── Warning.tsx │ │ ├── storage │ │ │ ├── AverageStorageCostChart.tsx │ │ │ ├── HistoricalCollateralPerGBChart.tsx │ │ │ ├── HistoricalStoragePriceChart.tsx │ │ │ ├── HistoricalUtilizationChart.tsx │ │ │ ├── MinerCountChart.tsx │ │ │ ├── MiningEvolutionChart.scss │ │ │ ├── MiningEvolutionChart.tsx │ │ │ ├── StorageCapacityHistogram.tsx │ │ │ ├── StorageCostCapacity.tsx │ │ │ ├── StorageCostCapacityBySizeBreakdown.scss │ │ │ ├── StorageCostCapacityBySizeBreakdown.tsx │ │ │ ├── StorageDeals.tsx │ │ │ ├── StorageMinersTable.scss │ │ │ ├── StorageMinersTable.tsx │ │ │ └── StorageMining.tsx │ │ └── token │ │ │ ├── BlockRewardLifecycle.tsx │ │ │ ├── CoinsInCirculation.tsx │ │ │ ├── HistoricalBlockRewards.tsx │ │ │ ├── HistoricalCollateralChart.tsx │ │ │ └── TokenHoldingsDistribution.tsx │ ├── data │ │ └── depthData.ts │ ├── ducks │ │ ├── Action.ts │ │ ├── overrides.ts │ │ ├── stats.ts │ │ └── store.ts │ ├── index.html │ ├── index.scss │ ├── index.tsx │ ├── utils │ │ ├── ChartRenderQueue.ts │ │ ├── Currency.ts │ │ ├── Filesize.ts │ │ ├── OrderMagnitudeNumber.ts │ │ ├── PercentageNumber.ts │ │ ├── averages.ts │ │ ├── bemify.ts │ │ ├── ellipsify.ts │ │ ├── net.ts │ │ ├── randomData.ts │ │ ├── time.ts │ │ └── timeseriesUnits.ts │ └── variables.scss ├── tsconfig.json ├── types │ ├── copy-to-clipboard.d.ts │ ├── d3-geo-projection │ │ └── index.d.ts │ ├── index.d.ts │ └── react-timeago.d.ts └── webpack.config.js ├── images ├── go-filecoin-network-stats-dash-evolution.jpg └── go-filecoin-network-stats-dash-overview.jpg └── tools ├── backend.conf ├── binaries └── filecoin-linux.tar.gz ├── create-ask.sh ├── create-deal.sh ├── deploy.sh ├── remote-filecoin.sh └── tunnel-heartbeat.sh /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.{js,ts,tsx] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_size = 2 8 | indent_style = space -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | 63 | **/dist 64 | 65 | dump.rdb 66 | peerId.json 67 | 68 | .DS_Store 69 | .vscode 70 | 71 | -------------------------------------------------------------------------------- /COPYRIGHT: -------------------------------------------------------------------------------- 1 | This library is dual-licensed under Apache 2.0 and MIT terms. 2 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Copyright 2019 by the Filecoin contributors. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | netlify: 2 | cd common && npm install && npm run build && cd ../frontend && npm install && NODE_ENV=production npm run build && cd ../ && cp _redirects ./frontend/dist -------------------------------------------------------------------------------- /_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /backend/build/stub-debug.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | find ./node_modules -type d -name "debug" -execdir mv {} {}_old \; 4 | find ./node_modules -type d -name "debug_old" -exec bash -c 'cp -rf ./vendor/debug `dirname $1`' - {} \; 5 | find ./node_modules -type d -name "debug_old" -exec rm -rf {} \; 6 | exit 0 -------------------------------------------------------------------------------- /backend/migrations/20190508172744-create-schema.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var dbm; 4 | var type; 5 | var seed; 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var Promise; 9 | 10 | /** 11 | * We receive the dbmigrate dependency from dbmigrate initially. 12 | * This enables us to not have to rely on NODE_PATH. 13 | */ 14 | exports.setup = function(options, seedLink) { 15 | dbm = options.dbmigrate; 16 | type = dbm.dataType; 17 | seed = seedLink; 18 | Promise = options.Promise; 19 | }; 20 | 21 | exports.up = function(db) { 22 | var filePath = path.join(__dirname, 'sqls', '20190508172744-create-schema-up.sql'); 23 | return new Promise( function( resolve, reject ) { 24 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 25 | if (err) return reject(err); 26 | console.log('received data: ' + data); 27 | 28 | resolve(data); 29 | }); 30 | }) 31 | .then(function(data) { 32 | return db.runSql(data); 33 | }); 34 | }; 35 | 36 | exports.down = function(db) { 37 | var filePath = path.join(__dirname, 'sqls', '20190508172744-create-schema-down.sql'); 38 | return new Promise( function( resolve, reject ) { 39 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 40 | if (err) return reject(err); 41 | console.log('received data: ' + data); 42 | 43 | resolve(data); 44 | }); 45 | }) 46 | .then(function(data) { 47 | return db.runSql(data); 48 | }); 49 | }; 50 | 51 | exports._meta = { 52 | "version": 1 53 | }; 54 | -------------------------------------------------------------------------------- /backend/migrations/20190508173315-create-unique-messages.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var dbm; 4 | var type; 5 | var seed; 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var Promise; 9 | 10 | /** 11 | * We receive the dbmigrate dependency from dbmigrate initially. 12 | * This enables us to not have to rely on NODE_PATH. 13 | */ 14 | exports.setup = function(options, seedLink) { 15 | dbm = options.dbmigrate; 16 | type = dbm.dataType; 17 | seed = seedLink; 18 | Promise = options.Promise; 19 | }; 20 | 21 | exports.up = function(db) { 22 | var filePath = path.join(__dirname, 'sqls', '20190508173315-create-unique-messages-up.sql'); 23 | return new Promise( function( resolve, reject ) { 24 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 25 | if (err) return reject(err); 26 | console.log('received data: ' + data); 27 | 28 | resolve(data); 29 | }); 30 | }) 31 | .then(function(data) { 32 | return db.runSql(data); 33 | }); 34 | }; 35 | 36 | exports.down = function(db) { 37 | var filePath = path.join(__dirname, 'sqls', '20190508173315-create-unique-messages-down.sql'); 38 | return new Promise( function( resolve, reject ) { 39 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 40 | if (err) return reject(err); 41 | console.log('received data: ' + data); 42 | 43 | resolve(data); 44 | }); 45 | }) 46 | .then(function(data) { 47 | return db.runSql(data); 48 | }); 49 | }; 50 | 51 | exports._meta = { 52 | "version": 1 53 | }; 54 | -------------------------------------------------------------------------------- /backend/migrations/20190606073105-add-block-height-index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var dbm; 4 | var type; 5 | var seed; 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var Promise; 9 | 10 | /** 11 | * We receive the dbmigrate dependency from dbmigrate initially. 12 | * This enables us to not have to rely on NODE_PATH. 13 | */ 14 | exports.setup = function(options, seedLink) { 15 | dbm = options.dbmigrate; 16 | type = dbm.dataType; 17 | seed = seedLink; 18 | Promise = options.Promise; 19 | }; 20 | 21 | exports.up = function(db) { 22 | var filePath = path.join(__dirname, 'sqls', '20190606073105-add-block-height-index-up.sql'); 23 | return new Promise( function( resolve, reject ) { 24 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 25 | if (err) return reject(err); 26 | console.log('received data: ' + data); 27 | 28 | resolve(data); 29 | }); 30 | }) 31 | .then(function(data) { 32 | return db.runSql(data); 33 | }); 34 | }; 35 | 36 | exports.down = function(db) { 37 | var filePath = path.join(__dirname, 'sqls', '20190606073105-add-block-height-index-down.sql'); 38 | return new Promise( function( resolve, reject ) { 39 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 40 | if (err) return reject(err); 41 | console.log('received data: ' + data); 42 | 43 | resolve(data); 44 | }); 45 | }) 46 | .then(function(data) { 47 | return db.runSql(data); 48 | }); 49 | }; 50 | 51 | exports._meta = { 52 | "version": 1 53 | }; 54 | -------------------------------------------------------------------------------- /backend/migrations/20190608002923-update-ask-expiry-len-type.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var dbm; 4 | var type; 5 | var seed; 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var Promise; 9 | 10 | /** 11 | * We receive the dbmigrate dependency from dbmigrate initially. 12 | * This enables us to not have to rely on NODE_PATH. 13 | */ 14 | exports.setup = function(options, seedLink) { 15 | dbm = options.dbmigrate; 16 | type = dbm.dataType; 17 | seed = seedLink; 18 | Promise = options.Promise; 19 | }; 20 | 21 | exports.up = function(db) { 22 | var filePath = path.join(__dirname, 'sqls', '20190608002923-update-ask-expiry-len-type-up.sql'); 23 | return new Promise( function( resolve, reject ) { 24 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 25 | if (err) return reject(err); 26 | console.log('received data: ' + data); 27 | 28 | resolve(data); 29 | }); 30 | }) 31 | .then(function(data) { 32 | return db.runSql(data); 33 | }); 34 | }; 35 | 36 | exports.down = function(db) { 37 | var filePath = path.join(__dirname, 'sqls', '20190608002923-update-ask-expiry-len-type-down.sql'); 38 | return new Promise( function( resolve, reject ) { 39 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 40 | if (err) return reject(err); 41 | console.log('received data: ' + data); 42 | 43 | resolve(data); 44 | }); 45 | }) 46 | .then(function(data) { 47 | return db.runSql(data); 48 | }); 49 | }; 50 | 51 | exports._meta = { 52 | "version": 1 53 | }; 54 | -------------------------------------------------------------------------------- /backend/migrations/20190918130707-remove-block-nonce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var dbm; 4 | var type; 5 | var seed; 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var Promise; 9 | 10 | /** 11 | * We receive the dbmigrate dependency from dbmigrate initially. 12 | * This enables us to not have to rely on NODE_PATH. 13 | */ 14 | exports.setup = function(options, seedLink) { 15 | dbm = options.dbmigrate; 16 | type = dbm.dataType; 17 | seed = seedLink; 18 | Promise = options.Promise; 19 | }; 20 | 21 | exports.up = function(db) { 22 | var filePath = path.join(__dirname, 'sqls', '20190918130707-remove-block-nonce-up.sql'); 23 | return new Promise( function( resolve, reject ) { 24 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 25 | if (err) return reject(err); 26 | console.log('received data: ' + data); 27 | 28 | resolve(data); 29 | }); 30 | }) 31 | .then(function(data) { 32 | return db.runSql(data); 33 | }); 34 | }; 35 | 36 | exports.down = function(db) { 37 | var filePath = path.join(__dirname, 'sqls', '20190918130707-remove-block-nonce-down.sql'); 38 | return new Promise( function( resolve, reject ) { 39 | fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ 40 | if (err) return reject(err); 41 | console.log('received data: ' + data); 42 | 43 | resolve(data); 44 | }); 45 | }) 46 | .then(function(data) { 47 | return db.runSql(data); 48 | }); 49 | }; 50 | 51 | exports._meta = { 52 | "version": 1 53 | }; 54 | -------------------------------------------------------------------------------- /backend/migrations/IP2LOCATION-LITE-DB5.CSV.ZIP: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/IP2LOCATION-LITE-DB5.CSV.ZIP -------------------------------------------------------------------------------- /backend/migrations/ip_data/README.md: -------------------------------------------------------------------------------- 1 | # IP Data 2 | 3 | ## Source 4 | 5 | The dashboard's IP data comes from the IP2Location-DB5-Lite database. A CSV of that data is in the ZIP file in the `migrations` directory. 6 | 7 | ## Migration 8 | 9 | Managed database services such as RDS forbid the use of the `COPY` query with filesystem parameters. As a result, we instead perform raw `INSERT` statements to import each IP record. To fit them all in memory, this directory contains a set of compressed SQL files that contain 10,000 `INSERT` statements each. They were generated by running the `split` command on a SQL dump of the `ip_to_locations` table after populating it using the `COPY` query locally. The migration tool iterates overall of these files and streams them into the database. It's much slower than the `COPY` command, but it works on all database deployments. -------------------------------------------------------------------------------- /backend/migrations/ip_data/xaa.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xaa.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xab.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xab.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xac.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xac.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xad.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xad.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xae.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xae.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xaf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xaf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xag.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xag.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xah.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xah.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xai.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xai.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xaj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xaj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xak.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xak.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xal.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xal.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xam.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xam.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xan.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xan.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xao.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xao.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xap.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xap.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xaq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xaq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xar.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xas.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xas.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xat.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xat.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xau.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xau.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xav.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xav.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xaw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xaw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xax.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xax.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xay.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xay.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xaz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xaz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xba.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xba.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbe.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbe.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbi.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbi.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbo.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbo.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbs.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbs.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbt.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xby.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xby.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xbz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xbz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xca.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xca.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xce.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xce.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xch.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xch.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xci.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xci.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xck.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xck.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xco.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xco.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcs.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcs.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xct.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xct.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xcz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xcz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xda.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xda.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xde.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xde.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdi.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdi.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdo.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdo.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xds.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xds.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdt.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xdz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xdz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xea.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xea.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xeb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xeb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xec.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xec.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xed.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xed.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xee.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xee.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xef.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xef.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xeg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xeg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xeh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xeh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xei.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xei.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xej.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xej.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xek.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xek.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xel.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xel.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xem.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xem.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xen.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xen.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xeo.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xeo.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xep.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xep.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xeq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xeq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xer.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xer.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xes.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xet.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xet.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xeu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xeu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xev.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xev.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xew.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xew.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xex.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xex.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xey.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xey.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xez.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xez.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfa.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfa.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfe.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfe.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xff.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xff.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfi.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfi.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfo.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfo.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfs.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfs.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xft.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xft.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xfz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xfz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xga.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xga.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xge.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xge.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgi.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgi.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgo.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgo.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgs.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgs.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgt.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xgz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xgz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xha.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xha.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhe.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhe.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhi.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhi.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xho.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xho.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhs.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhs.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xht.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xht.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xhz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xhz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xia.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xia.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xib.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xib.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xic.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xic.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xid.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xid.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xie.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xie.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xif.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xif.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xig.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xig.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xih.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xih.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xii.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xii.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xij.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xij.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xik.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xik.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xil.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xil.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xim.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xim.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xin.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xin.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xio.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xio.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xip.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xip.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xiq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xiq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xir.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xir.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xis.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xis.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xit.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xit.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xiu.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xiu.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xiv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xiv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xiw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xiw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xix.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xix.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xiy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xiy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xiz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xiz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xja.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xja.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xje.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xje.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xji.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xji.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjo.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjo.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjs.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjs.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjt.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xju.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xju.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjy.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjy.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xjz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xjz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xka.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xka.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkd.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkd.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xke.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xke.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkf.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkg.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkh.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkh.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xki.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xki.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkj.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkj.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkk.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkk.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkl.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkl.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkm.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkn.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkn.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xko.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xko.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkp.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkq.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkq.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkr.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkr.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xks.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xks.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkt.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xku.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xku.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkv.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkw.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkx.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkx.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xky.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xky.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xkz.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xkz.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xla.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xla.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xlb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xlb.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xlc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xlc.gz -------------------------------------------------------------------------------- /backend/migrations/ip_data/xld.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/backend/migrations/ip_data/xld.gz -------------------------------------------------------------------------------- /backend/migrations/sqls/20190508172744-create-schema-down.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190508173315-create-unique-messages-down.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190606073105-add-block-height-index-down.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190606073105-add-block-height-index-up.sql: -------------------------------------------------------------------------------- 1 | CREATE INDEX block_height_idx ON blocks USING btree(height); -------------------------------------------------------------------------------- /backend/migrations/sqls/20190608002923-update-ask-expiry-len-type-down.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190608002923-update-ask-expiry-len-type-up.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE asks ALTER COLUMN expiry_length SET DATA TYPE bigint; -------------------------------------------------------------------------------- /backend/migrations/sqls/20190819173206-populate-ip-to-locations-down.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190819173206-populate-ip-to-locations-up.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190918130707-remove-block-nonce-down.sql: -------------------------------------------------------------------------------- 1 | /* Replace with your SQL commands */ -------------------------------------------------------------------------------- /backend/migrations/sqls/20190918130707-remove-block-nonce-up.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE ONLY blocks DROP COLUMN nonce; -------------------------------------------------------------------------------- /backend/migrations/sqls/README.md: -------------------------------------------------------------------------------- 1 | ## Important note about migrations 2 | 3 | All previous migration *.sql files here are immutable! Do not change them. 4 | 5 | If you would like to update the database schema please create a _new migration file_ that modifies the database state after all existing migrations have been applied. 6 | 7 | Application level tables are truncated on deploy so we aren't losing migration tables and geolocation tables on every deploy. 8 | 9 | Also it's general best practice to consider migrations immutable. 10 | -------------------------------------------------------------------------------- /backend/src/Config.ts: -------------------------------------------------------------------------------- 1 | export const VALUE_SECTOR_DIVISOR = 0.001; 2 | export const SECTOR_SIZE_BYTES = 256 * 1048576; 3 | export const SECTOR_SIZE_GB = SECTOR_SIZE_BYTES * 1e-9; 4 | 5 | export interface Config { 6 | dbUrl: string 7 | redisUrl: string 8 | fullNodeUrl: string 9 | isMaster: boolean 10 | peerInfoFile: string 11 | heartbeatPort: string 12 | apiPort: string 13 | genesisCID?: string 14 | } 15 | 16 | export function fromEnv (): Config { 17 | return { 18 | dbUrl: process.env.DB_URL!, 19 | redisUrl: process.env.REDIS_URL!, 20 | fullNodeUrl: process.env.FULL_NODE_URL!, 21 | isMaster: process.env.IS_MASTER === 'true', 22 | peerInfoFile: process.env.PEER_INFO_FILE!, 23 | heartbeatPort: process.env.HEARTBEAT_PORT!, 24 | apiPort: process.env.API_PORT!, 25 | genesisCID: process.env.GENESIS_CID 26 | }; 27 | } -------------------------------------------------------------------------------- /backend/src/client/FilecoinClient.ts: -------------------------------------------------------------------------------- 1 | import HTTPClient from './HTTPClient'; 2 | import {ChainClientImpl, IChainClient} from './ChainClient'; 3 | import {IMinerClient, MinerClientImpl} from './MinerClient'; 4 | 5 | export interface IFilecoinClient { 6 | chain (): IChainClient 7 | 8 | miner (): IMinerClient 9 | } 10 | 11 | export default class FilecoinClient implements IFilecoinClient { 12 | private readonly client: HTTPClient; 13 | 14 | private readonly chainClient: IChainClient; 15 | 16 | private readonly minerClient: IMinerClient; 17 | 18 | constructor (client: HTTPClient) { 19 | this.client = client; 20 | this.chainClient = new ChainClientImpl(this.client); 21 | this.minerClient = new MinerClientImpl(this.client); 22 | } 23 | 24 | chain (): IChainClient { 25 | return this.chainClient; 26 | } 27 | 28 | miner (): IMinerClient { 29 | return this.minerClient; 30 | } 31 | } -------------------------------------------------------------------------------- /backend/src/client/MinerUpdater.ts: -------------------------------------------------------------------------------- 1 | import {IMinerClient} from './MinerClient'; 2 | import {MinerUpdate} from '../domain/MinerUpdate'; 3 | 4 | export default class MinerUpdater { 5 | private minerClient: IMinerClient; 6 | 7 | private addresses: { [k: string]: true } = {}; 8 | 9 | constructor (minerClient: IMinerClient) { 10 | this.minerClient = minerClient; 11 | } 12 | 13 | public addAddress (address: string) { 14 | this.addresses[address] = true; 15 | } 16 | 17 | async update (): Promise { 18 | const addresses = Object.keys(this.addresses); 19 | const ret = []; 20 | for (const address of addresses) { 21 | const amount = await this.minerClient.pledge(address); 22 | const power = await this.minerClient.power(address); 23 | ret.push({ 24 | address, 25 | amount, 26 | power 27 | }); 28 | } 29 | 30 | return ret; 31 | } 32 | } -------------------------------------------------------------------------------- /backend/src/domain/Block.ts: -------------------------------------------------------------------------------- 1 | export interface Block { 2 | height: number 3 | miner: string 4 | parentWeight: number 5 | ingestedAt: number 6 | parents: string[] 7 | } -------------------------------------------------------------------------------- /backend/src/domain/BlockFromClient.ts: -------------------------------------------------------------------------------- 1 | import {Message} from './Message'; 2 | 3 | export interface BlockFromClient { 4 | miner: string 5 | 6 | tipsetHash: string 7 | 8 | parents: string[] 9 | 10 | height: number 11 | 12 | parentWeight: number 13 | 14 | } 15 | 16 | export type BlockFromClientWithMessages = BlockFromClient & { 17 | messages: Message[] 18 | } -------------------------------------------------------------------------------- /backend/src/domain/BlockJSON.ts: -------------------------------------------------------------------------------- 1 | import {MessageJSON} from './MessageJSON'; 2 | 3 | export interface RawBlockJSON { 4 | Header: RawHeader; 5 | 6 | Messages: MessageJSON[]|null; 7 | 8 | Receipts: any[] 9 | } 10 | 11 | export interface RawHeader { 12 | miner: string; 13 | 14 | tickets: any[]; 15 | 16 | parents: { '/': string }[]; 17 | 18 | parentWeight: string; 19 | 20 | height: string; 21 | 22 | stateRoot: { [k: string]: string }; 23 | 24 | messageReceipts: any; 25 | 26 | messages: any; 27 | 28 | proof: any[]; 29 | } -------------------------------------------------------------------------------- /backend/src/domain/Heartbeat.ts: -------------------------------------------------------------------------------- 1 | export interface Heartbeat { 2 | head: string 3 | height: number 4 | nickname: string 5 | peerId: string 6 | ip: string 7 | minerAddress: string 8 | genesisCid: string 9 | } -------------------------------------------------------------------------------- /backend/src/domain/Location.ts: -------------------------------------------------------------------------------- 1 | export interface Location { 2 | lat: number, 3 | long: number 4 | } -------------------------------------------------------------------------------- /backend/src/domain/Message.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | 3 | export interface Message { 4 | height: number 5 | 6 | tipsetHash: string 7 | 8 | nonce: number 9 | 10 | index: number 11 | 12 | gasPrice: BigNumber 13 | 14 | gasLimit: BigNumber 15 | 16 | from: string 17 | 18 | to: string 19 | 20 | value: BigNumber|null 21 | 22 | method: string 23 | 24 | params: any|null 25 | } -------------------------------------------------------------------------------- /backend/src/domain/MessageJSON.ts: -------------------------------------------------------------------------------- 1 | export interface MessageJSON { 2 | meteredMessage: { 3 | message: { 4 | to: string 5 | from: string 6 | nonce: string 7 | value: string|null 8 | method: string 9 | params: any 10 | } 11 | 12 | gasPrice: string 13 | 14 | gasLimit: string 15 | } 16 | } -------------------------------------------------------------------------------- /backend/src/domain/MinerUpdate.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | import {MiningPower} from './MiningPower'; 3 | 4 | export interface MinerUpdate { 5 | address: string 6 | amount: BigNumber 7 | power: MiningPower 8 | } -------------------------------------------------------------------------------- /backend/src/domain/MiningPower.ts: -------------------------------------------------------------------------------- 1 | export interface MiningPower { 2 | miner: number 3 | 4 | total: number 5 | } -------------------------------------------------------------------------------- /backend/src/domain/MiningStats.ts: -------------------------------------------------------------------------------- 1 | export interface MiningStats { 2 | lastBlockHeight: number 3 | lastBlockTime: number 4 | averageBlockTime: number 5 | minerName: string|null 6 | minerAddress: string 7 | } -------------------------------------------------------------------------------- /backend/src/main.ts: -------------------------------------------------------------------------------- 1 | import {fromEnv} from './Config'; 2 | import Backend from './Backend'; 3 | require('heapdump'); 4 | 5 | const config = fromEnv(); 6 | const backend = new Backend(config); 7 | 8 | (async function() { 9 | await backend.start(); 10 | })(); -------------------------------------------------------------------------------- /backend/src/service/HeartbeatConsumer.ts: -------------------------------------------------------------------------------- 1 | import {Heartbeat} from '../domain/Heartbeat'; 2 | import makeLogger from '../util/logger'; 3 | import {INodeStatusService} from './NodeStatusService'; 4 | 5 | const logger = makeLogger('HeartbeatConsumer'); 6 | 7 | export interface IHeartbeatConsumer { 8 | handle (heartbeat: Heartbeat): void 9 | } 10 | 11 | export class HeartbeatConsumerImpl implements IHeartbeatConsumer { 12 | private readonly nsd: INodeStatusService; 13 | 14 | constructor (nsd: INodeStatusService) { 15 | this.nsd = nsd; 16 | } 17 | 18 | handle = (heartbeat: Heartbeat) => { 19 | logger.silly('received heartbeat', { 20 | heartbeat, 21 | }); 22 | 23 | this.nsd.consumeHeartbeat(heartbeat) 24 | .catch((err: any) => logger.error('failed to consume heartbeat', {err})); 25 | }; 26 | } -------------------------------------------------------------------------------- /backend/src/service/PGClient.ts: -------------------------------------------------------------------------------- 1 | import {Config} from '../Config'; 2 | import IService from './Service'; 3 | import {Pool, PoolClient} from 'pg'; 4 | 5 | export default class PGClient implements IService { 6 | private readonly config: Config; 7 | private pool: Pool | null = null; 8 | 9 | constructor (config: Config) { 10 | this.config = config; 11 | } 12 | 13 | async start (): Promise { 14 | this.pool = new Pool({ 15 | connectionString: this.config.dbUrl, 16 | max: 10, 17 | idleTimeoutMillis: 30000, 18 | }); 19 | 20 | await this.pool.connect(); 21 | } 22 | 23 | async stop (): Promise { 24 | if (!this.pool) { 25 | return; 26 | } 27 | 28 | await this.pool.end(); 29 | } 30 | 31 | async execute (cb: (client: PoolClient) => Promise): Promise { 32 | const client = await this.pool.connect(); 33 | 34 | try { 35 | return cb(client); 36 | } finally { 37 | client.release(); 38 | } 39 | } 40 | 41 | async executeTx (cb: (client: PoolClient) => Promise): Promise { 42 | const client = await this.pool.connect(); 43 | 44 | try { 45 | await client.query('BEGIN'); 46 | const res = await cb(client); 47 | await client.query('COMMIT'); 48 | return res; 49 | } catch (e) { 50 | await client.query('ROLLBACK'); 51 | throw e; 52 | } finally { 53 | client.release(); 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /backend/src/service/Service.ts: -------------------------------------------------------------------------------- 1 | export default interface IService { 2 | start (): Promise 3 | 4 | stop (): Promise 5 | } -------------------------------------------------------------------------------- /backend/src/service/TimestampProvider.ts: -------------------------------------------------------------------------------- 1 | export interface ITimestampProvider { 2 | now(): number 3 | } 4 | 5 | export default class SystemTimestampProvider implements ITimestampProvider { 6 | now (): number { 7 | return Math.floor(Date.now() / 1000); 8 | } 9 | } -------------------------------------------------------------------------------- /backend/src/service/api/IAPIService.ts: -------------------------------------------------------------------------------- 1 | import {Request, Response} from 'express'; 2 | 3 | export interface APIDefinition { 4 | [k: string]: (req: Request, res: Response) => void 5 | } 6 | 7 | export default interface IAPIService { 8 | namespace: string 9 | GET?: APIDefinition 10 | POST?: APIDefinition 11 | } -------------------------------------------------------------------------------- /backend/src/service/api/MinerStatsAPI.ts: -------------------------------------------------------------------------------- 1 | import {Request, Response} from 'express'; 2 | import IAPIService from './IAPIService'; 3 | import {IStorageStatsDAO} from '../dao/StorageStatsDAO'; 4 | import csv = require('fast-csv'); 5 | import makeLogger from '../../util/logger'; 6 | 7 | const logger = makeLogger('MinerStatsAPI'); 8 | 9 | export default class MinerStatsAPI implements IAPIService { 10 | namespace = 'miners'; 11 | 12 | private ssd: IStorageStatsDAO; 13 | 14 | constructor (ssd: IStorageStatsDAO) { 15 | this.ssd = ssd; 16 | } 17 | 18 | private csv = async (req: Request, res: Response) => { 19 | const miners = await this.ssd.getMinerStats(); 20 | const stream = csv.format({ headers: true }); 21 | const id = Math.floor(Date.now() / 1000); 22 | res.setHeader('Content-Type', 'text/csv'); 23 | res.setHeader('Content-Disposition', `attachment; filename=filecoin-miner-stats-${id}.csv`); 24 | stream.pipe(res); 25 | let hasError = false; 26 | stream.on('error', (err: any) => { 27 | hasError = true; 28 | logger.error('Error while generating CSV', { 29 | err 30 | }); 31 | }); 32 | 33 | for (const miner of miners) { 34 | if (hasError) { 35 | break; 36 | } 37 | 38 | stream.write(miner); 39 | } 40 | 41 | stream.end(); 42 | }; 43 | 44 | GET = { 45 | 'csv': this.csv, 46 | }; 47 | } -------------------------------------------------------------------------------- /backend/src/service/api/SyncAPI.ts: -------------------------------------------------------------------------------- 1 | import IAPIService from './IAPIService'; 2 | import {Request, Response} from 'express'; 3 | import {IMiningStatsDAO} from '../dao/MiningStatsDAO'; 4 | import {IMarketStatsDAO} from '../dao/MarketStatsDAO'; 5 | import {statsToJSON} from 'filecoin-network-stats-common/lib/domain/Stats'; 6 | import {IStorageStatsDAO} from '../dao/StorageStatsDAO'; 7 | import {INodeStatusService} from '../NodeStatusService'; 8 | import {ITokenStatsDAO} from '../dao/TokenStatsDAO'; 9 | 10 | export default class SyncAPI implements IAPIService { 11 | namespace = 'sync'; 12 | 13 | private readonly msd: IMiningStatsDAO; 14 | 15 | private readonly mksd: IMarketStatsDAO; 16 | 17 | private readonly ssd: IStorageStatsDAO; 18 | 19 | private readonly nsd: INodeStatusService; 20 | 21 | private readonly tsd: ITokenStatsDAO; 22 | 23 | constructor (msd: IMiningStatsDAO, mksd: IMarketStatsDAO, ssd: IStorageStatsDAO, nsd: INodeStatusService, tsd: ITokenStatsDAO) { 24 | this.msd = msd; 25 | this.mksd = mksd; 26 | this.ssd = ssd; 27 | this.nsd = nsd; 28 | this.tsd = tsd; 29 | } 30 | 31 | private stats = async (req: Request, res: Response) => { 32 | const mining = await this.msd.getStats(); 33 | const market = await this.mksd.getStats(); 34 | const storage = await this.ssd.getStats(); 35 | const nodes = await this.nsd.listNodes(); 36 | const token = await this.tsd.getStats(); 37 | 38 | res.json(statsToJSON({ 39 | mining, 40 | market, 41 | storage, 42 | nodes, 43 | token, 44 | })); 45 | }; 46 | 47 | GET = { 48 | '': this.stats, 49 | }; 50 | } -------------------------------------------------------------------------------- /backend/src/service/dao/GeolocationDAO.ts: -------------------------------------------------------------------------------- 1 | import PGClient from '../PGClient'; 2 | import {Location} from '../../domain/Location'; 3 | import {PoolClient} from 'pg'; 4 | import makeLogger from '../../util/logger'; 5 | 6 | const logger = makeLogger('GeolocationDAO'); 7 | 8 | export interface IGeolocationDAO { 9 | locateIp (ip: string): Promise 10 | } 11 | 12 | export class PostgresGeolocationDAO implements IGeolocationDAO { 13 | private readonly client: PGClient; 14 | 15 | constructor (client: PGClient) { 16 | this.client = client; 17 | } 18 | 19 | locateIp (ip: string): Promise { 20 | // TODO: remove on real server 21 | if (ip === '127.0.0.1') { 22 | ip = '208.82.98.123'; 23 | } 24 | 25 | const intIp = this.ipToInt(ip); 26 | logger.silly('geolocating IP', {ip, intIp}); 27 | return this.client.execute(async (client: PoolClient) => { 28 | const res = await client.query( 29 | 'SELECT * FROM ip_to_locations WHERE ip_from >= $1 ORDER BY ip_to ASC LIMIT 1', 30 | [intIp], 31 | ); 32 | 33 | if (!res.rows.length) { 34 | return null; 35 | } 36 | 37 | return { 38 | lat: res.rows[0].latitude, 39 | long: res.rows[0].longitude, 40 | }; 41 | }); 42 | } 43 | 44 | private ipToInt (ip: string): number { 45 | const splits = ip.split('.'); 46 | let out = 0; 47 | for (let i = 0; i < splits.length; i++) { 48 | out += Number(splits[i]) * Math.pow(256, splits.length - 1 - i); 49 | } 50 | 51 | return out; 52 | } 53 | } -------------------------------------------------------------------------------- /backend/src/service/dao/MinerCountsDAO.ts: -------------------------------------------------------------------------------- 1 | import PGClient from '../PGClient'; 2 | import {PoolClient} from 'pg'; 3 | import {ITimestampProvider} from '../TimestampProvider'; 4 | 5 | export interface IMinerCountsDAO { 6 | saveMinerCounts (count: number): Promise 7 | } 8 | 9 | export class PostgresMinerCountsDAO implements IMinerCountsDAO { 10 | private readonly client: PGClient; 11 | 12 | private readonly tsp: ITimestampProvider; 13 | 14 | constructor (client: PGClient, tsp: ITimestampProvider) { 15 | this.client = client; 16 | this.tsp = tsp; 17 | } 18 | 19 | saveMinerCounts (count: number): Promise { 20 | return this.client.executeTx((client: PoolClient) => client.query( 21 | 'INSERT INTO miner_counts (count, calculated_at) VALUES ($1, $2)', 22 | [ 23 | count, 24 | this.tsp.now(), 25 | ], 26 | ) as Promise); 27 | } 28 | } -------------------------------------------------------------------------------- /backend/src/util/conv.ts: -------------------------------------------------------------------------------- 1 | import leb = require('leb128'); 2 | import BigNumber from 'bignumber.js'; 3 | 4 | export function leb128Base642Number (input: string): number { 5 | const buf = Buffer.from(input, 'base64'); 6 | const decoded = leb.unsigned.decode(buf); 7 | return parseInt(decoded); 8 | } 9 | 10 | export function leb128UnsignedBase642Big (input: string): BigNumber { 11 | const buf = Buffer.from(input, 'base64'); 12 | return leb128Unsigned2Big(buf); 13 | } 14 | 15 | export function leb128Unsigned2Big (buf: Buffer): BigNumber { 16 | const decoded = leb.unsigned.decode(buf); 17 | return new BigNumber(decoded); 18 | } 19 | 20 | export function leb128Unsigned2String(buf: Buffer): string { 21 | return leb.unsigned.decode(buf); 22 | } -------------------------------------------------------------------------------- /backend/src/util/durationPathRegex.ts: -------------------------------------------------------------------------------- 1 | import {ChartDuration} from 'filecoin-network-stats-common/lib/domain/ChartDuration'; 2 | 3 | export const durationPathRegex = `(${ChartDuration.ALL}|${ChartDuration.DAY}|${ChartDuration.WEEK}|${ChartDuration.MONTH}|${ChartDuration.YEAR})`; 4 | 5 | export default durationPathRegex; -------------------------------------------------------------------------------- /backend/src/util/generateDurationSeries.ts: -------------------------------------------------------------------------------- 1 | import {ChartDuration} from 'filecoin-network-stats-common/lib/domain/ChartDuration'; 2 | 3 | export function generateDurationSeries (duration: ChartDuration): { durSeq: string, durBase: string, durInterval: string } { 4 | let durSeq; 5 | let durBase; 6 | let durInterval; 7 | 8 | switch (duration) { 9 | case ChartDuration.DAY: 10 | durSeq = `SELECT date 11 | FROM generate_duration_series(INTERVAL '24 hours', 'hour')`; 12 | durBase = 'hour'; 13 | durInterval = '1 hour'; 14 | break; 15 | case ChartDuration.WEEK: 16 | durSeq = `SELECT date 17 | FROM generate_duration_series(INTERVAL '7 days', 'day')`; 18 | durBase = 'day'; 19 | durInterval = '1 day'; 20 | break; 21 | case ChartDuration.MONTH: 22 | durSeq = `SELECT date 23 | FROM generate_duration_series(INTERVAL '30 days', 'day')`; 24 | durBase = 'day'; 25 | durInterval = '30 days'; 26 | break; 27 | case ChartDuration.ALL: 28 | case ChartDuration.YEAR: 29 | durSeq = `SELECT date 30 | FROM generate_duration_series(INTERVAL '12 months', 'month')`; 31 | durBase = 'month'; 32 | durInterval = '1 month'; 33 | break; 34 | } 35 | 36 | return { 37 | durSeq, 38 | durBase, 39 | durInterval, 40 | }; 41 | } -------------------------------------------------------------------------------- /backend/src/util/logger.ts: -------------------------------------------------------------------------------- 1 | import * as winston from 'winston'; 2 | import {Logger} from 'winston'; 3 | 4 | function replaceError (e: Error) { 5 | return { 6 | message: e.message, 7 | stack: e.stack, 8 | }; 9 | } 10 | 11 | export default function makeLogger (module: string): Logger { 12 | return winston.createLogger({ 13 | level: process.env.LOG_LEVEL || 'info', 14 | format: winston.format.combine( 15 | winston.format.label({label: module}), 16 | winston.format.timestamp(), 17 | winston.format.json({ 18 | replacer: (k: string, v: any) => v instanceof Error ? replaceError(v) : v, 19 | }), 20 | ), 21 | transports: [ 22 | new winston.transports.Console(), 23 | ], 24 | }); 25 | } -------------------------------------------------------------------------------- /backend/src/util/promisify.ts: -------------------------------------------------------------------------------- 1 | export function promisify (actor: (cb: (err: any, arg?: T) => void) => void): Promise { 2 | return new Promise(((resolve, reject) => actor((err, arg) => { 3 | if (err) { 4 | return reject(err); 5 | } 6 | 7 | resolve(arg); 8 | }))); 9 | } -------------------------------------------------------------------------------- /backend/src/util/providePeerInfo.ts: -------------------------------------------------------------------------------- 1 | import PeerInfo = require('peer-info'); 2 | import * as fs from 'fs'; 3 | import {Config} from '../Config'; 4 | 5 | export async function providePeerInfo (config: Config): Promise { 6 | const buf = await new Promise((resolve, reject) => fs.readFile(config.peerInfoFile, (err: any, res: Buffer) => { 7 | if (err) { 8 | return reject(err); 9 | } 10 | 11 | resolve(res); 12 | })); 13 | 14 | const json = JSON.parse(buf.toString('utf-8')); 15 | 16 | return new Promise(((resolve, reject) => PeerInfo.create(json, (err: any, res: PeerInfo) => { 17 | if (err) { 18 | return reject(err); 19 | } 20 | 21 | res.multiaddrs.add(`/ip4/0.0.0.0/tcp/${config.heartbeatPort}`); 22 | resolve(res); 23 | }))); 24 | } -------------------------------------------------------------------------------- /backend/src/util/synchronized.ts: -------------------------------------------------------------------------------- 1 | export function synchronized (proc: (...args: any[]) => Promise) { 2 | let inFlight: Promise | null = null; 3 | 4 | return (...args: any[]) => { 5 | if (!inFlight) { 6 | inFlight = (async () => { 7 | try { 8 | return await proc(...args); 9 | } finally { 10 | inFlight = null; 11 | } 12 | })(); 13 | } 14 | 15 | return inFlight; 16 | }; 17 | } 18 | 19 | export function synchronizedOn(proc: (...args: any[]) => Promise) { 20 | let flights: { [k: string]: Promise } = {}; 21 | 22 | return (key: string, ...args: any[]) => { 23 | if (!flights[key]) { 24 | flights[key] = (async () => { 25 | try { 26 | return await proc(...args); 27 | } finally { 28 | delete flights[key]; 29 | } 30 | })(); 31 | } 32 | 33 | return flights[key]; 34 | }; 35 | } -------------------------------------------------------------------------------- /backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "sourceMap": true, 5 | "noImplicitAny": true, 6 | "module": "commonjs", 7 | "target": "es6", 8 | "types": ["node"], 9 | "lib": [ 10 | "es6", 11 | "es2015" 12 | ] 13 | }, 14 | "include": [ 15 | "./types/**/*", 16 | "./src/**/*" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /backend/types/IConnection.ts: -------------------------------------------------------------------------------- 1 | import PeerInfo = require('peer-info'); 2 | import {Multiaddr} from './Multiaddr'; 3 | 4 | export default interface IConnection { 5 | getPeerInfo(cb: (err: any, res: PeerInfo) => void): void 6 | getObservedAddrs (cb: (err: any, res: Multiaddr[]) => void): void 7 | } -------------------------------------------------------------------------------- /backend/types/Multiaddr.ts: -------------------------------------------------------------------------------- 1 | export interface Multiaddr { 2 | nodeAddress(): { family: string, address: string, port: string } 3 | } -------------------------------------------------------------------------------- /backend/types/bad-words.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'bad-words' { 2 | class Filter { 3 | clean (input: string): string 4 | } 5 | 6 | export = Filter; 7 | } -------------------------------------------------------------------------------- /backend/types/blake2.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'blake2' { 2 | interface Blake2Hasher { 3 | update (buf: Buffer): void 4 | digest (): Buffer 5 | } 6 | 7 | interface Blake2Opts { 8 | digestLength: number 9 | } 10 | 11 | interface Blake2 { 12 | createHash (hash: 'blake2b', opts?: Blake2Opts): Blake2Hasher 13 | } 14 | 15 | const blk2: Blake2; 16 | 17 | export = blk2; 18 | } -------------------------------------------------------------------------------- /backend/types/leb128.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'leb128' { 2 | import Buffer = require('buffer'); 3 | 4 | interface coder { 5 | encode (val: string): Buffer 6 | 7 | decode (val: Buffer): string 8 | } 9 | 10 | interface leb128 { 11 | signed: coder 12 | unsigned: coder 13 | } 14 | 15 | const leb: leb128; 16 | export = leb; 17 | } -------------------------------------------------------------------------------- /backend/types/libp2p-mplex.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'libp2p-mplex' { 2 | const LibP2PMplex: () => void; 3 | export = LibP2PMplex 4 | } -------------------------------------------------------------------------------- /backend/types/libp2p-secio.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'libp2p-secio' { 2 | const LibP2PSecio: () => void; 3 | export = LibP2PSecio 4 | } -------------------------------------------------------------------------------- /backend/types/libp2p-tcp.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'libp2p-tcp' { 2 | const LibP2PTCP: () => void; 3 | export = LibP2PTCP 4 | } -------------------------------------------------------------------------------- /backend/types/libp2p.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'libp2p' { 2 | import PeerInfo = require('peer-info'); 3 | 4 | interface Options { 5 | peerInfo: PeerInfo 6 | modules: { 7 | transport: any[], 8 | streamMuxer?: any[], 9 | connEncryption?: any[], 10 | peerDiscovery?: any[] 11 | }, 12 | config?: { 13 | EXPERIMENTAL?: { 14 | pubsub?: boolean 15 | } 16 | } 17 | } 18 | 19 | type ErrCallback = (err: any) => void 20 | 21 | type HandlerFunc = (protocol: string, conn: any) => void 22 | 23 | class Node { 24 | constructor (options: Options) 25 | 26 | start (cb: ErrCallback): void 27 | 28 | stop (cb: ErrCallback): void 29 | 30 | on (event: string, cb: (data: any) => void): void 31 | 32 | handle (protocol: string, hdlr: HandlerFunc): void 33 | } 34 | 35 | export = Node; 36 | } -------------------------------------------------------------------------------- /backend/types/peer-id.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'peer-id' { 2 | class PeerID { 3 | toB58String (): string 4 | 5 | static createFromBytes (buf: Buffer): PeerID 6 | } 7 | 8 | export = PeerID 9 | } -------------------------------------------------------------------------------- /backend/types/peer-info.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'peer-info' { 2 | interface IPeerInfoJSON { 3 | id: string 4 | privKey: string 5 | pubKey: string 6 | } 7 | 8 | interface IPeerID { 9 | toB58String (): string 10 | } 11 | 12 | interface IMultiaddrList { 13 | add (addr: string): void 14 | 15 | addSafe (addr: string): void 16 | 17 | delete (addr: string): void 18 | 19 | replace (existing: string, fresh: string): void 20 | } 21 | 22 | type PeerInfoCallback = (err: any, peerInfo: PeerInfo) => void 23 | 24 | class PeerInfo { 25 | static create (id: IPeerInfoJSON, cb: PeerInfoCallback): void 26 | 27 | id: IPeerID; 28 | 29 | multiaddrs: IMultiaddrList; 30 | } 31 | 32 | export = PeerInfo 33 | } -------------------------------------------------------------------------------- /backend/types/pull-split.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'pull-split' { 2 | const split: () => any; 3 | export = split 4 | } -------------------------------------------------------------------------------- /backend/types/pull-stream.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'pull-stream' { 2 | interface PullStream { 3 | (source: any, through: any, sink?: any): PullStream 4 | 5 | map (cb: (data: any) => any): any 6 | 7 | drain (cb: (data: any) => void): any 8 | } 9 | 10 | const pull: PullStream; 11 | export = pull 12 | } -------------------------------------------------------------------------------- /backend/vendor/debug/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This export stubs the 'debug' library. Debug manages an internal 3 | * queue of debug objects that do not get removed automatically. This 4 | * causes memory leaks, since various libp2p libraries create new 5 | * debug instances in constructors that never get cleaned up. 6 | * 7 | * @returns {Function} 8 | */ 9 | function noopDebug() { 10 | } 11 | 12 | module.exports = function () { 13 | return noopDebug; 14 | }; -------------------------------------------------------------------------------- /backend/vendor/debug/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "debug", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js" 6 | } 7 | -------------------------------------------------------------------------------- /common/.gitignore: -------------------------------------------------------------------------------- 1 | lib -------------------------------------------------------------------------------- /common/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "filecoin-network-stats-common", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "bignumber.js": { 8 | "version": "8.0.1", 9 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.0.1.tgz", 10 | "integrity": "sha512-zAySveTJXkgLYCBi0b14xzfnOs+f3G6x36I8w2a1+PFQpWk/dp0mI0F+ZZK2bu+3ELewDcSyP+Cfq++NcHX7sg==" 11 | }, 12 | "typescript": { 13 | "version": "3.2.2", 14 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", 15 | "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", 16 | "dev": true 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "filecoin-network-stats-common", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "build": "tsc --project ./tsconfig.json", 7 | "clean": "rm -rf ./lib" 8 | }, 9 | "author": "", 10 | "license": "UNLICENSED", 11 | "dependencies": { 12 | "bignumber.js": "8.0.1" 13 | }, 14 | "devDependencies": { 15 | "typescript": "3.2.2" 16 | }, 17 | "types": "./dist/index.d.ts" 18 | } 19 | -------------------------------------------------------------------------------- /common/src/domain/Ask.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | 3 | export interface Ask { 4 | id: number 5 | price: BigNumber 6 | expiresAt: number 7 | address: string 8 | } 9 | export interface AskJSON { 10 | id: number 11 | price: string 12 | expiresAt: number 13 | address: string 14 | } 15 | 16 | export function askToJSON (ask: Ask): AskJSON { 17 | return { 18 | id: ask.id, 19 | price: ask.price.toFixed(0), 20 | expiresAt: ask.expiresAt, 21 | address: ask.address, 22 | }; 23 | } 24 | 25 | export function askFromJSON (ask: AskJSON): Ask { 26 | return { 27 | id: ask.id, 28 | price: new BigNumber(ask.price), 29 | expiresAt: ask.expiresAt, 30 | address: ask.address, 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /common/src/domain/CategoryDatapoint.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | 3 | export interface CategoryDatapoint { 4 | category: string | number 5 | data: { 6 | [k: string]: BigNumber 7 | } 8 | } 9 | 10 | export interface CategoryDatapointJSON { 11 | category: string | number 12 | data: { 13 | [k: string]: string 14 | } 15 | } 16 | 17 | export function categoryDatapointToJSON (point: CategoryDatapoint): CategoryDatapointJSON { 18 | return { 19 | category: point.category, 20 | data: Object.keys(point.data).reduce((acc: { [k: string]: string }, k: string) => { 21 | acc[k] = point.data[k].toFixed(18); 22 | return acc; 23 | }, {}), 24 | }; 25 | } 26 | 27 | export function categoryDatapointFromJSON (point: CategoryDatapointJSON): CategoryDatapoint { 28 | return { 29 | category: point.category, 30 | data: Object.keys(point.data).reduce((acc: { [k: string]: BigNumber }, k: string) => { 31 | acc[k] = new BigNumber(point.data[k]); 32 | return acc; 33 | }, {}), 34 | }; 35 | } -------------------------------------------------------------------------------- /common/src/domain/ChartDuration.ts: -------------------------------------------------------------------------------- 1 | export enum ChartDuration { 2 | DAY = '24h', 3 | WEEK = '1w', 4 | MONTH = '1m', 5 | YEAR = '1y', 6 | ALL = 'all' 7 | } 8 | 9 | export function chartDurationFromString (str: string) { 10 | switch (str) { 11 | case '24h': 12 | return ChartDuration.DAY; 13 | case '1w': 14 | return ChartDuration.WEEK; 15 | case '1m': 16 | return ChartDuration.MONTH; 17 | case '1y': 18 | return ChartDuration.YEAR; 19 | case 'all': 20 | return ChartDuration.ALL; 21 | default: 22 | throw new Error('invalid duration string'); 23 | } 24 | } 25 | 26 | export default ChartDuration; -------------------------------------------------------------------------------- /common/src/domain/CostCapacityForMinerStat.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | 3 | export interface CostCapacityForMinerStat { 4 | count: number 5 | averageStoragePrice: BigNumber 6 | averageCapacityGB: number 7 | utilization: number 8 | } 9 | 10 | export interface CostCapacityForMinerStatJSON { 11 | count: number 12 | averageStoragePrice: string 13 | averageCapacityGB: number 14 | utilization: number 15 | } 16 | 17 | export function costCapacityForMinerStatToJSON(stat: CostCapacityForMinerStat): CostCapacityForMinerStatJSON { 18 | return { 19 | count: stat.count, 20 | averageStoragePrice: stat.averageStoragePrice.toFixed(16), 21 | averageCapacityGB: stat.averageCapacityGB, 22 | utilization: stat.utilization 23 | }; 24 | } 25 | 26 | export function costCapacityForMinerStatFromJSON(stat: CostCapacityForMinerStatJSON): CostCapacityForMinerStat { 27 | return { 28 | count: stat.count, 29 | averageStoragePrice: new BigNumber(stat.averageStoragePrice), 30 | averageCapacityGB: stat.averageCapacityGB, 31 | utilization: stat.utilization 32 | }; 33 | } -------------------------------------------------------------------------------- /common/src/domain/HistogramDatapoint.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | 3 | export interface HistogramDatapoint { 4 | n: number 5 | bucketStart: BigNumber 6 | bucketEnd: BigNumber 7 | count: number 8 | } 9 | 10 | export interface HistogramDatapointJSON { 11 | n: number 12 | bucketStart: string 13 | bucketEnd: string 14 | count: number 15 | } 16 | 17 | export function histogramDatapointToJSON (dp: HistogramDatapoint): HistogramDatapointJSON { 18 | return { 19 | n: dp.n, 20 | bucketStart: dp.bucketStart.toString(), 21 | bucketEnd: dp.bucketEnd.toString(), 22 | count: dp.count, 23 | }; 24 | } 25 | 26 | export function histogramDatapointFromJSON (dp: HistogramDatapointJSON) { 27 | return { 28 | n: dp.n, 29 | bucketStart: new BigNumber(dp.bucketStart), 30 | bucketEnd: new BigNumber(dp.bucketEnd), 31 | count: dp.count, 32 | }; 33 | } -------------------------------------------------------------------------------- /common/src/domain/MinerStat.ts: -------------------------------------------------------------------------------- 1 | export interface MinerStat { 2 | nickname: string 3 | address: string 4 | peerId: string 5 | parentHashes: string[] 6 | power: number 7 | capacity: number 8 | blockHeight: number 9 | blockPercentage: number 10 | blockTime: number 11 | isInConsensus: boolean 12 | lastSeen: number 13 | } 14 | -------------------------------------------------------------------------------- /common/src/domain/Node.ts: -------------------------------------------------------------------------------- 1 | export interface Node { 2 | lastSeen: number 3 | lat: number|null 4 | long: number|null 5 | height: number 6 | peerId: string 7 | nickname: string|null 8 | minerAddress: string 9 | power: number 10 | capacity: number 11 | } -------------------------------------------------------------------------------- /common/src/domain/TimeseriesDatapoint.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | 3 | export interface TimeseriesDatapoint { 4 | amount: BigNumber 5 | date: number 6 | } 7 | 8 | export interface TimeseriesDatapointJSON { 9 | amount: string 10 | date: number 11 | } 12 | 13 | export function timeseriesDatapointToJSON (point: TimeseriesDatapoint): TimeseriesDatapointJSON { 14 | return { 15 | amount: point.amount.toFixed(16), 16 | date: point.date, 17 | }; 18 | } 19 | 20 | export function timeseriesDatapointFromJSON (point: TimeseriesDatapointJSON): TimeseriesDatapoint { 21 | return { 22 | amount: new BigNumber(point.amount), 23 | date: point.date, 24 | }; 25 | } -------------------------------------------------------------------------------- /common/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./lib/", 4 | "sourceMap": true, 5 | "noImplicitAny": true, 6 | "declaration": true, 7 | "module": "commonjs", 8 | "target": "es5", 9 | "jsx": "react", 10 | "lib": [ 11 | "dom", 12 | "es5", 13 | "es6", 14 | "scripthost" 15 | ], 16 | "experimentalDecorators": true, 17 | "rootDir": "./src" 18 | }, 19 | "include": [ 20 | "./src/**/*" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /docs/handoff/stats-backend-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/docs/handoff/stats-backend-architecture.png -------------------------------------------------------------------------------- /example/backend.conf: -------------------------------------------------------------------------------- 1 | [program:backend] 2 | directory=/data/filecoin-network-stats/backend 3 | command=/usr/bin/node ./dist/src/main.js 4 | stderr_logfile=/data/log/backend.err.log 5 | stdout_logfile=/data/log/backend.out.log 6 | environment=DB_URL="postgresql://",FULL_NODE_URL="http://127.0.0.1:3453",IS_MASTER="true",PEER_INFO_FILE="./peerId.json",HEARTBEAT_PORT="8080",API_PORT="8081",LOG_LEVEL="info" -------------------------------------------------------------------------------- /example/go-filecoin.conf: -------------------------------------------------------------------------------- 1 | [program:go-filecoin] 2 | command=/data/go-filecoin/filecoin/go-filecoin daemon 3 | stderr_logfile=/data/log/go-filecoin.err.log 4 | stdout_logfile=/data/log/go-filecoin.out.log 5 | user=ubuntu -------------------------------------------------------------------------------- /frontend/src/assets/bars-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/change-networks-off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/change-networks-on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/chevron.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/frontend/src/assets/icon.png -------------------------------------------------------------------------------- /frontend/src/assets/loader-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /frontend/src/assets/loader.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /frontend/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 1 -------------------------------------------------------------------------------- /frontend/src/assets/macroeconomics-off.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/macroeconomics-on.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/retrieval-off.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/retrieval-on.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/sort.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/components/AnimatedMap.scss: -------------------------------------------------------------------------------- 1 | .animated-map__chart { 2 | height: 550px; 3 | } -------------------------------------------------------------------------------- /frontend/src/components/AveragePriceTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Tooltip from './Tooltip'; 3 | 4 | export default class AveragePriceTooltip extends React.Component { 5 | render() { 6 | const text = `Average value of all outstanding storage asks over the past 30 days.`; 7 | 8 | return ( 9 | 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/CapacityTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Tooltip from './Tooltip'; 3 | 4 | export default class CapacityTooltip extends React.Component { 5 | render() { 6 | const text = `Sum of all pledged sectors. Future network upgrades will incorporate slashing.`; 7 | 8 | return ( 9 | 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/ChangeNetworksModal.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | @import "../variables"; 4 | 5 | .change-networks-modal { 6 | p { 7 | padding: 0 ($base * 1.5); 8 | font-size: $base * 1.2; 9 | line-height: 1.2; 10 | margin-bottom: $base * 1.5; 11 | } 12 | 13 | label { 14 | font-weight: bold; 15 | color: $dark-grey; 16 | display: block; 17 | margin-bottom: $base / 3; 18 | } 19 | 20 | select { 21 | width: 33%; 22 | } 23 | 24 | input[type=text] { 25 | border-radius: 3px; 26 | border: 1px solid #ccc; 27 | font-size: $base * 1.2; 28 | padding: $base / 2; 29 | margin-bottom: $base / 3; 30 | width: 50%; 31 | } 32 | 33 | small { 34 | display: block; 35 | } 36 | 37 | &__loader { 38 | width: 16px; 39 | height: 16px; 40 | } 41 | 42 | &__error-message { 43 | display: block; 44 | padding: ($base * 1.5); 45 | margin: $base * 1.5; 46 | color: $orange-500; 47 | font-size: $base * 1.2; 48 | border-radius: 3px; 49 | background: rgba(#fe988a, 0.60); 50 | border: 1px solid darken(#fe988a, 8%); 51 | } 52 | 53 | &__button-wrapper { 54 | border-top: 1px solid $border; 55 | padding: $base ($base * 1.5); 56 | } 57 | 58 | &__ok { 59 | padding: ($base * 0.75) 0; 60 | background: $blue; 61 | border: 0; 62 | color: white; 63 | border-radius: 3px; 64 | font-size: $base * 1.2; 65 | cursor: pointer; 66 | width: 80px; 67 | text-align: center; 68 | 69 | &:disabled { 70 | opacity: 0.5; 71 | cursor: not-allowed; 72 | } 73 | 74 | &:hover:not(:disabled) { 75 | background: lighten($blue, 10%); 76 | } 77 | 78 | &--loading { 79 | padding: 8px 0; 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /frontend/src/components/Chart.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | $height: 400px; 4 | 5 | .fc-chart__chart-wrap { 6 | position: relative; 7 | height: $height; 8 | } 9 | 10 | .fc-chart__chart { 11 | height: $height; 12 | position: relative; 13 | z-index: 10; 14 | } 15 | 16 | .fc-chart__header { 17 | margin-top: $base; 18 | margin-bottom: $base; 19 | text-align: center; 20 | display: flex; 21 | align-items: center; 22 | flex-direction: column; 23 | position: absolute; 24 | width: 100%; 25 | z-index: 15; 26 | } 27 | 28 | .fc-chart__chart--no-header { 29 | height: $height; 30 | } 31 | 32 | .fc-chart__price { 33 | font-weight: bold; 34 | font-size: $base * 3; 35 | margin-bottom: $base; 36 | 37 | small { 38 | font-size: $base * 1.4; 39 | } 40 | } 41 | 42 | .fc-chart__label { 43 | color: $dark-grey; 44 | font-size: $base * 1.25; 45 | } 46 | 47 | .fc-chart__loading { 48 | position: absolute; 49 | top: 3px; 50 | right: 3px; 51 | left: 3px; 52 | bottom: 0; 53 | display: flex; 54 | align-items: center; 55 | justify-content: center; 56 | background: white; 57 | z-index: 20; 58 | 59 | img { 60 | transform: scale(1.5, 1.5); 61 | } 62 | } 63 | 64 | @include smartphones() { 65 | .fc-chart__chart-wrap { 66 | height: $height + 80px; 67 | } 68 | 69 | .fc-chart__header { 70 | position: static; 71 | width: 100%; 72 | z-index: 15; 73 | } 74 | } -------------------------------------------------------------------------------- /frontend/src/components/ClickCopyable.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .click-copyable { 4 | position: relative; 5 | cursor: pointer; 6 | display: inline-block; 7 | 8 | &:before { 9 | position: absolute; 10 | transform: scale(0); 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | background: $black; 15 | box-shadow: 0 0 8px rgba(white, 0.25); 16 | content: 'Copy'; 17 | color: white; 18 | top: 50%; 19 | left: 50%; 20 | margin-left: -25px; 21 | width: 50px; 22 | height: 28px; 23 | text-align: center; 24 | margin-top: -14px; 25 | border-radius: 3px; 26 | font-size: $base; 27 | transition: transform 50ms ease-in, margin-left 50ms ease-in, width 50ms ease-in; 28 | } 29 | 30 | &:hover:before { 31 | transform: scale(1); 32 | } 33 | 34 | &--copied:before { 35 | transform: scale(1); 36 | white-space: nowrap; 37 | overflow: hidden; 38 | content: 'Copied To Clipboard'; 39 | background: #1fcd8b; 40 | width: 150px; 41 | margin-left: -75px; 42 | } 43 | } -------------------------------------------------------------------------------- /frontend/src/components/ClickCopyable.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import './ClickCopyable.scss'; 4 | import * as c from 'classnames'; 5 | import copy = require('copy-to-clipboard'); 6 | 7 | const b = bemify('click-copyable'); 8 | 9 | export interface ClickCopyableProps { 10 | copyData: string 11 | } 12 | 13 | export interface ClickCopyableState { 14 | didCopy: boolean 15 | } 16 | 17 | export default class ClickCopyable extends React.Component { 18 | private timer: number | null; 19 | 20 | constructor (props: ClickCopyableProps) { 21 | super(props); 22 | 23 | this.timer = null; 24 | 25 | this.state = { 26 | didCopy: false, 27 | }; 28 | } 29 | 30 | copy = () => { 31 | copy(this.props.copyData); 32 | this.setState({ 33 | didCopy: true, 34 | }); 35 | 36 | this.timer = setTimeout(() => this.setState({ 37 | didCopy: false, 38 | }), 1500); 39 | }; 40 | 41 | componentWillUnmount() { 42 | if (this.timer) { 43 | clearTimeout(this.timer); 44 | } 45 | } 46 | 47 | render () { 48 | const names = c(b(), { 49 | [b(null, 'copied')]: this.state.didCopy, 50 | }); 51 | 52 | return ( 53 |
54 | {this.props.children} 55 |
56 | ); 57 | } 58 | } 59 | 60 | export function dashcopy(text: string) { 61 | copy(text); 62 | } -------------------------------------------------------------------------------- /frontend/src/components/ContentArea.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .content-area { 4 | width: 100%; 5 | display: flex; 6 | justify-content: center; 7 | padding: 0 ($base); 8 | } 9 | 10 | .content-area__inner { 11 | flex: 1 1 100%; 12 | max-width: 1200px; 13 | } 14 | 15 | @include smartphones() { 16 | .content-area__inner { 17 | max-width: 100%; 18 | } 19 | } -------------------------------------------------------------------------------- /frontend/src/components/ContentArea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import './ContentArea.scss'; 4 | 5 | const b = bemify('content-area'); 6 | 7 | export const ContentArea: React.FunctionComponent<{}> = (props) => { 8 | return ( 9 |
10 |
11 | {props.children} 12 |
13 |
14 | ) 15 | }; -------------------------------------------------------------------------------- /frontend/src/components/ContentHeader.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .content-header { 4 | padding: $base * 1.5; 5 | font-weight: 700; 6 | font-size: $base * 1.5; 7 | border-bottom: 1px solid #e6e6e6; 8 | } -------------------------------------------------------------------------------- /frontend/src/components/ContentHeader.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import './ContentHeader.scss'; 4 | 5 | const b = bemify('content-header'); 6 | 7 | export interface ContentHeaderProps { 8 | title?: string | React.ReactNode 9 | } 10 | 11 | export default class ContentHeader extends React.Component { 12 | render () { 13 | return ( 14 |
15 | {this.props.title || this.props.children} 16 |
17 | ); 18 | } 19 | } -------------------------------------------------------------------------------- /frontend/src/components/CurrencyWithTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import BigNumber from 'bignumber.js'; 3 | import Rollover from './Rollover'; 4 | import Currency from '../utils/Currency'; 5 | 6 | export interface CurrencyWithTooltipProps { 7 | amount: BigNumber 8 | unit?: string 9 | } 10 | 11 | export default class CurrencyWithTooltip extends React.Component { 12 | static defaultProps = { 13 | unit: 'FIL' 14 | }; 15 | 16 | render() { 17 | const amountCurrency = new Currency(this.props.amount); 18 | 19 | return ( 20 | 21 | {amountCurrency.toDisplay()} 22 | 23 | ); 24 | } 25 | } -------------------------------------------------------------------------------- /frontend/src/components/DateSwitchingChart.scss: -------------------------------------------------------------------------------- 1 | .date-switching-chart { 2 | &__loading { 3 | height: 400px; 4 | display: flex; 5 | align-items: center; 6 | justify-content: center; 7 | 8 | img { 9 | transform: scale(1.5, 1.5); 10 | } 11 | } 12 | 13 | .switchable-content__header-link { 14 | text-transform: uppercase; 15 | } 16 | } -------------------------------------------------------------------------------- /frontend/src/components/DisclaimerModal.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .ReactModal__Overlay { 4 | z-index: 1000; 5 | } 6 | 7 | .disclaimer-modal { 8 | p { 9 | padding: 0 ($base * 1.5); 10 | font-size: $base * 1.6; 11 | line-height: 1.2; 12 | margin-bottom: $base * 1.5; 13 | text-align: center; 14 | } 15 | 16 | &__button-wrapper { 17 | text-align: center; 18 | border-top: 1px solid $border; 19 | padding: $base ($base * 1.5); 20 | } 21 | 22 | &__ok { 23 | padding: ($base * 0.75) ($base * 1.5); 24 | background: $blue; 25 | border: 0; 26 | color: white; 27 | border-radius: 3px; 28 | font-size: $base * 1.2; 29 | text-align: right; 30 | cursor: pointer; 31 | 32 | &:hover { 33 | background: lighten($blue, 10%); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /frontend/src/components/Dropdown.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .dropdown { 4 | font-size: $base * 1.2; 5 | font-weight: 600; 6 | cursor: pointer; 7 | position: relative; 8 | padding-right: $base * 2; 9 | 10 | &:before { 11 | $size: 12px; 12 | background: url('/assets/chevron.svg') no-repeat right center; 13 | width: $size; 14 | height: $size; 15 | background-size: contain; 16 | content: ''; 17 | display: block; 18 | position: absolute; 19 | top: 50%; 20 | margin-top: -($size / 2); 21 | right: 0; 22 | transform: rotate(0deg); 23 | transition: transform linear 100ms; 24 | } 25 | 26 | &--open { 27 | .dropdown__box { 28 | display: block; 29 | } 30 | 31 | &:before { 32 | transform: rotate(180deg); 33 | } 34 | } 35 | 36 | &__box { 37 | display: none; 38 | position: absolute; 39 | top: 100%; 40 | margin-top: $base / 2; 41 | z-index: 40; 42 | right: 0; 43 | background: white; 44 | padding: $base; 45 | @extend %box-shadow; 46 | } 47 | 48 | &__link { 49 | white-space: nowrap; 50 | font-weight: normal; 51 | padding-bottom: $base; 52 | font-size: $base * 1.2; 53 | color: #828282; 54 | 55 | &:last-child { 56 | padding-bottom: 0; 57 | } 58 | 59 | &:hover, &--active { 60 | color: black; 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /frontend/src/components/FloatTimeago.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Timeago from 'react-timeago'; 3 | import BigNumber from 'bignumber.js'; 4 | 5 | export interface FloatTimeagoProps { 6 | date: number 7 | } 8 | 9 | export default class FloatTimeago extends React.Component { 10 | private timer: number = 0; 11 | 12 | componentDidMount () { 13 | this.tick(); 14 | } 15 | 16 | componentWillUnmount() { 17 | clearTimeout(this.timer); 18 | } 19 | 20 | componentDidUpdate(lastProps: FloatTimeagoProps) { 21 | if (this.props.date !== lastProps.date) { 22 | this.tick(); 23 | } 24 | } 25 | 26 | tick = () => { 27 | const diff = Date.now() - this.props.date; 28 | 29 | if (diff > 60000) { 30 | clearTimeout(this.timer); 31 | this.forceUpdate(); 32 | return; 33 | } 34 | 35 | this.forceUpdate(() => { 36 | this.timer = setTimeout(this.tick, 50); 37 | }); 38 | }; 39 | 40 | render () { 41 | const diff = Date.now() - this.props.date; 42 | 43 | if (diff > 60000) { 44 | return ; 48 | } 49 | 50 | const text = new BigNumber(diff).div(1000).toFixed(1); 51 | return ( 52 | 55 | ); 56 | } 57 | 58 | formatTime = (value: number, unit: string, suffix: string) => { 59 | const plural = value === 0 || value > 1 ? 's' : ''; 60 | if (unit === 'minute') { 61 | return `${value} min${plural} ${suffix}` 62 | } 63 | 64 | return `${value} ${unit}${plural} ${suffix}` 65 | } 66 | } -------------------------------------------------------------------------------- /frontend/src/components/GraphColors.ts: -------------------------------------------------------------------------------- 1 | import * as am4core from '@amcharts/amcharts4/core'; 2 | 3 | export const GraphColors = { 4 | ORANGE: am4core.color('#FFBA76'), 5 | GREEN: am4core.color('#74E8BE'), 6 | BLUE: am4core.color('#45B9E6'), 7 | RED: am4core.color('#FE6B57'), 8 | TURQUOISE: am4core.color('#6DDFDF'), 9 | PURPLE: am4core.color('#748CF9'), 10 | DARK_GREEN: am4core.color('#0E9692'), 11 | GREY: am4core.color('#aaa'), 12 | LIGHT_GREY: am4core.color('#CCCFE0'), 13 | }; 14 | 15 | export default GraphColors; -------------------------------------------------------------------------------- /frontend/src/components/Grid.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | $gutter: $base * 2; 4 | 5 | .grid { 6 | display: flex; 7 | width: 100%; 8 | margin-left: ($gutter / -2); 9 | margin-right: ($gutter / -2); 10 | margin-bottom: $gutter * 2; 11 | } 12 | 13 | .grid--1 .grid__col { 14 | flex: 0 1 100%; 15 | } 16 | 17 | .grid--2 .grid__col { 18 | flex: 0 1 50%; 19 | } 20 | 21 | .grid--3 .grid__col { 22 | flex: 0 1 33.3333333%; 23 | } 24 | 25 | .grid--4 .grid__col { 26 | flex: 0 1 25%; 27 | } 28 | 29 | .grid__col { 30 | margin: 0 ($gutter / 2); 31 | display: flex; 32 | flex-direction: column; 33 | } 34 | 35 | .grid__col-pad { 36 | background: $white; 37 | border-radius: 3px; 38 | flex: 1 1 100%; 39 | display: flex; 40 | flex-direction: column; 41 | } 42 | 43 | .grid__col--transparent { 44 | .grid__col-pad { 45 | background: $white; 46 | box-shadow: none; 47 | } 48 | } 49 | 50 | .grid__col--unsupported { 51 | opacity: 0.8; 52 | } 53 | 54 | .grid--no-margin { 55 | margin-bottom: 0; 56 | } 57 | 58 | .grid--single-margin { 59 | margin-bottom: $gutter; 60 | } 61 | 62 | .grid--uneven.grid--2 { 63 | .grid__col:first-child { 64 | flex: 0 1 70%; 65 | } 66 | 67 | .grid__col:last-child { 68 | flex: 0 1 30%; 69 | } 70 | } 71 | 72 | @include smartphones() { 73 | .grid { 74 | flex-direction: column; 75 | margin: 0 0 $gutter 0; 76 | 77 | &--no-margin { 78 | margin-bottom: 0; 79 | } 80 | 81 | .grid__col { 82 | flex: 1 1 100%; 83 | margin: 0 0 $gutter 0; 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /frontend/src/components/LabelledTooltip.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .labelled-tooltip { 4 | display: flex; 5 | align-items: center; 6 | 7 | .tooltip { 8 | margin-left: $base / 3; 9 | } 10 | 11 | &--inline { 12 | display: inline; 13 | 14 | .tooltip { 15 | display: inline-block; 16 | margin-bottom: -3px; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /frontend/src/components/LabelledTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import './LabelledTooltip.scss'; 4 | import * as c from 'classnames'; 5 | 6 | const b = bemify('labelled-tooltip'); 7 | 8 | export interface LabelledTooltipProps { 9 | tooltip: React.ReactNode 10 | text: string 11 | inline?: boolean 12 | } 13 | 14 | export default class LabelledTooltip extends React.Component { 15 | static defaultProps = { 16 | inline: false, 17 | }; 18 | 19 | render () { 20 | const names = c(b(), { 21 | [b(null, 'inline')]: this.props.inline, 22 | }); 23 | 24 | return ( 25 | 26 | {this.props.text} {this.props.tooltip} 27 | 28 | ); 29 | } 30 | } -------------------------------------------------------------------------------- /frontend/src/components/Loader.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export const Loader: React.FunctionComponent<{}> = () => { 4 | return ( 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 19 | 20 | 21 | ); 22 | }; -------------------------------------------------------------------------------- /frontend/src/components/Macroeconomics.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import {Col, Grid} from './Grid'; 4 | import PageHeader from './PageHeader'; 5 | import TokenHoldingsDistribution from './token/TokenHoldingsDistribution'; 6 | import HistoricalCollateralChart from './token/HistoricalCollateralChart'; 7 | import HistoricalBlockRewards from './token/HistoricalBlockRewards'; 8 | import CoinsInCirculation from './token/CoinsInCirculation'; 9 | import BlockRewardLifecycle from './token/BlockRewardLifecycle'; 10 | 11 | const b = bemify('macroeconomics'); 12 | 13 | export default class Macroeconomics extends React.Component<{}, {}> { 14 | render () { 15 | return ( 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
42 | ); 43 | } 44 | } -------------------------------------------------------------------------------- /frontend/src/components/Main.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .main { 4 | min-height: 100vh; 5 | display: flex; 6 | } 7 | 8 | .main__sidebar { 9 | background: $white; 10 | flex: 0 0 64px; 11 | position: relative; 12 | } 13 | 14 | .main__main { 15 | flex: 1 1 100%; 16 | } 17 | 18 | @include smartphones() { 19 | .main { 20 | flex-direction: column; 21 | width: 100%; 22 | } 23 | 24 | .main__sidebar { 25 | flex: 1 1 auto; 26 | } 27 | } -------------------------------------------------------------------------------- /frontend/src/components/MinerCountTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Tooltip from './Tooltip'; 3 | 4 | export default class MinerCountTooltip extends React.Component { 5 | render() { 6 | const text = `Count of storage mining nodes that are currently heartbeating to this dashboard.`; 7 | 8 | return ( 9 | 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/MiningSummary.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .mining-summary { 4 | display: flex; 5 | align-items: center; 6 | } 7 | 8 | .mining-summary__left { 9 | width: 260px; 10 | padding: 0 ($base * 4); 11 | display: flex; 12 | flex-direction: column; 13 | justify-content: center; 14 | } 15 | 16 | .mining-summary__right { 17 | flex: 1 1 100%; 18 | padding: ($base * 2) ($base * 2); 19 | border-left: 1px solid $border; 20 | } 21 | 22 | .mining-summary__main-stat { 23 | font-size: $base * 4; 24 | margin-bottom: $base; 25 | } 26 | 27 | .mining-summary__sub-stat { 28 | font-size: $base * 2; 29 | margin-bottom: $base; 30 | } 31 | 32 | .mining-summary__label { 33 | font-size: $base * 1.2; 34 | color: $grey; 35 | } 36 | 37 | @include smartphones() { 38 | .mining-summary { 39 | flex-wrap: wrap; 40 | } 41 | 42 | .mining-summary__left { 43 | width: 100%; 44 | border-bottom: 1px solid $border; 45 | padding-top: $base; 46 | padding-bottom: $base; 47 | } 48 | 49 | .mining-summary__right { 50 | width: 100%; 51 | border-left: 0; 52 | } 53 | } -------------------------------------------------------------------------------- /frontend/src/components/NodeMap.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .node-map { 4 | } 5 | 6 | .node-map__header { 7 | border-bottom: 1px solid $border; 8 | padding: $base * 2; 9 | font-weight: 700; 10 | } 11 | 12 | .node-map__map { 13 | position: relative; 14 | } 15 | 16 | .node-map__overlay { 17 | position: absolute; 18 | z-index: 200; 19 | background: white; 20 | border-radius: 3px; 21 | box-shadow: 0 18px 40px rgba(1, 10, 59, 0.15); 22 | padding: $base; 23 | left: 50%; 24 | top: $base * 2; 25 | width: 130px; 26 | margin-left: -65px; 27 | } 28 | 29 | .node-map__node-count { 30 | color: #818E94; 31 | text-align: center; 32 | font-size: $base * 1.2; 33 | 34 | h1 { 35 | margin-top: 0; 36 | color: $black; 37 | margin-bottom: $base; 38 | font-weight: 700; 39 | font-size: $base * 3; 40 | } 41 | } 42 | 43 | .node-map__nick-tooltip { 44 | margin: 0; 45 | padding: 0; 46 | 47 | li { 48 | color: white; 49 | display: block; 50 | margin: 0; 51 | padding: $base / 2; 52 | padding-bottom: $base; 53 | border-bottom: 1px solid rgba(white, 0.25); 54 | white-space: nowrap; 55 | &:hover { 56 | color: #3FC1CB; 57 | } 58 | 59 | .copied { 60 | font-size: 0.65em; 61 | display: none; 62 | padding-top: 1px; 63 | margin-left: 4px; 64 | background-color: #333; 65 | text-align: right; 66 | color: yellow; 67 | white-space: nowrap; 68 | overflow: hidden; 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /frontend/src/components/PageHeader.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .page-header { 4 | margin: ($base * 3) 0; 5 | font-size: 20px; 6 | line-height: 1.25; 7 | font-weight: 700; 8 | text-transform: uppercase; 9 | color: lighten(#3FC1CB, 5%); 10 | 11 | .tooltip { 12 | margin-top: 2px; 13 | } 14 | } -------------------------------------------------------------------------------- /frontend/src/components/PageHeader.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import './PageHeader.scss'; 4 | import LabelledTooltip from './LabelledTooltip'; 5 | import Tooltip from './Tooltip'; 6 | 7 | const b = bemify('page-header'); 8 | 9 | export interface PageHeaderProps { 10 | title?: string 11 | tooltip?: string 12 | } 13 | 14 | export default class PageHeader extends React.Component { 15 | render () { 16 | return ( 17 |
18 | {this.props.tooltip ? 19 | } text={this.props.title}/> : 20 | this.props.title} 21 |
22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/components/PowerTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Tooltip from './Tooltip'; 3 | 4 | export default class PowerTooltip extends React.Component { 5 | render() { 6 | const text = `The probability that a storage miner will win the ability to mine the next block. Miners gain power by storing data, sealing it, and proving they still have it (i.e., providing a Proof-of-Spacetime).`; 7 | 8 | return ( 9 | 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/Rollover.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .rollover { 4 | position: relative; 5 | display: inline-block; 6 | 7 | &:hover .rollover__content { 8 | display: block; 9 | } 10 | 11 | &__content { 12 | width: 200px; 13 | text-align: left; 14 | display: none; 15 | position: absolute; 16 | bottom: calc(100% + 5px); 17 | left: 50%; 18 | margin-left: -104px; 19 | background: $black; 20 | padding: $base; 21 | border-radius: 3px; 22 | color: white; 23 | font-size: $base * 1.15; 24 | box-shadow: 0 10px 20px rgba(0, 0, 0, 0.25); 25 | line-height: 1.2; 26 | font-weight: normal; 27 | z-index: 20; 28 | 29 | &:before { 30 | width: 0; 31 | height: 0; 32 | border-style: solid; 33 | border-width: 8px 8px 0 8px; 34 | border-color: $black transparent transparent; 35 | content: ''; 36 | display: block; 37 | position: absolute; 38 | left: 50%; 39 | bottom: -8px; 40 | margin-left: -4px; 41 | } 42 | } 43 | 44 | &--bottom { 45 | .rollover__content { 46 | bottom: auto; 47 | top: calc(100% + 5px); 48 | 49 | &:before { 50 | border-width: 0 8px 8px 8px; 51 | border-color: transparent transparent $black; 52 | bottom: auto; 53 | top: -8px; 54 | } 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /frontend/src/components/Rollover.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import './Tooltip.scss'; 3 | import bemify from '../utils/bemify'; 4 | import * as c from 'classnames'; 5 | import './Rollover.scss'; 6 | 7 | const b = bemify('rollover'); 8 | 9 | export interface RolloverProps { 10 | content: React.ReactChild 11 | children: React.ReactChild|React.ReactChild[] 12 | bottom?: boolean 13 | } 14 | 15 | export default class Rollover extends React.Component { 16 | static defaultProps = { 17 | bottom: false 18 | }; 19 | 20 | render() { 21 | const names = c(b(), { 22 | [b(null, 'bottom')]: this.props.bottom 23 | }); 24 | 25 | return ( 26 | 27 | {this.props.children} 28 |
29 | {this.props.content} 30 |
31 |
32 | ); 33 | } 34 | } -------------------------------------------------------------------------------- /frontend/src/components/SwitchableContent.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .switchable-content { 4 | &__header-wrapper { 5 | display: flex; 6 | align-items: center; 7 | } 8 | 9 | &__header-links, &__dropdown { 10 | margin-left: auto; 11 | display: flex; 12 | margin-bottom: -(($base / 4) + 2px); 13 | font-weight: 500; 14 | } 15 | 16 | &__header-link { 17 | margin-left: $base; 18 | color: $grey; 19 | font-size: $base * 1.1; 20 | cursor: pointer; 21 | 22 | &:hover { 23 | border-bottom: 2px solid $grey; 24 | } 25 | } 26 | 27 | &__header-link--active { 28 | color: $black; 29 | padding-bottom: $base / 4; 30 | border-bottom: 2px solid $black; 31 | 32 | &:hover { 33 | border-bottom: 2px solid black; 34 | } 35 | } 36 | 37 | .dropdown { 38 | margin-left: auto; 39 | } 40 | } 41 | 42 | @include smartphones() { 43 | .switchable-content { 44 | &__header-wrapper { 45 | flex-wrap: wrap; 46 | 47 | .switchable-content__header-title { 48 | width: 100%; 49 | margin-bottom: $base; 50 | } 51 | 52 | .switchable-content__header-links { 53 | width: 100%; 54 | } 55 | 56 | .switchable-content__header-link:first-child { 57 | margin-left: 0; 58 | } 59 | 60 | .dropdown { 61 | width: 100%; 62 | margin-left: 0 !important; 63 | } 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /frontend/src/components/SwitchableDateSwitchingChart.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .switchable-date-switching-chart { 4 | &__durations { 5 | text-transform: uppercase; 6 | } 7 | 8 | .switchable-content .dropdown { 9 | margin-left: $base * 2; 10 | } 11 | 12 | &__loading { 13 | height: 400px; 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | 18 | img { 19 | transform: scale(1.5, 1.5); 20 | } 21 | } 22 | } 23 | 24 | @include smartphones() { 25 | .switchable-date-switching-chart { 26 | .switchable-content__header-links { 27 | margin-bottom: $base; 28 | } 29 | 30 | .switchable-content .dropdown { 31 | margin-left: 0; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /frontend/src/components/Tooltip.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .tooltip { 4 | position: relative; 5 | 6 | .rollover { 7 | display: block; 8 | } 9 | 10 | img { 11 | display: block; 12 | width: 16px; 13 | height: 16px; 14 | } 15 | } -------------------------------------------------------------------------------- /frontend/src/components/Tooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import './Tooltip.scss'; 3 | import bemify from '../utils/bemify'; 4 | import Rollover from './Rollover'; 5 | 6 | const b = bemify('tooltip'); 7 | 8 | export interface TooltipProps { 9 | content: React.ReactChild 10 | greyscale?: boolean 11 | bottom?: boolean 12 | } 13 | 14 | export default class Tooltip extends React.Component { 15 | static defaultProps = { 16 | greyscale: false, 17 | bottom: false, 18 | }; 19 | 20 | render () { 21 | return ( 22 | 23 | 24 | ? 25 | 26 | 27 | ); 28 | } 29 | } -------------------------------------------------------------------------------- /frontend/src/components/UtilizationTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Tooltip from './Tooltip'; 3 | 4 | export default class UtilizationTooltip extends React.Component { 5 | render() { 6 | const text = 'Total number of committed sectors divided by the total number of pledged sectors for all time. Future network upgrades will incorporate slashing.'; 7 | 8 | return ( 9 | 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/VolumeTransactedTooltip.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Tooltip from './Tooltip'; 3 | 4 | export default class VolumeTransactedTooltip extends React.Component { 5 | render() { 6 | const text = `Sum of the absolute value of all FIL transacted on-chain, less distributed block rewards. The red bars represent days where volume is less than the day before.`; 7 | 8 | return ( 9 | 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/Warning.scss: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | 3 | .warning { 4 | background: #fe988a; 5 | border-bottom: 1px solid darken(#fe988a, 8%); 6 | padding: $base * 2; 7 | font-size: $base * 1.4; 8 | font-weight: bold; 9 | text-transform: uppercase; 10 | 11 | .content-area { 12 | margin-left: $base; 13 | } 14 | } -------------------------------------------------------------------------------- /frontend/src/components/Warning.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../utils/bemify'; 3 | import './Warning.scss'; 4 | import {ContentArea} from './ContentArea'; 5 | 6 | const b = bemify('warning'); 7 | 8 | export interface WarningProps { 9 | text: string 10 | } 11 | 12 | export default class Warning extends React.Component { 13 | render () { 14 | return ( 15 |
16 | 17 | {this.props.text} 18 | 19 |
20 | ); 21 | } 22 | } -------------------------------------------------------------------------------- /frontend/src/components/storage/MiningEvolutionChart.scss: -------------------------------------------------------------------------------- 1 | @import "../../variables"; 2 | 3 | .mining-evolution-chart { 4 | &__inner { 5 | padding: $base; 6 | } 7 | } -------------------------------------------------------------------------------- /frontend/src/components/storage/StorageCostCapacity.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../../utils/bemify'; 3 | import {Col, Grid} from '../Grid'; 4 | import PageHeader from '../PageHeader'; 5 | import StorageCapacityHistogram from './StorageCapacityHistogram'; 6 | import HistoricalCollateralPerGBChart from './HistoricalCollateralPerGBChart'; 7 | import StorageCostCapacityBySizeBreakdown from './StorageCostCapacityBySizeBreakdown'; 8 | import HistoricalStoragePriceChart from './HistoricalStoragePriceChart'; 9 | import HistoricalUtilizationChart from './HistoricalUtilizationChart'; 10 | 11 | const b = bemify('storage-cost-capacity'); 12 | 13 | export default class StorageCostCapacity extends React.Component { 14 | render () { 15 | return ( 16 |
17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | ); 46 | } 47 | } -------------------------------------------------------------------------------- /frontend/src/components/storage/StorageCostCapacityBySizeBreakdown.scss: -------------------------------------------------------------------------------- 1 | @import "../../variables"; 2 | 3 | .storage-cost-capacity-by-size-breakdown { 4 | &__split { 5 | display: flex; 6 | } 7 | 8 | &__split-child { 9 | flex: 1 1 50%; 10 | 11 | &:first-child { 12 | border-right: 1px solid #e6e6e6; 13 | } 14 | } 15 | 16 | &__split-header { 17 | background: $light-grey; 18 | padding: $base ($base * 1.5); 19 | font-size: $base * 1.2; 20 | font-weight: 700; 21 | text-transform: uppercase; 22 | } 23 | 24 | &__split-stats { 25 | display: flex; 26 | flex-wrap: wrap; 27 | } 28 | 29 | &__stat { 30 | flex: 0 0 50%; 31 | padding: $base * 1.5; 32 | } 33 | 34 | &__stat-value { 35 | font-size: $base * 3; 36 | font-weight: bold; 37 | margin-bottom: $base / 2; 38 | } 39 | 40 | &__stat-label { 41 | font-size: $base * 1.25; 42 | color: $dark-grey; 43 | } 44 | 45 | &__stat-unit { 46 | font-size: $base * 1.5; 47 | } 48 | } -------------------------------------------------------------------------------- /frontend/src/components/storage/StorageMinersTable.scss: -------------------------------------------------------------------------------- 1 | @import "../../variables"; 2 | 3 | .storage-miners-table { 4 | &__tipset-hash { 5 | word-wrap: break-word; 6 | display: block; 7 | font-size: 13px; 8 | } 9 | 10 | &__peer-id--consensus { 11 | color: #13B7B3; 12 | } 13 | 14 | .table__header { 15 | //white-space: nowrap; 16 | } 17 | 18 | .tooltip { 19 | white-space: normal; 20 | } 21 | 22 | .dropdown { 23 | font-weight: normal; 24 | 25 | &:before { 26 | opacity: 0.5; 27 | } 28 | 29 | &:hover { 30 | color: $black; 31 | 32 | &:before { 33 | opacity: 1; 34 | } 35 | } 36 | } 37 | 38 | &__parent-hashes-header { 39 | font-weight: bold; 40 | margin-bottom: $base * 1.5; 41 | color: $black; 42 | } 43 | 44 | &__blocks-in-tipset { 45 | display: flex; 46 | } 47 | } -------------------------------------------------------------------------------- /frontend/src/components/storage/StorageMining.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import bemify from '../../utils/bemify'; 3 | import {Col, Grid} from '../Grid'; 4 | import MinerCountChart from './MinerCountChart'; 5 | import StorageMinersTable from './StorageMinersTable'; 6 | import PageHeader from '../PageHeader'; 7 | import MiningEvolutionChart from './MiningEvolutionChart'; 8 | 9 | const b = bemify('storage-mining'); 10 | 11 | export default class StorageMining extends React.Component { 12 | render () { 13 | return ( 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | ); 33 | } 34 | } -------------------------------------------------------------------------------- /frontend/src/ducks/Action.ts: -------------------------------------------------------------------------------- 1 | export interface Action { 2 | type: string, 3 | payload: T 4 | } -------------------------------------------------------------------------------- /frontend/src/ducks/store.ts: -------------------------------------------------------------------------------- 1 | import {applyMiddleware, combineReducers, createStore, Store} from 'redux'; 2 | import thunk from 'redux-thunk'; 3 | import stats, {StatsState} from './stats'; 4 | import overrides, {OverridesState} from './overrides'; 5 | 6 | export type AppState = { stats: StatsState, overrides: OverridesState }; 7 | 8 | const store: Store = createStore(combineReducers({ 9 | stats, 10 | overrides, 11 | }), {}, applyMiddleware(thunk)); 12 | export default store; -------------------------------------------------------------------------------- /frontend/src/index.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700|Oxygen&display=swap'); 2 | @import "variables"; 3 | 4 | * { 5 | box-sizing: border-box; 6 | font-family: 'Open Sans', sans-serif; 7 | } 8 | 9 | html, body { 10 | height: 100%; 11 | width: 100%; 12 | color: $black; 13 | } 14 | 15 | #root { 16 | min-height: 100vh; 17 | background: $body; 18 | } 19 | 20 | a { 21 | text-decoration: none; 22 | } -------------------------------------------------------------------------------- /frontend/src/index.tsx: -------------------------------------------------------------------------------- 1 | // put first to allow overrides 2 | import 'normalize.css'; 3 | import './index.scss'; 4 | import 'c3/c3.css'; 5 | 6 | import * as React from 'react'; 7 | import * as ReactDOM from 'react-dom'; 8 | import Main from './components/Main'; 9 | import {BrowserRouter as Router} from 'react-router-dom'; 10 | import {Provider} from 'react-redux'; 11 | import store from './ducks/store'; 12 | import * as Modal from 'react-modal'; 13 | 14 | const body = document.body; 15 | const root = document.createElement('div'); 16 | root.id = 'root'; 17 | body.appendChild(root); 18 | 19 | Modal.setAppElement(document.getElementById('root')); 20 | 21 | if (process.env.SENTRY_DSN && 'Sentry' in window) { 22 | (window as any).Sentry.init({ dsn: process.env.SENTRY_DSN }); 23 | } 24 | 25 | if (process.env.GA_TRACKING_ID && 'ga' in window) { 26 | (window as any).ga('create', process.env.GA_TRACKING_ID, 'auto'); 27 | (window as any).ga('send', 'pageview'); 28 | } 29 | 30 | ReactDOM.render( 31 | 32 | 33 |
34 | 35 | , 36 | document.getElementById('root'), 37 | ); -------------------------------------------------------------------------------- /frontend/src/utils/ChartRenderQueue.ts: -------------------------------------------------------------------------------- 1 | const RENDER_TIMEOUT = 50; 2 | 3 | export default class ChartRenderQueue { 4 | private queue: Function[] = []; 5 | 6 | enqueueRender (cb: (done: () => void) => void) { 7 | this.queue.unshift(cb); 8 | setTimeout(() => this.dequeue(), RENDER_TIMEOUT); 9 | } 10 | 11 | enqueueDispose (cb: (done: () => void) => void) { 12 | this.queue.push(cb); 13 | setTimeout(() => this.dequeue(), RENDER_TIMEOUT); 14 | } 15 | 16 | private dequeue() { 17 | if (!this.queue.length) { 18 | return; 19 | } 20 | 21 | const first = this.queue.shift(); 22 | let fired = false; 23 | first(() => { 24 | if (fired) { 25 | return; 26 | } 27 | 28 | fired = true; 29 | setTimeout(() => this.dequeue(), RENDER_TIMEOUT * 3); 30 | }); 31 | } 32 | } -------------------------------------------------------------------------------- /frontend/src/utils/PercentageNumber.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | import {NumberFormatter} from '@amcharts/amcharts4/core'; 3 | 4 | export class PercentageNumberFormatter extends NumberFormatter { 5 | format (value: number | string, format?: string): string { 6 | return PercentageNumber.create(value).toDisplay(true); 7 | } 8 | } 9 | 10 | export default class PercentageNumber { 11 | private readonly num: BigNumber; 12 | 13 | constructor (num: BigNumber) { 14 | this.num = num; 15 | } 16 | 17 | public toDisplay (showUnit: boolean): string { 18 | return `${this.num.multipliedBy(100).toFixed(1)}${showUnit ? '%' : ''}`; 19 | } 20 | 21 | public toNumber(): number { 22 | return Number(this.num.multipliedBy(100).toFixed(1)); 23 | } 24 | 25 | static create (val: number | string | BigNumber): PercentageNumber { 26 | return new PercentageNumber(new BigNumber(val)); 27 | } 28 | } -------------------------------------------------------------------------------- /frontend/src/utils/averages.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | import { HistogramDatapoint } from 'filecoin-network-stats-common/lib/domain/HistogramDatapoint'; 3 | import { TimeseriesDatapoint } from 'filecoin-network-stats-common/lib/domain/TimeseriesDatapoint'; 4 | 5 | export function makeHistogramAverage(data: HistogramDatapoint[]): BigNumber { 6 | let total = new BigNumber(0); 7 | for (const point of data) { 8 | const count = point.count; 9 | const midpoint = point.bucketEnd.minus(point.bucketStart).div(2); 10 | total = total.plus(midpoint.times(count)); 11 | } 12 | 13 | return total.div(data.length); 14 | } 15 | 16 | export function makeAverage(data: TimeseriesDatapoint[]): BigNumber { 17 | let total = new BigNumber(0); 18 | for (const point of data) { 19 | total = total.plus(point.amount); 20 | } 21 | 22 | return total.div(data.length); 23 | } -------------------------------------------------------------------------------- /frontend/src/utils/bemify.ts: -------------------------------------------------------------------------------- 1 | export type BEMUtil = (element?: string, modifier?: string) => string; 2 | 3 | export default function bemify (block: string): BEMUtil { 4 | return (element?: string, modifier?: string): string => { 5 | if (element && modifier) { 6 | return `${block}__${element}--${modifier}`; 7 | } 8 | 9 | if (element) { 10 | return `${block}__${element}`; 11 | } 12 | 13 | if (modifier) { 14 | return `${block}--${modifier}`; 15 | } 16 | 17 | return block; 18 | }; 19 | } -------------------------------------------------------------------------------- /frontend/src/utils/ellipsify.ts: -------------------------------------------------------------------------------- 1 | export default function ellipsify(input: string, length = 20): string { 2 | if (input.length < length) { 3 | return input; 4 | } 5 | 6 | return `${input.slice(0, length / 2)}...${input.slice(-length / 2)}` 7 | } -------------------------------------------------------------------------------- /frontend/src/utils/net.ts: -------------------------------------------------------------------------------- 1 | export enum Network { 2 | STABLE = 'stable', 3 | OLD_STABLE_2 = 'old-stable-2', 4 | OLD_STABLE_1 = 'old-stable-1', 5 | CUSTOM = 'custom' 6 | } 7 | 8 | const URLS = { 9 | [Network.STABLE]: process.env.BACKEND_URL, 10 | [Network.OLD_STABLE_2]: 'https://prod-devnet-1.filecoin-stats-infra.kyokan.io', 11 | [Network.OLD_STABLE_1]: 'https://prod-devnet-2.filecoin-stats-infra.kyokan.io' 12 | }; 13 | 14 | function urlFor (network: Network, customURL: string) { 15 | if (network === Network.CUSTOM) { 16 | return customURL; 17 | } 18 | 19 | return URLS[network]; 20 | } 21 | 22 | export async function getJSON (url: string): Promise { 23 | const res = await fetch(url); 24 | if (res.status !== 200) { 25 | throw new Error(`Received non-200 status code: ${res.status}`); 26 | } 27 | 28 | const json = await res.json(); 29 | return json as T; 30 | } 31 | 32 | export async function getBackendJSON (network: Network, customURL: string, path: string): Promise { 33 | return getJSON(`${urlFor(network, customURL)}/${path}`); 34 | } -------------------------------------------------------------------------------- /frontend/src/utils/randomData.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | import {TimeseriesDatapoint} from 'filecoin-network-stats-common/lib/domain/TimeseriesDatapoint'; 3 | import {CategoryDatapoint} from 'filecoin-network-stats-common/lib/domain/CategoryDatapoint'; 4 | 5 | export function fakeSineWave (): TimeseriesDatapoint[] { 6 | const ret: TimeseriesDatapoint[] = []; 7 | const now = Date.now(); 8 | 9 | for (let i = 30; i >= 0; i--) { 10 | const date = Math.floor(((now / 1000) - i * 86400)); 11 | const amount = Math.floor(30 - i + Math.abs(Math.sin(i) * 10)); 12 | 13 | ret.push({ 14 | date, 15 | amount: new BigNumber(amount), 16 | }); 17 | } 18 | 19 | return ret; 20 | } 21 | 22 | export function fakeEvolution(labels: string[]): CategoryDatapoint[] { 23 | const ret: CategoryDatapoint[] = []; 24 | const now = Date.now(); 25 | 26 | for (let i = 30; i >= 0; i--) { 27 | const date = Math.floor(((now / 1000) - i * 86400)); 28 | const point: CategoryDatapoint = { 29 | category: date, 30 | data: {} 31 | }; 32 | let acc = 0; 33 | for (let j = 0; j < labels.length; j++) { 34 | let num = Math.abs(Math.sin(i - j)) / 2; 35 | if (acc + num > 1) { 36 | num = 1 - acc; 37 | } 38 | acc += num; 39 | point.data[labels[j]] = new BigNumber(num) 40 | } 41 | ret.push(point); 42 | } 43 | 44 | return ret; 45 | } -------------------------------------------------------------------------------- /frontend/src/utils/time.ts: -------------------------------------------------------------------------------- 1 | export function secToMillis(time: number): number { 2 | return time * 1000; 3 | } -------------------------------------------------------------------------------- /frontend/src/utils/timeseriesUnits.ts: -------------------------------------------------------------------------------- 1 | import {TimeseriesDatapoint} from 'filecoin-network-stats-common/lib/domain/TimeseriesDatapoint'; 2 | import BigNumber from 'bignumber.js'; 3 | import {createCurrencyNumberFormatter, CurrencyNumberFormatter} from './Currency'; 4 | import {NumberFormatter} from '@amcharts/amcharts4/core'; 5 | 6 | export interface TimeseriesRenderOpts { 7 | tooltipNum: string 8 | numberFormatter: NumberFormatter 9 | } 10 | 11 | export function currencyTimeseriesRenderOpts (points: TimeseriesDatapoint[]): TimeseriesRenderOpts { 12 | const firstNonZero = points.find((d: TimeseriesDatapoint) => d.amount.gt(0)); 13 | if (!firstNonZero) { 14 | return { 15 | tooltipNum: `{amount0.formatNumber('#,###.00')}`, 16 | numberFormatter: new CurrencyNumberFormatter(false), 17 | }; 18 | } 19 | 20 | const chosenPoint = firstNonZero ? firstNonZero.amount : new BigNumber(0); 21 | const tooltipNum = chosenPoint.decimalPlaces() > 2 && chosenPoint.lt(0.01) ? 22 | `{amount0.formatNumber('#.#e')}` : 23 | `{amount0.formatNumber('#,###.00')}`; 24 | const numberFormatter = createCurrencyNumberFormatter(chosenPoint); 25 | 26 | return { 27 | tooltipNum, 28 | numberFormatter, 29 | }; 30 | } -------------------------------------------------------------------------------- /frontend/src/variables.scss: -------------------------------------------------------------------------------- 1 | $body: #f4f7fc; 2 | $white: #ffffff; 3 | $black: #333; 4 | $grey: #ccc; 5 | $dark-grey: #aaa; 6 | $light-grey: #f4f5f7; 7 | $border: darken($body, 3%); 8 | 9 | $base: 12px; 10 | 11 | $orange: #ffba76; 12 | $blue: #45b9e6; 13 | $green: #74e8be; 14 | $turquoise: #91a5e2; 15 | 16 | $teal-600: #0d8885; 17 | $teal-500: #13b7b3; 18 | $teal-400: #6ddfdf; 19 | $teal-300: #80eaeb; 20 | $teal-200: #b9f8f3; 21 | $teal-100: #e5fbf7; 22 | 23 | $orange-500: #fe6b57; 24 | $orange-400: #e27d0e; 25 | $orange-300: #f7931a; 26 | $orange-200: #f7a54b; 27 | $orange-100: #ffba76; 28 | 29 | $green-600: #12c4aa; 30 | $green-500: #17bf7b; 31 | $green-400: #20ce8b; 32 | $green-300: #2ee89c; 33 | $green-200: #74e8be; 34 | $green-100: #cef4e6; 35 | 36 | $blue-400: #748cf9; 37 | $blue-300: #91a5e2; 38 | $blue-200: #cccfe0; 39 | $blue-100: #45b9e6; 40 | 41 | $logo-font: 'Oxygen'; 42 | 43 | %box-shadow { 44 | box-shadow: 0 2px 8px rgba(black, 0.15); 45 | } 46 | 47 | @mixin smartphones() { 48 | @media only screen and (max-width: 480px) { 49 | @content; 50 | } 51 | } -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "sourceMap": true, 5 | "noImplicitAny": true, 6 | "module": "commonjs", 7 | "target": "es5", 8 | "jsx": "react", 9 | "lib": [ 10 | "dom", 11 | "es5", 12 | "es6", 13 | "scripthost" 14 | ], 15 | "experimentalDecorators": true, 16 | "types": [] 17 | }, 18 | "include": [ 19 | "./src/**/*", 20 | "./types/**/*" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /frontend/types/copy-to-clipboard.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'copy-to-clipboard' { 2 | const copy: (t: string) => void; 3 | export = copy 4 | } -------------------------------------------------------------------------------- /frontend/types/d3-geo-projection/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'd3-geo-projection' { 2 | import {GeoProjection} from 'd3-geo'; 3 | 4 | export function geoPatterson (): GeoProjection 5 | } -------------------------------------------------------------------------------- /frontend/types/index.d.ts: -------------------------------------------------------------------------------- 1 | declare var process: { 2 | env: { 3 | BACKEND_URL: string 4 | SENTRY_DSN?: string 5 | GA_TRACKING_ID?: string 6 | } 7 | }; -------------------------------------------------------------------------------- /frontend/types/react-timeago.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'react-timeago' { 2 | import * as React from 'react'; 3 | 4 | interface TimeagoProps { 5 | date: Date | string | number 6 | formatter?: (value: number, unit: string, suffix: string) => string 7 | } 8 | 9 | const el: React.ComponentClass; 10 | export default el; 11 | } -------------------------------------------------------------------------------- /images/go-filecoin-network-stats-dash-evolution.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/images/go-filecoin-network-stats-dash-evolution.jpg -------------------------------------------------------------------------------- /images/go-filecoin-network-stats-dash-overview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/images/go-filecoin-network-stats-dash-overview.jpg -------------------------------------------------------------------------------- /tools/backend.conf: -------------------------------------------------------------------------------- 1 | [program:backend] 2 | directory=/home/mslipper/filecoin-network-stats/backend 3 | command=/usr/bin/node ./dist/src/main.js 4 | stderr_logfile=/var/log/supervisor/backend.err.log 5 | stdout_logfile=/var/log/supervisor/backend.out.log 6 | environment=DB_URL="postgresql://stats:password@localhost:5432/filecoin-network-stats",FULL_NODE_URL="http://0.0.0.0:3453",IS_MASTER="true",PEER_INFO_FILE="./peerId.json",HEARTBEAT_PORT="8080",API_PORT="8081",LOG_LEVEL="silly" 7 | -------------------------------------------------------------------------------- /tools/binaries/filecoin-linux.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filecoin-shipyard/2019-filecoin-network-stats/7b0bbb43cb6ff450a9c4f62b971fed34700f318e/tools/binaries/filecoin-linux.tar.gz -------------------------------------------------------------------------------- /tools/create-ask.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | MINER_ADDR=`$DIR/remote-filecoin.sh 0 'config mining.minerAddress' | grep -oi '"fc.*"' | tr -d '"'` 5 | MINER_OWNER_ADDR=`$DIR/remote-filecoin.sh 0 "miner owner $MINER_ADDR" | grep -oi 'fc[a-z0-9]*'` 6 | CID=`$DIR/remote-filecoin.sh 0 "miner add-ask --from=$MINER_OWNER_ADDR $MINER_ADDR $1 5 --price=1 --limit=10" | tail -n +3 | head -n 1` 7 | echo "Waiting on $CID to be mined..." 8 | $DIR/remote-filecoin.sh 0 "message wait $CID" -------------------------------------------------------------------------------- /tools/create-deal.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | ssh mslipper@filecoin-infra.dev.kyokan.io 'echo "testdata" > /tmp/test.txt' 5 | CID=`./remote-filecoin.sh 1 'client import /tmp/test.txt' | tail -n +3 | head -n 1` 6 | ASK_JSON=`./remote-filecoin.sh 0 'client list-asks --enc=json' | tail -n +3 | head -n 1` 7 | MINER=`echo $ASK_JSON | jq .Miner -r` 8 | ASK_ID=`echo $ASK_JSON | jq .ID -r` 9 | 10 | echo "CID: $CID" 11 | echo "Miner: $MINER" 12 | echo "Ask ID: $ASK_ID" 13 | 14 | ./remote-filecoin.sh 1 "client propose-storage-deal $MINER $CID $ASK_ID 10000" -------------------------------------------------------------------------------- /tools/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/../" 4 | echo "Deploying directory $DIR" 5 | rsync --delete -rvzP --exclude=node_modules --exclude=.idea --exclude=.iml --exclude=.git --exclude=dist -e ssh $DIR mslipper@filecoin-infra.dev.kyokan.io:/home/mslipper/filecoin-network-stats 6 | ssh mslipper@filecoin-infra.dev.kyokan.io <