Advertisement
Guest User

friends.html

a guest
Nov 12th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.26 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.  
  4. <title>Grin</title>
  5. <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  8. <!--[if lt IE 9]>
  9. <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  10. <![endif]-->
  11.  
  12. <!-- GoogleFonts -->
  13. <!-- <link href="https://fonts.googleapis.com/css?family=Space+Mono" rel="stylesheet"> -->
  14.  
  15. <!-- Font Awesome -->
  16. <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.2/css/all.css" integrity="" crossorigin="anonymous">
  17. <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
  18.  
  19. <!-- CSS Main -->
  20. <link rel="stylesheet" type="text/css" href="main.css"/>
  21.  
  22. <!-- Katex -->
  23. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css" integrity="" crossorigin="anonymous">
  24. <script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js" integrity="" crossorigin="anonymous"></script>
  25. <script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/contrib/auto-render.min.js" integrity="" crossorigin="anonymous"></script>
  26. </head>
  27.  
  28. <header class="container">
  29. <nav>
  30. <ul class="nav-logo">
  31. <li><a href="https://grin-tech.org/">Grin</a></li>
  32. </ul>
  33. <ul class="nav-root">
  34. <li>
  35. <a href="https://github.com/mimblewimble/grin/releases">Releases</a>
  36. </li>
  37. <li>
  38. <a href="https://github.com/mimblewimble/docs/wiki">Wiki</a>
  39. </li>
  40. <li>
  41. <span class="dropdown" href="https://www.grin-forum.org/">
  42. Community
  43. <nav>
  44. <span class="dropdown-heading">Everyone.</span>
  45. <a href="https://grinnews.substack.com/">News</a>
  46. <a href="https://www.grin-forum.org/">Forum</a>
  47. <a href="https://gitter.im/grin_community/Lobby">Chat</a>
  48. </nav>
  49. </span>
  50. </li>
  51. <li>
  52. <span class="dropdown" href="https://www.grin-forum.org/">
  53. Guides
  54. <nav>
  55. <span class="dropdown-heading">Learn to use Grin</span>
  56. <a href="https://github.com/mimblewimble/docs/wiki/how-to-run-a-grin-node">Running a node</code></a>
  57. <a href="https://github.com/mimblewimble/docs/wiki/how-to-use-the-grin-wallet">Using the wallet</a>
  58. <a href="https://github.com/mimblewimble/docs/wiki/how-to-mine-grin">Running a miner</a>
  59. </nav>
  60. </span>
  61. </li>
  62. <li>
  63. <span class="dropdown" href="https://www.grin-forum.org/">
  64. Learn more
  65. <nav>
  66. <span class="dropdown-heading">The Rabbit hole</span>
  67. <a href="https://github.com/mimblewimble/grin/blob/master/doc/intro.md">Grin Introduction</a>
  68. <a href="https://github.com/mimblewimble/grin/blob/master/doc/pow/pow.md">Cuckoo cycle</a>
  69. <a href="https://github.com/mimblewimble/grin/blob/master/doc/grin4bitcoiners.md">Grin for Bitcoiners</a>
  70. <a href="https://github.com/mimblewimble/docs/wiki/Grin-Privacy-Primer">Privacy in Grin</a>
  71. <a href="https://github.com/mimblewimble/docs/wiki/Monetary-Policy">Monetary Policy</a>
  72. <a href="https://github.com/mimblewimble/docs/wiki/Community-projects">Community projects</a>
  73. <a href="funding.html">Community funding</a>
  74. <a href="friends.html">Friends of Grin</a>
  75. </nav>
  76. </span>
  77. </li>
  78. <!-- <li><a href="/dev">Documentation</a></li> -->
  79. </ul>
  80. <ul class="nav-hamburger">
  81. <button class="hamburger" type="button">
  82. <span class="hamburger-box">
  83. <span class="hamburger-inner"></span>
  84. </span>
  85. </button>
  86. </ul>
  87. <div>
  88. </div>
  89. <ul class="nav-mobile">
  90. <div class="nav-mobile-fade">
  91. <span class="nav-mobile-heading">Grin</span>
  92. <li>
  93. <a href="https://grin-tech.org/">Home</a>
  94. </li>
  95. <li>
  96. <a href="https://github.com/mimblewimble/grin/blob/master/doc/intro.md">Introduction</a>
  97. </li>
  98. <li>
  99. <a href="https://github.com/mimblewimble/grin/releases">Releases</a>
  100. </li>
  101. <li>
  102. <a href="https://github.com/mimblewimble/docs/wiki">Wiki</a>
  103. </li>
  104. <li>
  105. <a href="https://www.grin-forum.org/">Forum</a>
  106. </li>
  107. <span class="nav-mobile-heading">Guides</span>
  108. <li>
  109. <a href="https://github.com/mimblewimble/grin/blob/master/doc/build.md">Setup Grin</a>
  110. </li>
  111. <li>
  112. <a href="https://github.com/mimblewimble/grin-miner/blob/master/README.md">Setup Grin Miner</a>
  113. </li>
  114. <span class="nav-mobile-heading">Learn more</span>
  115. <li>
  116. <a href="https://github.com/mimblewimble/grin/blob/master/doc/intro.md">Grin Introduction</a>
  117. </li>
  118. <li>
  119. <a href="https://github.com/mimblewimble/grin/blob/master/doc/pow/pow.md">Cuckoo cycle</a>
  120. </li>
  121. <li>
  122. <a href="https://github.com/mimblewimble/grin/blob/master/doc/grin4bitcoiners.md">Grin for Bitcoiners</a>
  123. </li>
  124. <li>
  125. <a href="https://grin-tech.org/friends">Friends of Grin</a>
  126. </li>
  127. <li>
  128. <a href="https://github.com/mimblewimble/docs/wiki/Community-projects">Community projects</a>
  129. </li>
  130. <li>
  131. <a href="https://grin-tech.org/funding">Community funding</a>
  132. </li>
  133. </div>
  134. </ul>
  135. </nav>
  136.  
  137. </header>
  138. <main class="main-root">
  139. <h1>Friends of Grin</h1>
  140. <p>
  141. The following companies, institutions, or individuals have generously donated
  142. financial resources to the Grin project under our
  143. <a href="https://grin-tech.org/funding">community funding model</a>. We're grateful for their
  144. support, and are proud to display their logos or names as supporters of Grin.
  145. </p>
  146.  
  147. <h2>Hall of Fame</h2>
  148. <p>
  149. Please note: This section has just been introduced and is a <b><em>work in progress</em></b>.
  150. Data to populate donation amounts is obtained from our recently created <a href="https://github.com/mimblewimble/grin-pm/blob/master/financials/income_log.csv">income log</a>.
  151. We are trying to retroactively populate this log with your donations, but this might take us some time.
  152. We welcome help from supporters and the wider community to achieve this.
  153. </p>
  154. <section id="leaderboard">
  155. <div class="leaderboard-content">
  156. <div class="leaderboard-row">
  157. <div class="leaderboard-loading">
  158. </div>
  159. </div>
  160. <br/>
  161. <div class="leaderboard-row">
  162. <div class="leaderboard-loading">
  163. </div>
  164. </div>
  165. <br/>
  166. <div class="leaderboard-row">
  167. <div class="leaderboard-loading">
  168. </div>
  169. </div>
  170. <br/>
  171. <div class="leaderboard-row">
  172. <div class="leaderboard-loading">
  173. </div>
  174. </div>
  175. <br/>
  176. <div class="leaderboard-row">
  177. <div class="leaderboard-loading">
  178. </div>
  179. </div>
  180. </div>
  181. </section>
  182.  
  183. <h2>Companies</h2>
  184. <!-- Temporary black div until we convert to black on white logos -->
  185. <section class="companies">
  186. <a href="https://www.bitonic.nl/">
  187. <img src="logos/bitonic-white.png" title="Bitonic">
  188. </a>
  189. <a href="https://www.kryptonite1.co/">
  190. <img src="logos/kr1_med.png" title="KR1">
  191. </a>
  192. <a href="https://www.tmgox.com/">
  193. <img src="logos/tmgox-logo.jpg" title="KR1">
  194. </a>
  195. <a href="https://gpu.one/">
  196. <img src="logos/gpuOne-white.png" title="GPU.one">
  197. </a>
  198. <a href="https://www.megapool.info/">
  199. <img class="no-frame" src="logos/Mega-Pool-Logo-trans.png" title="Mega Pool">
  200. </a>
  201. <a href="https://www.grinmint.com/">
  202. <img src="logos/grinmint_logo_square.svg" title="Grinmint by BlockCypher">
  203. </a>
  204. <a href="https://kyokan.io/">
  205. <img src="logos/kyokan_teal_white.png" title="Kyokan">
  206. </a>
  207. <a href="http://innosilicon.com/">
  208. <img src="logos/Innosilicon.png" title="Innosilicon">
  209. </a>
  210. <a href="https://galleon.exchange/">
  211. <img src="logos/galleon.png" title="Galleon">
  212. </a>
  213. <a href="https://mining.luxor.tech/">
  214. <img class="no-frame" src="logos/luxor_logo.png" title="Luxor">
  215. </a>
  216. <a href="https://beam-mw.com/">
  217. <img src="logos/beam_logo.png" title="Beam">
  218. </a>
  219. <a href="https://continue.capital/">
  220. <img src="logos/continuecapital.png" title="Continue Capital">
  221. </a>
  222. <a href="http://cyphercapital.net/">
  223. <img src="logos/cypher_capital.png" title="Cypher Capital">
  224. </a>
  225. <a href="https://hashrabbit.co/">
  226. <img src="logos/hashrabbit.png" title="Cypher Capital">
  227. </a>
  228. <a href="https://lemniscap.com/">
  229. <img src="logos/lemniscap.png" title="Lemniscap">
  230. </a>
  231. <a href="#">
  232. <img class="no-frame" src="logos/chanceventures.png" title="Chance Ventures">
  233. </a>
  234. <a href="https://www.wings.ai/">
  235. <img class="no-frame" src="logos/wingsai-grey.png" title="Wings">
  236. </a>
  237. <a href="https://www.cgs.group/">
  238. <img src="logos/cgs-logo-white.svg" title="CGS Group">
  239. </a>
  240. <a href="https://www.coingecko.com/en/coins/grin">
  241. <img class="no-frame" src="logos/CoinGecko-WhiteText-small.png" title="CoinGecko">
  242. </a>
  243. <a href="https://hashoutliers.com/">
  244. <img class="no-frame" src="logos/Outliers-256x.png" title="Outliers">
  245. </a>
  246. <a href="https://www.bhex.com/">
  247. <img class="no-frame" src="logos/bhex-384x.png" title="Blue Helix Exchange(BHEX)">
  248. </a>
  249. <a href="https://www.sparkpool.com/">
  250. <img class="no-frame" src="logos/Sparkpool-660x.png" title="SparkPool">
  251. </a>
  252. <a href="https://qtum.org/">
  253. <img class="no-frame" src="logos/qtum.png" title="Qtum">
  254. </a>
  255. <a href="https://bit.fish/">
  256. <img src="logos/bitfish.png" title="bitfish">
  257. </a>
  258. <a href="https://bminer.me/">
  259. <img class="no-frame" src="logos/bminer-white-only.png" title="bminer">
  260. </a>
  261. <a href="https://prokapi.com/">
  262. <img src="logos/prokapi-white.png" title="Prokapi">
  263. </a>
  264. <a href="https://hashtagchain.com/">
  265. <img class="no-frame" src="logos/hashtag-capital.png" title="Hashtag Capital">
  266. </a>
  267. <a href="https://www.f2pool.com/">
  268. <img src="logos/f2pool.png" title="F2Pool">
  269. </a>
  270. <a href="https://www.minerbabe.com/">
  271. <img class="no-frame" src="logos/minerbabe-white.png" title="Minerbabe">
  272. </a>
  273. <a href="https://0301.farm/">
  274. <img class="no-frame" src="logos/0301-transparent.png" title="0301 - Mining Farm">
  275. </a>
  276. <a href="https://2miners.com/">
  277. <img class="no-frame" src="logos/logo-2miners-red.svg" title="2Miners">
  278. </a>
  279. </section>
  280.  
  281. <!-- TODO: add default profile image -->
  282. <article markdown="1" class="post-content">
  283. <h2>Individuals</h2>
  284. <em>In alphabetical order:</em><br/><br/>
  285. <div class="individuals">
  286. <div class="individual">
  287. <img src="grin-logo.png"/>
  288. <span>Redouan Ahaloui</span>
  289. </div>
  290. <div class="individual">
  291. <img src="grin-logo.png"/>
  292. <span>Aurel</span>
  293. </div>
  294. <div class="individual">
  295. <img src="grin-logo.png"/>
  296. <span>Leonid Beder</span>
  297. </div>
  298. <div class="individual">
  299. <img src="grin-logo.png"/>
  300. <span>Roy Blankman</span>
  301. </div>
  302. <div class="individual">
  303. <img src="grin-logo.png"/>
  304. <span>Ivan Brightly</span>
  305. </div>
  306. <div class="individual">
  307. <img src="grin-logo.png"/>
  308. <span>Guy Corem</span>
  309. </div>
  310. <div class="individual">
  311. <img src="grin-logo.png"/>
  312. <span>Chance Du</span>
  313. </div>
  314. <div class="individual">
  315. <img src="grin-logo.png"/>
  316. <span>Adonis Ferreira</span>
  317. </div>
  318. <div class="individual">
  319. <img src="grin-logo.png"/>
  320. <span>Roderik van der Graaf</span>
  321. </div>
  322. <div class="individual">
  323. <img src="grin-logo.png"/>
  324. <span>Poseidon Ho</span>
  325. </div>
  326. <div class="individual">
  327. <img src="grin-logo.png"/>
  328. <span>Michalis Kargakis</span>
  329. </div>
  330. <div class="individual">
  331. <img src="grin-logo.png"/>
  332. <span>Baek Kyoum Kim</span>
  333. </div>
  334. <div class="individual">
  335. <img src="grin-logo.png"/>
  336. <span>Sehwan Kim (misskiwi)</span>
  337. </div>
  338. <div class="individual">
  339. <img src="grin-logo.png"/>
  340. <span>Mitchell Krawiec-Thayer Ph.D. (Isthmus)</span>
  341. </div>
  342. <div class="individual">
  343. <img src="grin-logo.png"/>
  344. <span>Jie Liu</span>
  345. </div>
  346. <div class="individual">
  347. <img src="grin-logo.png"/>
  348. <span>Jameson Lopp</span>
  349. </div>
  350. <div class="individual">
  351. <img src="grin-logo.png"/>
  352. <span>juelianshana</span>
  353. </div>
  354. <div class="individual">
  355. <img src="grin-logo.png"/>
  356. <span>Chris McCann</span>
  357. </div>
  358. <div class="individual">
  359. <img src="grin-logo.png"/>
  360. <span>Jack Misteli Jean-Guillaume</span>
  361. </div>
  362. <div class="individual">
  363. <img src="grin-logo.png"/>
  364. <span>Bart Mol</span>
  365. </div>
  366. <div class="individual">
  367. <img src="grin-logo.png"/>
  368. <span>Yan Pritzker</span>
  369. </div>
  370. <div class="individual">
  371. <img src="grin-logo.png"/>
  372. <span>Hendrik Richter</span>
  373. </div>
  374. <div class="individual">
  375. <img src="grin-logo.png"/>
  376. <span>Niels de Ruiter</span>
  377. </div>
  378. <div class="individual">
  379. <img src="grin-logo.png"/>
  380. <span>Alex (X) Sherman</span>
  381. </div>
  382. <div class="individual">
  383. <img src="grin-logo.png"/>
  384. <span>Daisuke Shosaki</span>
  385. </div>
  386. <div class="individual">
  387. <img src="grin-logo.png"/>
  388. <span>Max Tannahill</span>
  389. </div>
  390. <div class="individual">
  391. <img src="grin-logo.png"/>
  392. <span>Aaron Ting</span>
  393. </div>
  394. <div class="individual">
  395. <img src="grin-logo.png"/>
  396. <span>Shaishav Todi</span>
  397. </div>
  398. <div class="individual">
  399. <img src="grin-logo.png"/>
  400. <span>Alexander Zaidelson</span>
  401. </div>
  402. </div>
  403.  
  404. <h2>Anonymous Supporters</h2>
  405. <p>We'd also like to explicitly thank everyone who's donated to one of Grin's campaigns but chosen to remain
  406. anonymous. We're working to protect that choice!</p>
  407.  
  408. <h2>Minimum amounts</h2>
  409. <p>100 USD in crypto-equivalent in order to be listed in the individuals section, 1,000 USD in the companies section,
  410. and 25,000 USD in the Hall of Fame.</p>
  411.  
  412. <h2>See something wrong?</h2>
  413. <p>This page is a work in progress. We are doing our best to keep information up to date, but there's a good chance
  414. bugs will slip in. For any corrections, please contact daniel.lehnberg@protonmail.com.</p>
  415. </article>
  416.  
  417.  
  418. <script crossorigin src="https://unpkg.com/papaparse@4.6.3/papaparse.min.js"></script>
  419. <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
  420. <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
  421. <!-- <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
  422. <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> -->
  423. <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
  424. <script type="text/babel">
  425. function numberWithCommas(x) {
  426. return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  427. }
  428.  
  429. function parseCsv(csv) {
  430. // Use trimHeaders <5.0.0, and transformHeader >=5.0.0
  431. return Papa.parse(csv, {
  432. trimHeaders: true,
  433. header: true,
  434. skipEmptyLines: true,
  435. }).data;
  436. }
  437.  
  438. function parseDate(date) {
  439. if (date) {
  440. return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);
  441. }
  442. return '-';
  443. }
  444.  
  445. const $leaderboard = document.getElementById('leaderboard');
  446.  
  447. function App() {
  448. const [leaderboard, setLeaderboard] = React.useState([]);
  449.  
  450. // Url to .csv files
  451. const incomeUrl = 'https://raw.githubusercontent.com/mimblewimble/grin-pm/master/financials/income_log.csv';
  452. const entitiesUrl = '/assets/csv/entities.csv';
  453. const miscUrl = 'https://raw.githubusercontent.com/mimblewimble/grin-pm/master/financials/misc_support.csv';
  454.  
  455. React.useEffect(() => {
  456. // Fetch data on mount
  457. Promise.all([
  458. fetch(incomeUrl).then((res) => res.text()).then((res) => parseCsv(res)),
  459. fetch(entitiesUrl).then((res) => res.text()).then((res) => parseCsv(res)),
  460. fetch(miscUrl).then((res) => res.text()).then((res) => parseCsv(res)),
  461. ]).then((res) => {
  462. const donations = res[0];
  463. const entities = res[1];
  464. const misc = res[2];
  465.  
  466. // Append donations to the correct company/individual
  467. donations.concat(misc).forEach((donation) => {
  468. const index = entities.findIndex((o) => (o.name.toLowerCase() === donation.source.toLowerCase()));
  469. try {
  470. (entities[index].donations)
  471. ? entities[index].donations.push(donation)
  472. : entities[index].donations = [donation];
  473. } catch (e) {
  474. console.error('Missing entity in \`entities.csv\`: ' + donation.source);
  475. }
  476. });
  477.  
  478. // Add helper properties `total`, `numberOfDonations`, `lastDonation`
  479. // that are displayed on leaderboard
  480. return entities.map((o) => {
  481. return Object.assign({}, o, {
  482. total: (o.donations && o.donations.reduce((acc, cur) => acc + parseInt(cur.USD_equivalent), 0)) || 0,
  483. numberOfDonations: (o.donations) ? o.donations.length : 0,
  484. lastDonation: (o.donations) ? Math.max.apply(null, o.donations.map((d) => d.date)).toString() : null,
  485. });
  486. // Threshold for leaderboard is set here
  487. }).filter((o) => o.total >= 25000).sort(function(a, b) { return a.total - b.total }).reverse().map(function(o, i) { o.rank = i + 1; return o; });
  488. }).then((res) => {
  489. if (res.length) {
  490. setLeaderboard(res);
  491. } else {
  492. setLeaderboard([null]);
  493. }
  494. });
  495. }, []);
  496.  
  497. return (
  498. <React.Fragment>
  499. {(leaderboard.length === 0)
  500. ? <Loading />
  501. : <Leaderboard leaderboard={leaderboard} />}
  502. </React.Fragment>
  503. );
  504. }
  505.  
  506. function Loading() {
  507. return (
  508. <div className="leaderboard-content">
  509. <div className="leaderboard-row">
  510. <div className="leaderboard-loading">
  511. </div>
  512. </div>
  513. <br/>
  514. <div className="leaderboard-row">
  515. <div className="leaderboard-loading">
  516. </div>
  517. </div>
  518. <br/>
  519. <div className="leaderboard-row">
  520. <div className="leaderboard-loading">
  521. </div>
  522. </div>
  523. <br/>
  524. <div className="leaderboard-row">
  525. <div className="leaderboard-loading">
  526. </div>
  527. </div>
  528. <br/>
  529. <div className="leaderboard-row">
  530. <div className="leaderboard-loading">
  531. </div>
  532. </div>
  533. </div>
  534. );
  535. }
  536.  
  537. function Leaderboard(props) {
  538. const [itemsToShow, setItemsToShow] = React.useState(10);
  539.  
  540. return (
  541. <React.Fragment>
  542. <div className="leaderboard-content">
  543. {(props.leaderboard[0] === null) ? (
  544. Array.apply(null, Array(10)).map((_, i) => {
  545. return (
  546. <a key={i} className="empty" href="/funding">
  547. {i + 1}. Donate to take this spot!
  548. </a>
  549. );
  550. })
  551. ) : null}
  552. {(props.leaderboard[0] !== null) ? (
  553. props.leaderboard.slice(0, itemsToShow).map((data, i) => {
  554. return (
  555. <LeaderboardRow key={data.id} data={data} i={i} />
  556. )
  557. })
  558. ) : null}
  559. {(props.leaderboard[0] !== null && props.leaderboard.length < 10) ? (
  560. Array.apply(null, Array(10 - props.leaderboard.length)).map((_, i) => {
  561. return (
  562. <a key={i} className="empty" href="/funding">
  563. {props.leaderboard.length + i + 1}. Donate to take this spot!
  564. </a>
  565. );
  566. })
  567. ) : null}
  568. </div>
  569. {(props.leaderboard.length > itemsToShow) ? (
  570. <div className="friends-show-more">
  571. <button
  572. id="friends-show-more-btn"
  573. onClick={function() { setItemsToShow(itemsToShow + 5); }}
  574. >
  575. Show more
  576. </button>
  577. </div>
  578. ) : null}
  579. </React.Fragment>
  580. );
  581.  
  582. function LeaderboardRow(props) {
  583. const [showDonations, setShowDonations] = React.useState(false);
  584.  
  585. return (
  586. <div className="leaderboard-row">
  587. <div className="header">
  588. <div className="logo">
  589. <a href={props.data.href}>
  590. <img src={props.data.profile_src} />
  591. </a>
  592. </div>
  593. <div className="header-info">
  594. <span className="heading">
  595. <span className="rank">{props.i + 1}. </span>
  596. <a href={props.data.href}>{props.data.name}</a>
  597. </span>
  598. <span className="desc">{props.data.description}</span>
  599. </div>
  600. </div>
  601. <div className="info">
  602. <div className="data">
  603. <span className="subheading">Total</span>
  604. <span>{'$' + numberWithCommas(props.data.total)}</span>
  605. </div>
  606. <div className="data">
  607. <span className="subheading"># donations</span>
  608. <button
  609. className="donation-number"
  610. onClick={() => { setShowDonations(!showDonations); }}
  611. >
  612. {props.data.numberOfDonations}
  613. {(props.data.donations)
  614. ? <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="feather feather-chevron-down"><polyline points="6 9 12 15 18 9"></polyline></svg>
  615. : null}
  616. </button>
  617. </div>
  618. <div className="data">
  619. <span className="subheading">Last donation</span>
  620. <span>{parseDate(props.data.lastDonation)}</span>
  621. </div>
  622. </div>
  623. {(props.data.donations && showDonations) ? (
  624. <div className="donations">
  625. {props.data.donations.map((donation) => (
  626. <div className="donation" key={donation.income_id + donation.source}>
  627. <strong>{'$' + numberWithCommas(parseInt(donation.USD_equivalent)) + ' '}</strong>
  628. ({donation.amount + ' ' + donation.currency}){': '}
  629. {(donation.url && donation.url !== '-') ? (
  630. <a href={donation.url}>{donation.comment}</a>
  631. ) : <span>{donation.comment}</span>}
  632. </div>
  633. ))}
  634. </div>
  635. ) : null}
  636. </div>
  637. );
  638. }
  639. }
  640. ReactDOM.render(<App />, $leaderboard);
  641. </script>
  642. </main>
  643.  
  644. <footer>
  645. <div class="footer-root container-sm">
  646. <section class="footer-section" style="flex-grow: 0;">
  647. <img src="grin_mw_logo.svg" class="grin-logo-footer" alt="Description">
  648. </section>
  649. <section class="footer-section">
  650. <strong><h4>Grin</h4></strong>
  651. <div><a href="https://github.com/mimblewimble/grin/releases">Github</a></div>
  652. <div><a href="https://download.wpsoftware.net/bitcoin/wizardry/mimblewimble.txt">Original Whitepaper</a></div>
  653. <div><a href="https://download.wpsoftware.net/bitcoin/wizardry/mimblewimble.pdf">Andrew Poelstra's Whitepaper</a></div>
  654. <div><a href="https://github.com/mimblewimble/grin/blob/master/SECURITY.md">Security and vulnerability policy</a></div>
  655. <div><a href="https://grin-tech.org/friends">Friends of Grin</a></div>
  656. <div><a href="https://grin-tech.org/visual">Logos</a></div>
  657. </section>
  658. <section class="footer-section">
  659. <strong><h4>The Rabbit hole</h4></strong>
  660. <div><a href="https://github.com/mimblewimble/grin/blob/master/doc/intro.md">Grin Introduction</a></div>
  661. <div><a href="https://github.com/mimblewimble/grin/blob/master/doc/pow/pow.md">Cuckoo cycle</a></div>
  662. <div><a href="https://github.com/mimblewimble/grin/blob/master/doc/grin4bitcoiners.md">Grin for Bitcoiners</a></div>
  663. </section>
  664. <section class="footer-section" style="flex-grow: 6;">
  665. <strong><h4>Community</h4></strong>
  666. <div><a href="https://gitter.im/grin_community/Lobby">Gitter</a></div>
  667. <div><a href="https://grinnews.substack.com/">News</a></div>
  668. <div><a href="https://www.grin-forum.org/">Forum</a></div>
  669. <div><a href="https://twitter.com/grincouncil">Twitter</a></div>
  670. <div><a href="https://launchpad.net/~mimblewimble">Mailing List</a></div>
  671. <div><a href="https://github.com/mimblewimble/docs/wiki/News-and-Channels#communities">Community Groups</a></div>
  672. <div><a href="https://github.com/mimblewimble/docs/wiki/Events">Community Events</a></div>
  673. <div><a href="https://grin-tech.org/page-contribution-howto">Improve this website</a></div>
  674. </section>
  675. </div>
  676. </footer>
  677.  
  678. </body>
  679. <script>
  680. var hamburger = document.querySelector(".hamburger");
  681. var navMobile = document.querySelector(".nav-mobile");
  682. var navMobileFade = document.querySelector(".nav-mobile-fade");
  683. hamburger.addEventListener("click", function() {
  684. hamburger.classList.toggle("is-active");
  685. hamburger.classList.toggle("hamburger--slider");
  686. navMobile.classList.toggle("is-active");
  687. navMobileFade.classList.toggle("is-active");
  688. });
  689. document.addEventListener("DOMContentLoaded", function() {
  690. renderMathInElement(document.body, {
  691. delimiters: [
  692. { left: "$$", right: "$$", display: true },
  693. { left: "\\[", right: "\\]", display: true },
  694. { left: "$", right: "$", display: false },
  695. ],
  696. ignoredTags: [
  697. "script", "noscript", "style", "textarea", "pre", "code",
  698. ],
  699. });
  700. var nodes = document.querySelectorAll('script[type="math/tex; mode=display"]');
  701. for (var i = 0; i < nodes.length; i++) {
  702. var tex = nodes[i].innerHTML;
  703. var markup = "<div class=\"equation\">" +
  704. katex.renderToString(tex, { displayMode: true }) +
  705. "</div>";
  706. nodes[i].outerHTML = markup;
  707. }
  708. });
  709. </script>
  710. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement