CINXE.COM
How To Launch Your Own Production-ready Cryptocurrency | HackerNoon
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>How To Launch Your Own Production-ready Cryptocurrency | HackerNoon</title><meta name="description" content="<em>This article covers </em><a href="https://hackernoon.com/tagged/blockchain" target="_blank"><em>blockchain</em></a><em> programming for </em><a href="https://hackernoon.com/tagged/cryptocurrency" target="_blank"><em>cryptocurrency</em></a><em>, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.</em>"/><meta property="og:title" content="How To Launch Your Own Production-ready Cryptocurrency | HackerNoon"/><meta property="og:description" content="<em>This article covers </em><a href="https://hackernoon.com/tagged/blockchain" target="_blank"><em>blockchain</em></a><em> programming for </em><a href="https://hackernoon.com/tagged/cryptocurrency" target="_blank"><em>cryptocurrency</em></a><em>, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.</em>"/><meta name="image" property="og:image" content="https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png"/><meta property="twitter:title" content="How To Launch Your Own Production-ready Cryptocurrency | HackerNoon"/><meta property="twitter:description" content="<em>This article covers </em><a href="https://hackernoon.com/tagged/blockchain" target="_blank"><em>blockchain</em></a><em> programming for </em><a href="https://hackernoon.com/tagged/cryptocurrency" target="_blank"><em>cryptocurrency</em></a><em>, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.</em>"/><meta property="twitter:image" content="https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="@hackernoon"/><link rel="canonical" href="https://hackernoon.com/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371"/><link href="/prism.css" rel="stylesheet"/><script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","name":"How To Launch Your Own Production-ready Cryptocurrency","headline":"How To Launch Your Own Production-ready Cryptocurrency","author":{"@type":"Person","name":"Adam Bavosa"},"datePublished":"2018-02-14","image":"https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png","articleSection":"ethereum","articleBody":"This article covers blockchain programming for cryptocurrency , testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution. The way we do money is changing. What can you do to keep up? Blockchain and cryptocurrency have been around for years, but only in the past several months has the conversation spread far beyond arcane internet forums and tech company break rooms. Maybe it’s time for you to make your own cryptocurrency, to make your own medium of exchange for goods and services. That may sound complicated! But it’s simpler than you would expect — thanks to the great strides the decentralization community has made and continues to innovate with. Bank of the Future A cryptocurrency replaces today’s bank. Banks keep track of the amount of money you have in an account. Instead of trusting a single institution to keep track of this for you, you can trust a massive computer network made up of anyone and everyone to keep track, publicly. The collective computers in this network confirm every single transaction of currency that ever happened and ever will happen. This public consensus is the assurance that people rely on when using cryptocurrency for payment. Your own cryptocurrency can be the token that you accept for business — kind of like tokens in an arcade. This currency can be brought into existence today. The first step is to choose a big, decentralized computer network that is constantly confirming the legitimacy of new additions to its blockchain. Let’s go with Ethereum. Smart Contract Programming Ethereum is a decentralized computing platform for executing smart contracts. These are programs that run code in a transparent environment, without the possibility of third-party tampering. A user’s private key is used to create a fundamentally unique signature for every request that executes a smart contract ( ). see this wiki if you are not familiar with asymmetrical cryptography The Ethereum community has a sizable following of open source software engineers that are relentlessly developing amazing tools for the greater good of humanity. To make your own cryptocurrency on the Ethereum network, you need these four tools: — An Ethereum smart contract programming language. Solidity — An Ethereum development kit. Truffle Framework — A JavaScript package for interacting with the Ethereum network with an internet browser or Node.js. Web3.js Ether (ETH) — The currency of the . Ethereum network Optional tools: — a Chrome extension for crypto payments. MetaMask Cryptocurrency is merely one of limitless . The brilliant community rallying around Solidity makes it attractive to invest effort in building decentralized apps with Ethereum. First let’s build your own cryptocurrency to start learning blockchain development. use-cases for a blockchain Developing the ERC-20 Token The Ethereum community has established some standards regarding the functionality of smart contracts, including tokens. The cryptocurrency token in this tutorial is based on the . ERC-20 Token Standard If you don’t have node.js, install it now ( ). Then open a terminal window and do: The tests in below will not work with versions earlier than node.js 8 npm install -g trufflemkdir MyToken && cd MyTokentruffle initnpm init -ynpm install -E zeppelin-solidity This installs the Truffle CLI, creates a project directory for your token, and installs an open source Solidity library called . OpenZeppelin Next we can begin writing our Solidity contract. Take a few minutes to familiarize yourself with as well as the . In your project directory, create a file in the auto-generated folder and name it . Add the following code that follows the ERC-20 Token Standard specification. Solidity DANGERS noted in the Token Standard contracts/ Token.sol This token is not mineable and there is a fixed supply. By default, there are , and each token can be divided into fractions up to 18 decimal places. The smallest fraction of a token is referred to as in Ethereum or in Bitcoin. You can change these numbers, the token name, and the token symbol to whatever you want ( ). 1 billion tokens Wei Satoshi see the above constructor function Once this code is deployed to the main Ethereum network, anyone who wants to send or receive your token will execute the code in this contract. The map is the data structure that holds all of the information regarding who owns tokens. The is the wallet owner’s public key, and the is the number of token Wei in the wallet. balances address unsigned 256 bit integer Read vs. Write Read and Write operations for the blockchain have two easy rules: reads are free, writes are not. Since we are using the Ethereum network, by the caller when doing blockchain additions. Additions are made by functions that change state, like transferring tokens from one wallet to another. This can be contrasted with read functions, such as viewing the balance of a wallet. Read functions add no new data to the blockchain and they are always . ETH needs to be spent free to execute Test Your Code Before we deploy our contract, we should thoroughly test it. Truffle includes and documentation in their getting started guide. I’ve included sample integration tests with JavaScript (truffle-keys ). Solidity test JavaScript test here test/integration.test.js — node.js 8 or later The tests here are not exhaustive, but they are a good starting point for an engineer that is learning Solidity. This test file can only be run inside of the environment. truffle develop In order to migrate the contract to an Ethereum client using truffle, add this file to . This migration step is required for the tests to run. 2_deploy_contracts.js migrations/ To run the integration tests we will use the Truffle CLI: npm i ethereumjs-tx truffle developtruffle(develop)> test boots a test blockchain on your local machine. The test network has 10 default Ethereum key pairs that each have every time the server is started. These keys will call the functions in your Solidity contract to test their functionality. The truffle develop command 100 ETH The command will execute all of the tests in the folder. Explore the file to learn exactly what the tests are doing to your test wallets and test blockchain. test test/ integration.test.js Deploying After you are comfortable with, Solidity, network gas prices, and writing your own tests, you can put your token on a public test network. The is one of several public test networks used for Ethereum development. Network connections can be in the file. Ropsten network configured truffle.js If you do not have an Ethereum wallet of your own, I suggest you make one now. If you do not have a mnemonic and wallet, use to generate one. Select in the coin dropdown, and click the English button. this tool ETH Save the mnemonic somewhere safe and secure! It’s a good idea to make separate wallets for test and main networks, so it’s less likely that you’ll have an ETH wasting accident. Add your Ethereum key set mnemonic to your environment variables as like referenced in the above truffle config file. ethereum_mnemonic ## bashexport ethereum_mnemonic="candy maple cake...." If you do not have test ETH in your wallet on the Ropsten network, install the MetaMask Chrome extension to get some for free from a . In order to execute a transaction in your token contract, you need to spend some ETH on fees — work that is done in the network on your behalf. faucet truffle migrate --network ropsten This command will log the , be sure to save it! Migrate uses the flag and refers to the key in the networks object in . An object for the main Ethereum network can be included like the Ropsten object. I excluded it from my truffle box code for safety reasons. See the "live" connection object in this for the contract address --network ropsten truffle.js Truffle Tutorial Main Ethereum network. Once your token contract is deployed, you can review your token balance using the MetaMask Chrome extension. In the MetaMask UI, select the Ropsten Test Network from the dropdown picker on the top left, then click the tokens tab. Click the button and input your contract address that was logged from the command. Add Token truffle migrate MetaMask can transfer token, or you can create your own contract invoking UI with Web3.js. The token contract above is exciting to see for ICO developers, but it isn’t able to do the newsworthy out of the box. Let’s make that happen. crowdsale Crowdsales Now that you have installed Truffle, used the CLI, explored Solidity, and written some test code, we can unbox an existing Truffle project — . Let’s make a new directory and pull this project directly from using the Truffle CLI. Crowdsalable Ethereum Token my Github repo mkdir crowdsalable-eth-token && cd crowdsalable-eth-tokentruffle unbox git@github.com:ajb413/crowdsalable-eth-token.git This Truffle project has a more robust implementation of an Ethereum token. The token name and symbol can be changed by the owner after the contract is already deployed. The owner can also configure and open new crowdsales at any time. The truffle box comes with a development mode UI for executing contracts on the local Ethereum client. The UI uses the 10 static wallets that the command initializes on your machine - to execute transfers, view wallet balances, and launch the exciting crowdsale. truffle develop Broadcast Crowdsale Announcements The folder contains the web UI and also an extra bit of PubNub magic. When a crowdsale is launched, the owner has the option to all of their followers with the crowdsale details, so they can begin purchasing your token. app/ text message This functionality is powered by the ClickSend API and PubNub Functions. In order to enable this realtime updating feature, you must sign up for and . You insert your , , and where noted in and . Also edit the JavaScript array of to choose who receives an SMS. PubNub ClickSend api key publish key subscribe key app.js sms-handler.js Phone Numbers excerpt from app/js/app.js excerpt from app/pubnub-functions/sms-handler.js — Deploy this to PubNub Functions! The PubNub Function event handler must be deployed in the . See for deploying function event handler code in 2 minutes. PubNub Admin Dashboard this tutorial A Development UI with Web3.js Next we run the local Ethereum client the same way we did earlier. cd crowdsalable-eth-tokennpm itruffle develop ## Truffle development blockchain and console are booted truffle(develop)> compiletruffle(develop)> migratetruffle(develop)> test Leave the truffle console running Open a new command line window Navigate to the same project directory Run the development UI with: npm run dev > crowdsalable-eth-token dev /crowdsalable-eth-token> webpack-dev-server Project is running at http://localhost:8080/ Next, open the UI in your browser and explore the key features. We can: Launch a new crowdsale Transfer token from wallet to wallet Purchase token from a crowdsale using ETH Check the balance of any wallet The nature of the development environment allows anyone to invoke functions like and , when in reality, these methods cannot be invoked by just anyone. For decorated Solidity functions, the invoker must be the owner of the contract and must sign their requests with their private key ( ). Also functions like will only be able to send token from the wallet that the private key belongs to. This will be more restrictive on the main network for the right reasons. createCrowdsale transfer onlyOwner see _rawTransaction_ function in test/integration.test.js transfer web3.eth.sendRawTransaction(...) After you have deployed your , you are able to launch a crowdsale and to all of your followers when the contract opens. Input a name, click the button, and check your phone! PubNub Function send a mass SMS Launch The configuration of the crowdsale is specified in the script in the event handler. By default, the crowdsale is open forever, starts with to sell, and a buyer receives that they pay. app/js/app.js launchCrowdsale 100,000 TOK 3 TOK per ETH Use the default wallet public keys listed at the bottom of the UI for transfers, purchases, and balance checks. Remember, on this network, the wallets each have 100 fake ETH to play with. If you’ve made it this far, you now have some command over blockchain and PubNub. To recap, we covered: What cryptocurrencies are How to build an Ethereum token that is compliant with the standard How to transfer the token and invoke contract methods How to test all of the contract code How to create a crowdsale How to broadcast an announcement to all of your followers with PubNub The true power of blockchain is yet to be realized because the technology is only recently picking up widespread interest. PubNub will stay involved. For live demonstrations of blockchain programming, check out our and page. Best of luck to you in your blockchain adventures! events Meetup"}</script><meta name="next-head-count" content="15"/><meta name="google-site-verification" content="xSsN5mRM5xbHVI00M8uekCnuJ47Da0ER2mYuGhaPM9o"/><link rel="preload" href="/fonts/HackerNoonFont/font-hackernoon.css"/><meta name="slack-app-id" content="A017MMBC29Z"/><script async="" src="https://www.googletagmanager.com/gtag/js?id=G-ECJJ2Q2SJQ"></script><script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-ECJJ2Q2SJQ'); </script><link rel="preload" href="/_next/static/css/df05ebb20b5f1597.css" as="style"/><link rel="stylesheet" href="/_next/static/css/df05ebb20b5f1597.css" data-n-g=""/><link rel="preload" href="/_next/static/css/d072011159298b64.css" as="style"/><link rel="stylesheet" href="/_next/static/css/d072011159298b64.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="https://accounts.google.com/gsi/client" defer="" data-nscript="beforeInteractive"></script><script src="/noflash.js" defer="" data-nscript="beforeInteractive"></script><script defer="" src="/_next/static/chunks/2876.ccc6b4101344acd3.js"></script><script defer="" src="/_next/static/chunks/ee759108-51af8ccea7c8c9cb.js"></script><script defer="" src="/_next/static/chunks/834.1e7c7d5fb534989d.js"></script><script defer="" src="/_next/static/chunks/5459-17af4b1e2650ddc3.js"></script><script defer="" src="/_next/static/chunks/8554.5fd0b3b20b52c3c9.js"></script><script src="/_next/static/chunks/webpack-925f5e65e6e71b17.js" defer=""></script><script src="/_next/static/chunks/framework-79bce4a3a540b080.js" defer=""></script><script src="/_next/static/chunks/main-d795fc49073f04a3.js" defer=""></script><script src="/_next/static/chunks/pages/_app-af895191cab536b8.js" defer=""></script><script src="/_next/static/chunks/29107295-4a69275373f23f88.js" defer=""></script><script src="/_next/static/chunks/75fc9c18-55217e80064ded2b.js" defer=""></script><script src="/_next/static/chunks/e4405247-b92cad2245dc32a9.js" defer=""></script><script src="/_next/static/chunks/ad7f724d-c783309ff8720dc6.js" defer=""></script><script src="/_next/static/chunks/8783-f3b27c5ae7196adb.js" defer=""></script><script src="/_next/static/chunks/6130-446e8f5ea6b9cf33.js" defer=""></script><script src="/_next/static/chunks/8764-593a836a579a1569.js" defer=""></script><script src="/_next/static/chunks/8847-3c59f9ab8a154115.js" defer=""></script><script src="/_next/static/chunks/9669-8c5935587f85d094.js" defer=""></script><script src="/_next/static/chunks/7553-106c3af9acfd5cd0.js" defer=""></script><script src="/_next/static/chunks/4804-0be234a5b629b212.js" defer=""></script><script src="/_next/static/chunks/2456-5afe200ce6aa3025.js" defer=""></script><script src="/_next/static/chunks/3253-1974b95a38599811.js" defer=""></script><script src="/_next/static/chunks/823-835d31f246f83bac.js" defer=""></script><script src="/_next/static/chunks/5935-02990bcc2cb4308e.js" defer=""></script><script src="/_next/static/chunks/4298-d54043aad13ba5d2.js" defer=""></script><script src="/_next/static/chunks/1348-7c5e254d02eaa11f.js" defer=""></script><script src="/_next/static/chunks/5518-7b061f7a77a116d1.js" defer=""></script><script src="/_next/static/chunks/9769-902d2ef3b92da4ca.js" defer=""></script><script src="/_next/static/chunks/1432-ac91a2dd2983de6a.js" defer=""></script><script src="/_next/static/chunks/2374-c64b667ba63aef2b.js" defer=""></script><script src="/_next/static/chunks/9566-229056345f690efa.js" defer=""></script><script src="/_next/static/chunks/7777-b730049dfcbd4583.js" defer=""></script><script src="/_next/static/chunks/pages/%5Bslug%5D-a405dfc060f0334c.js" defer=""></script><script src="/_next/static/xXlSxcnUdbwy3ckXHYhzq/_buildManifest.js" defer=""></script><script src="/_next/static/xXlSxcnUdbwy3ckXHYhzq/_ssgManifest.js" defer=""></script><style data-styled="" data-styled-version="5.3.11">html{line-height:1.15;-webkit-text-size-adjust:100%;}/*!sc*/ body{margin:0;}/*!sc*/ main{display:block;}/*!sc*/ h1{font-size:2em;margin:0.67em 0;}/*!sc*/ hr{box-sizing:content-box;height:0;overflow:visible;}/*!sc*/ pre{font-family:monospace,monospace;font-size:1em;}/*!sc*/ a{background-color:transparent;}/*!sc*/ abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}/*!sc*/ b,strong{font-weight:bolder;}/*!sc*/ code,kbd,samp{font-family:monospace,monospace;font-size:1em;}/*!sc*/ small{font-size:80%;}/*!sc*/ sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}/*!sc*/ sub{bottom:-0.25em;}/*!sc*/ sup{top:-0.5em;}/*!sc*/ img{border-style:none;}/*!sc*/ button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}/*!sc*/ button,input{overflow:visible;}/*!sc*/ button,select{text-transform:none;}/*!sc*/ button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button;}/*!sc*/ button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}/*!sc*/ button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText;}/*!sc*/ fieldset{padding:0.35em 0.75em 0.625em;}/*!sc*/ legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}/*!sc*/ progress{vertical-align:baseline;}/*!sc*/ textarea{overflow:auto;}/*!sc*/ [type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}/*!sc*/ [type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto;}/*!sc*/ [type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}/*!sc*/ [type="search"]::-webkit-search-decoration{-webkit-appearance:none;}/*!sc*/ ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}/*!sc*/ details{display:block;}/*!sc*/ summary{display:list-item;}/*!sc*/ template{display:none;}/*!sc*/ [hidden]{display:none;}/*!sc*/ data-styled.g1[id="sc-global-ecVvVt1"]{content:"sc-global-ecVvVt1,"}/*!sc*/ .kTjQvw{height:-webkit-max-content;height:-moz-max-content;height:max-content;padding-bottom:auto;}/*!sc*/ .kTjQvw li{display:grid;grid-template-columns:1fr;}/*!sc*/ .kTjQvw li.trendingSection{max-width:600px;}/*!sc*/ .kTjQvw li > button{color:#0f0;padding:0 22px;font-size:2rem;background-color:transparent;border:0;}/*!sc*/ data-styled.g4[id="sc-b69cf9f6-0"]{content:"kTjQvw,"}/*!sc*/ .lkKurX{height:44px;background-color:#003b00;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;font-family:'IBM Plex Mono',monospace;font-weight:bold;font-size:1.4rem;display:none;position:relative;}/*!sc*/ @media screen and (max-width:1040px){.lkKurX{font-size:1.2vw;height:auto;}}/*!sc*/ @media screen and (min-width:870px){.lkKurX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/ .lkKurX ul{list-style:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0;margin:0;}/*!sc*/ .lkKurX ul li{padding:10px 15px;}/*!sc*/ .lkKurX ul li.sponsor a{color:#f6f7f9;}/*!sc*/ .lkKurX ul li a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .lkKurX ul li:hover > .dropdownNav,.lkKurX ul li > .dropdownNav:hover{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .lkKurX a{color:#0f0;}/*!sc*/ .lkKurX a:focus{text-shadow:2px 2px 0 #0b0;}/*!sc*/ data-styled.g5[id="sc-72f8e89d-0"]{content:"lkKurX,"}/*!sc*/ .iocYRY{position:relative;height:46px;background:#f5ec43;font-family:'IBM Plex Mono',monospace;font-weight:bold;font-size:1.2rem;z-index:100;padding-left:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .iocYRY .daLink{width:100%;}/*!sc*/ @media screen and (min-width:870px){.iocYRY{font-size:1.6rem;}}/*!sc*/ .iocYRY a:not(.icon){color:#666105;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .iocYRY img{margin-right:10px;width:100px;object-fit:contain;border-radius:2px;}/*!sc*/ .iocYRY a.daLink > span{margin-right:10px !important;}/*!sc*/ .iocYRY a.daLink > span > img{border-radius:2px;}/*!sc*/ .iocYRY .icon{position:absolute;top:10px;left:6px;-webkit-transition:opacity 0.3s ease-out;transition:opacity 0.3s ease-out;opacity:0;pointer-events:none;}/*!sc*/ .iocYRY .logo img{width:180px;position:absolute;top:10px;left:6px;-webkit-transition:opacity 0.3s ease-out;transition:opacity 0.3s ease-out;opacity:0;pointer-events:none;}/*!sc*/ .iocYRY .colorPickerIcon{position:absolute;right:0;-webkit-filter:brightness(20%);filter:brightness(20%);font-size:3rem;-webkit-transition:filter 0.3s;transition:filter 0.3s;margin-right:15px;}/*!sc*/ @media screen and (max-width:1000px){.iocYRY .colorPickerIcon{display:none;}}/*!sc*/ .iocYRY .colorPickerIcon:hover{cursor:pointer;}/*!sc*/ data-styled.g7[id="sc-507e8eeb-0"]{content:"iocYRY,"}/*!sc*/ .byYhvg{height:45px;background-color:#fff;display:none;z-index:99;box-shadow:0 0 15px rgba(0,0,0,0.15);font-family:"IBM Plex Mono",monospace;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all 200ms ease-in-out;transition:all 200ms ease-in-out;opacity:0;pointer-events:none;}/*!sc*/ .byYhvg .copyToClipboard{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:10px;margin:0 auto;}/*!sc*/ .byYhvg .copyToClipboard:hover{cursor:pointer;}/*!sc*/ .byYhvg.hide{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);opacity:1;pointer-events:initial;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .byYhvg .icon{height:24px;margin-right:10px;}/*!sc*/ .byYhvg a.profile{padding:0;background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,0.35) calc(50% - 9px), rgba(0,255,0,0.35) 100% );-webkit-transition:background-position 120ms ease-in-out,padding 120ms ease-in-out;transition:background-position 120ms ease-in-out,padding 120ms ease-in-out;background-size:100% 200%;background-position:0 0;word-break:break-word;margin-left:10px;margin-right:1rem;}/*!sc*/ .byYhvg .profile-img{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .byYhvg .profile-img img{border-radius:50%;cursor:pointer;}/*!sc*/ @media screen and (min-width:640px){.byYhvg .profile-img{display:none;}}/*!sc*/ .byYhvg a.profile:hover{background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,1) calc(50% - 9px), rgba(0,255,0,1) 100% );background-position:0 100%;}/*!sc*/ .byYhvg .icon img{height:24px;}/*!sc*/ .byYhvg .title{padding-left:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;overflow:hidden;font-size:16px;font-weight:bold;}/*!sc*/ .byYhvg .title,.byYhvg .title a{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}/*!sc*/ .byYhvg .st-last{display:inline-block !important;}/*!sc*/ .byYhvg a.next{font-size:16px;border:2px solid #ccc;padding:1px 10px;}/*!sc*/ .byYhvg .sharing{position:relative;padding-right:20px;white-space:nowrap;overflow:hidden;height:45px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .byYhvg .sharing .audio-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:35px;min-height:35px;background:#000;border-radius:50%;border:none;outline:none;color:#10ff00;border:2px solid;cursor:pointer;font-size:15px;padding:0px;}/*!sc*/ .byYhvg .sharing .audio-btn svg{height:18px;width:18px;}/*!sc*/ .byYhvg .sharing .audio-btn:hover{background:#0c3c00;}/*!sc*/ .byYhvg .sharing .st-inline-share-buttons{display:-webkit-box !important;display:-webkit-flex !important;display:-ms-flexbox !important;display:flex !important;height:45px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .byYhvg .sharing .st-btn{background-color:transparent !important;background-size:contain;background-repeat:no-repeat;background-position:center;height:20px !important;width:20px;margin:0 0 0 4px;padding:0 !important;border-radius:0 !important;}/*!sc*/ .byYhvg .sharing .st-total{margin-right:7px;}/*!sc*/ .byYhvg .sharing .st-btn[data-network="twitter"]{background-image:url(https://hackernoon.imgix.net/social-icons/twitter-new.png) !important;-webkit-transform:translateX(2px);-ms-transform:translateX(2px);transform:translateX(2px);}/*!sc*/ .byYhvg .sharing .st-btn[data-network="facebook"]{display:none !important;}/*!sc*/ @media screen and (min-width:640px){.byYhvg .sharing .st-btn[data-network="facebook"]{background-image:url(https://hackernoon.imgix.net/social-icons/facebook-new.png) !important;display:block !important;}}/*!sc*/ .byYhvg .sharing .st-btn[data-network="linkedin"]{background-image:url(https://hackernoon.imgix.net/social-icons/linkedin-new.png) !important;}/*!sc*/ .byYhvg .sharing .st-btn[data-network="email"]{background-image:url(https://hackernoon.imgix.net/social-icons/email-new.png) !important;-webkit-transform:translateY(3px);-ms-transform:translateY(3px);transform:translateY(3px);}/*!sc*/ .byYhvg .sharing .st-btn img{display:none !important;}/*!sc*/ .byYhvg .st-btn:hover{opacity:1 !important;top:0 !important;}/*!sc*/ @media screen and (max-width:640px){.byYhvg .title,.byYhvg .sharing{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;}.byYhvg .profile{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.byYhvg .sharing{padding-right:10px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}.byYhvg .story-title{display:none;}}/*!sc*/ data-styled.g8[id="sc-9de06f04-0"]{content:"byYhvg,"}/*!sc*/ .bfEqpI{display:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);height:100vh;position:absolute;top:0;right:0;-webkit-transition:-webkit-transform 0.2s ease-in-out;-webkit-transition:transform 0.2s ease-in-out;transition:transform 0.2s ease-in-out;width:100vw;font-family:'IBM Plex Mono',monospace;}/*!sc*/ @media (max-width:869px){.bfEqpI{width:100%;}}/*!sc*/ .bfEqpI .mobile-header-left{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bfEqpI .hackernoon-logo{background:#0f0;padding:3px;border-radius:5px;width:30px;height:30px;margin:0 1rem;}/*!sc*/ .bfEqpI .close-nav-img{background:#0f0;padding:2px;border-radius:50%;width:30px;height:30px;margin-left:2rem;}/*!sc*/ .bfEqpI .mobile-header{background:black;color:white;padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .bfEqpI .mobile-header a{color:#0f0;}/*!sc*/ .bfEqpI .mobile-header .mobile-auth{border:1px solid white;padding:2px 5px;color:white;font-size:1.4rem;border-radius:3px;}/*!sc*/ data-styled.g11[id="sc-16ad823d-0"]{content:"bfEqpI,"}/*!sc*/ .kcgCcU{font-weight:bold;font-size:1.4rem;touch-action:auto;overflow-y:scroll;}/*!sc*/ .kcgCcU button{cursor:pointer;}/*!sc*/ .kcgCcU .tab-close-img{margin-top:0.5rem;background:gold;padding:2px;border-radius:50%;width:15px;height:15px;margin-left:1rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}/*!sc*/ .kcgCcU .tab-open-img{margin-top:1rem;background:rgba(255,255,255,0.2);padding:2px;border-radius:50%;width:15px;height:15px;margin-left:1rem;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}/*!sc*/ .kcgCcU .external-link-img{background:rgba(255,255,255,0.9);padding:2px;border-radius:5px;width:15px;height:15px;margin-left:1rem;}/*!sc*/ .kcgCcU button{border:0;background:transparent;color:white;font-weight:bold;}/*!sc*/ .kcgCcU .mobile-main{background:rgba(0,0,0,1);padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:80vh;overflow:scroll;-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;}/*!sc*/ .kcgCcU .mobile-main::-webkit-scrollbar{display:none;}/*!sc*/ .kcgCcU .main-wrapper{background:#212428;padding:1rem;border-radius:1rem;}/*!sc*/ .kcgCcU .main-wrapper .main-link{color:#0f0;-webkit-text-decoration:none;text-decoration:none;font-size:1.7rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .kcgCcU .sub-wrapper{margin-left:1rem;color:white;}/*!sc*/ .kcgCcU .sub-wrapper .sub-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .kcgCcU .sub-wrapper .sub-title-active{color:gold;}/*!sc*/ .kcgCcU .sub-wrapper .sub-open-button{color:#0b0;}/*!sc*/ .kcgCcU .sub-wrapper .sub-link{padding-top:1rem;cursor:pointer;}/*!sc*/ .kcgCcU .sub-wrapper .sub-link a,.kcgCcU .sub-wrapper .sub-link span{color:#FFFFFF;-webkit-text-decoration:none;text-decoration:none;font-size:1.7rem;}/*!sc*/ .kcgCcU .sub-wrapper .sub-link-active{margin-top:1rem;}/*!sc*/ .kcgCcU .sub-wrapper .sub-link-active a,.kcgCcU .sub-wrapper .sub-link-active span{color:gold;-webkit-text-decoration:none;text-decoration:none;font-size:1.7rem;}/*!sc*/ .kcgCcU .link-wrapper{color:white;max-height:200px;overflow:scroll;border-radius:0.5rem;margin:1rem 0;background:rgba(0,0,0,0.2);-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;}/*!sc*/ .kcgCcU .link-wrapper::-webkit-scrollbar{display:none;}/*!sc*/ .kcgCcU .link-wrapper ul{list-style:none;padding:0px;margin:0px;}/*!sc*/ .kcgCcU .link-wrapper ul span{min-width:200px;margin-top:0.5rem;}/*!sc*/ .kcgCcU .link-wrapper .subsub-link{color:rgba(255,255,255,0.7);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:100px;padding:0.5rem 0.5rem 0.2rem 1rem;border-bottom:1px solid rgba(255,255,255,0.1);}/*!sc*/ .kcgCcU .link-wrapper .subsub-link:hover{color:white;}/*!sc*/ @media screen and (min-width:870px){.kcgCcU{display:none;}}/*!sc*/ data-styled.g12[id="sc-16ad823d-1"]{content:"kcgCcU,"}/*!sc*/ .ihbTZc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:60px;height:60px;background:transparent;border:none;cursor:pointer;padding:0;z-index:10;font-size:3rem;}/*!sc*/ .ihbTZc i{color:#003b00;z-index:1;}/*!sc*/ data-styled.g13[id="sc-14b24a79-0"]{content:"ihbTZc,"}/*!sc*/ .jSiCMG{z-index:101;}/*!sc*/ @media screen and (min-width:870px){.jSiCMG{display:none;}}/*!sc*/ data-styled.g14[id="sc-dd1bca92-0"]{content:"jSiCMG,"}/*!sc*/ .jECpNX{background-color:transparent;color:#212428;border:2px solid #212428;border-radius:2px;font-size:1.6rem;font-weight:600;padding:0.6rem 1.2rem;display:inline-block;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:relative;outline:none;line-height:1.3;}/*!sc*/ .jECpNX svg,.jECpNX i{font-size:1.6rem;}/*!sc*/ .jECpNX svg + span,.jECpNX i + span{margin-left:5px;margin-top:0;}/*!sc*/ .jECpNX:hover{background-color:#62ff86;}/*!sc*/ .jECpNX:active{background-color:#0f0;border-color:#212428;color:#212428;}/*!sc*/ .jECpNX:active,.jECpNX:focus{outline:none;}/*!sc*/ .jECpNX[disabled]{opacity:0.75;cursor:not-allowed;background-color:transparent;}/*!sc*/ .jECpNX[disabled]:hover{box-shadow:none;}/*!sc*/ .jECpNX.email-preview-button{border-radius:0;color:#0f0;min-width:151px;cursor:pointer;border:4px solid #d5d5d5;}/*!sc*/ .jECpNX.newsletter-form-button{color:#0f0;background-color:#212428;margin-bottom:0;margin-top:10px;border:4px solid #d5d5d5;cursor:pointer;min-width:151px;height:38px;font-size:16px;line-height:21px;font-weight:normal;border-radius:0;margin:0 2.5px;}/*!sc*/ @media (min-width:576px){.jECpNX.newsletter-form-button{margin-top:0;}}/*!sc*/ .jECpNX.newsletter-form-button:hover{background-color:#3c3c3b;}/*!sc*/ data-styled.g15[id="sc-b3d23cc4-0"]{content:"jECpNX,"}/*!sc*/ .hslCzy{margin-right:0;width:40px;height:40px;background:rgba(0,128,0,0.2);padding:0.5rem;border-radius:50%;cursor:pointer;}/*!sc*/ .hslCzy:hover{opacity:0.8;}/*!sc*/ data-styled.g19[id="sc-4d156c87-0"]{content:"hslCzy,"}/*!sc*/ .izlxCY{position:fixed;border:3px solid;top:105px;max-height:500px;right:0;width:100vw;background-color:#212428;-webkit-transition:1s;transition:1s;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;visibility:hidden;}/*!sc*/ .izlxCY .content{overflow:auto;height:100%;}/*!sc*/ .izlxCY .header{color:#fff;margin:0.5em 1em;padding:0 1em;border-left:4px solid orange;}/*!sc*/ .izlxCY .more{background-color:#f5ec43;padding:0,75em;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:left;-webkit-justify-content:left;-ms-flex-pack:left;justify-content:left;padding-left:1em;width:calc(100% - 60px);cursor:pointer;}/*!sc*/ .izlxCY .more :hover{background:#c9c9c9;-webkit-transition:0.5s all;transition:0.5s all;}/*!sc*/ data-styled.g20[id="sc-4d156c87-1"]{content:"izlxCY,"}/*!sc*/ .eTNptX{position:-webkit-sticky;position:sticky;top:0;z-index:5;-webkit-transition:-webkit-transform 200ms ease-in-out;-webkit-transition:transform 200ms ease-in-out;transition:transform 200ms ease-in-out;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}/*!sc*/ @media screen and (min-width:870px){.eTNptX{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}/*!sc*/ .eTNptX .algolia{max-height:50px;padding:15px;float:right;}/*!sc*/ .eTNptX .mainNav{background-color:#0f0;-webkit-transition:background-color 200ms ease;transition:background-color 200ms ease;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .eTNptX .mainNav .logo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:10px;z-index:1;margin-left:2rem;}/*!sc*/ .eTNptX .mainNav .logo img{image-rendering:pixelated;}/*!sc*/ .eTNptX .mainNav .ukraineHeader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ @media screen and (max-width:870px){.eTNptX .mainNav .ukraineHeader{display:none;}}/*!sc*/ .eTNptX .mainNav .ukraineHeader h2{font-size:24px;color:black;font-weight:normal;font-family:"HackerNoon";margin:0;padding:0;}/*!sc*/ .eTNptX .mainNav .ukraineHeader img{width:40px;height:40px;}/*!sc*/ .eTNptX .mainNav . .logo + form + div,.eTNptX .mainNav > .profile,.eTNptX .mainNav > .cta-button{display:none;margin-right:1rem;}/*!sc*/ @media screen and (min-width:870px){.eTNptX .mainNav . .logo + form + div,.eTNptX .mainNav > .profile,.eTNptX .mainNav > .cta-button{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/ .eTNptX .mainNav .left-portion{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:1rem;}/*!sc*/ @media screen and (min-width:1024px){.eTNptX .mainNav .left-portion{min-width:335px;}}/*!sc*/ .eTNptX .mainNav .right-portion{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ @media screen and (min-width:1024px){.eTNptX .mainNav .right-portion{min-width:335px;}}/*!sc*/ .eTNptX .mainNav .search-container{color:black;position:relative;margin-right:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/ .eTNptX .mainNav .search-container .search-stories{background:black;color:#c1cad4;border-radius:1rem;}/*!sc*/ .eTNptX .mainNav .search-container .search-tags{background:black;color:#c1cad4;border-radius:1rem;margin-top:2rem;}/*!sc*/ .eTNptX .mainNav .search-container .search-tags .search-tags-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 1rem 2rem 1rem;font-family:"IBM Plex Mono",monospace;}/*!sc*/ .eTNptX .mainNav .search-container .search-tags .search-tags-wrapper div{padding:0.3rem 0.8rem;margin:1rem 1rem 0 0;border:1px solid #c1cad4;border-radius:0.5rem;cursor:pointer;-webkit-transition:-webkit-transform 0.3s ease;-webkit-transition:transform 0.3s ease;transition:transform 0.3s ease;}/*!sc*/ .eTNptX .mainNav .search-container .search-tags .search-tags-wrapper div a{color:#c1cad4;font-size:1.5rem;}/*!sc*/ .eTNptX .mainNav .search-container .search-tags .search-tags-wrapper div:hover{-webkit-transform:scale(1.01);-ms-transform:scale(1.01);transform:scale(1.01);color:white;border:1px solid white;}/*!sc*/ .eTNptX .mainNav .search-container .search-tags .search-tags-wrapper div:hover a{color:white;}/*!sc*/ .eTNptX .mainNav .search-container .search-people{background:black;color:#c1cad4;border-radius:1rem;margin-top:2rem;}/*!sc*/ .eTNptX .mainNav .search-container .search-people .people-wrapper{padding-bottom:2rem;font-family:"IBM Plex Mono",monospace;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;margin-left:2rem;}/*!sc*/ .eTNptX .mainNav .search-container .search-people .people-card{color:#c1cad4;-webkit-transition:-webkit-transform 0.3s ease;-webkit-transition:transform 0.3s ease;transition:transform 0.3s ease;}/*!sc*/ .eTNptX .mainNav .search-container .search-people .people-card strong{word-break:break-all;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;}/*!sc*/ .eTNptX .mainNav .search-container .search-people .people-card:hover{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05);color:white;}/*!sc*/ .eTNptX .mainNav .search-container .search-people .people-card img{min-width:60px;min-height:60px;border-radius:1rem;}/*!sc*/ .eTNptX .mainNav .search-companies{background:black;color:#c1cad4;border-radius:1rem;margin-top:2rem;}/*!sc*/ .eTNptX .mainNav .search-companies .companies-wrapper{padding-bottom:2rem;font-family:"IBM Plex Mono",monospace;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;margin-left:2rem;}/*!sc*/ .eTNptX .mainNav .search-companies .company-card{color:#c1cad4;-webkit-transition:-webkit-transform 0.3s ease;-webkit-transition:transform 0.3s ease;transition:transform 0.3s ease;}/*!sc*/ .eTNptX .mainNav .search-companies .company-card strong{word-break:break-all;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;margin-top:auto;}/*!sc*/ .eTNptX .mainNav .search-companies .company-card:hover{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05);color:white;}/*!sc*/ .eTNptX .mainNav .search-companies .company-card img{min-width:60px;min-height:60px;border:1px solid white;border-radius:50%;}/*!sc*/ .eTNptX .search-coins{background:black;color:#c1cad4;border-radius:1rem;margin-top:2rem;}/*!sc*/ .eTNptX .search-coins .coins-wrapper{padding-bottom:2rem;font-family:"IBM Plex Mono",monospace;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:space-around;-webkit-jusitfy-content:space-around;-ms-flex-pack:space-around;jusitfy-content:space-around;margin-left:2rem;}/*!sc*/ .eTNptX .search-coins .coin-card{color:#c1cad4;-webkit-transition:-webkit-transform 0.3s ease;-webkit-transition:transform 0.3s ease;transition:transform 0.3s ease;min-width:75px;}/*!sc*/ .eTNptX .search-coins .coin-card strong{max-width:75px;word-break:break-all;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;margin-top:1rem;font-size:1.3rem;font-weight:bold;}/*!sc*/ .eTNptX .search-coins .coin-card:hover{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05);color:white;}/*!sc*/ .eTNptX .search-coins .coin-card img{min-width:60px;min-height:60px;border:1px solid white;border-radius:50%;}/*!sc*/ .eTNptX .input-holder{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;outline:none;}/*!sc*/ .eTNptX .ais-SearchBox-input{background:#212428;border:none;padding:10px 20px 10px 10px;border-radius:2px;font-size:1.6rem;font-weight:bold;-webkit-transition:all 120ms ease-in-out;transition:all 120ms ease-in-out;color:white;outline:none;}/*!sc*/ @media screen and (max-width:400px){.eTNptX .ais-SearchBox-input{max-width:50vw;}}/*!sc*/ @media screen and (max-width:350px){.eTNptX .ais-SearchBox-input{max-width:40vw;}}/*!sc*/ .eTNptX .ais-SearchBox-input::placeholder{color:lightGray;}/*!sc*/ @media screen and (max-width:400px){.eTNptX .ais-SearchBox-input::-webkit-input-placeholder{font-size:4vw;}.eTNptX .ais-SearchBox-input::-moz-placeholder{font-size:4vw;}.eTNptX .ais-SearchBox-input:-ms-input-placeholder{font-size:4vw;}.eTNptX .ais-SearchBox-input::placeholder{font-size:4vw;}}/*!sc*/ .eTNptX .ais-SearchBox-form button{display:none;}/*!sc*/ .eTNptX.active input{width:100%;}/*!sc*/ @media screen and (min-width:870px){.eTNptX.active input{max-width:100px;}}/*!sc*/ .eTNptX img.search{position:absolute;top:50%;right:20px;width:19px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);cursor:pointer;-webkit-filter:grayscale(1);filter:grayscale(1);}/*!sc*/ .eTNptX img.result{object-fit:cover;background-color:transparent !important;width:10px;height:10px;cursor:pointer;}/*!sc*/ .eTNptX .avatar{width:50px;height:50px;padding:0px;}/*!sc*/ .eTNptX > a:not(.logo):not(.cta-button):not(.profile){padding:0 10px;color:#003b00;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .eTNptX .profile .profileImage{max-height:40px;display:block;box-shadow:0 0.15em , 0 -0.15em , 0.15em 0 , -0.15em 0;}/*!sc*/ .eTNptX .profile .profileImage:hover,.eTNptX .profile .profileImage:focus{box-shadow:0 0.15em , 0 -0.15em , 0.15em 0 , -0.15em 0;}/*!sc*/ .eTNptX .profile .profileImage:span{overflow:visible !important;}/*!sc*/ .eTNptX .profile .profileImage:span img{border-radius:var(--m);box-shadow:0 4px 16px 0 rgba(0,0,0,0.15);}/*!sc*/ .eTNptX > a > img{max-height:40px;}/*!sc*/ .eTNptX .desktop{display:none;max-height:40px;}/*!sc*/ .eTNptX .mobile{max-height:40px;}/*!sc*/ @media screen and (min-width:870px){.eTNptX .desktop{display:block;}.eTNptX .mobile{display:none;}}/*!sc*/ .eTNptX .react-loading-skeleton{position:relative;top:-7px;}/*!sc*/ data-styled.g22[id="sc-eeb22f6c-0"]{content:"eTNptX,"}/*!sc*/ .cOdmIY{margin-left:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .cOdmIY .auth-button{font-family:'IBM Plex Mono',monospace;color:#212428 !important;background:#0f0 !important;border-color:#003b00 !important;}/*!sc*/ .cOdmIY .auth-button:hover{background:#003b00 !important;color:#e1fbcf !important;}/*!sc*/ @media screen and (max-width:700px){.cOdmIY{display:none;}}/*!sc*/ .cOdmIY > *{margin-left:10px;}/*!sc*/ data-styled.g23[id="sc-eeb22f6c-1"]{content:"cOdmIY,"}/*!sc*/ .kdGQZh{display:grid;max-width:1200px;width:100%;margin:1.5rem auto 4.5rem;grid-gap:3rem 2.5rem;grid-template-columns:minmax(0,1fr);padding:0 1rem;word-break:break-word;margin-bottom:0px;}/*!sc*/ .kdGQZh > h1{margin-bottom:0;margin-top:0;grid-column:1 / -1;}/*!sc*/ @media screen and (min-width:768px){.kdGQZh > h1{text-align:center;}}/*!sc*/ .kdGQZh section > h2,.kdGQZh section > h3,.kdGQZh section > h4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;grid-column:1 / -1;font-weight:900;font-size:24px;text-transform:uppercase;}/*!sc*/ .kdGQZh section > h2:before,.kdGQZh section > h3:before,.kdGQZh section > h4:before,.kdGQZh section > h2:after,.kdGQZh section > h3:after,.kdGQZh section > h4:after{content:"";-webkit-flex:1;-ms-flex:1;flex:1;border-bottom:3px solid #3c3c3b;}/*!sc*/ .kdGQZh section > h2:before,.kdGQZh section > h3:before,.kdGQZh section > h4:before{margin-right:30px;}/*!sc*/ .kdGQZh section > h2:after,.kdGQZh section > h3:after,.kdGQZh section > h4:after{margin-left:30px;}/*!sc*/ .kdGQZh .image-credit span,.kdGQZh .image-credit a{font-size:1.2rem;}/*!sc*/ .kdGQZh .image-credit a{font-weight:bold;color:gray;}/*!sc*/ .kdGQZh .image-credit a:hover{color:#138A36;}/*!sc*/ @media screen and (max-width:320px){.kdGQZh{margin:0;}}/*!sc*/ @media screen and (max-width:767px){.kdGQZh .markdown-editor{max-width:95vw;}}/*!sc*/ @media screen and (min-width:950px){.kdGQZh{grid-template-columns:1fr 8fr 1fr;grid-gap:2.5rem 25px;margin-top:25px;}.kdGQZh .markdown-editor{max-width:800px;}.kdGQZh > *{grid-column:2 / -2;}}/*!sc*/ .kdGQZh > pre{overflow-x:scroll;max-width:100%;overflow:hidden;}/*!sc*/ .kdGQZh .annot{background-color:#FFFF00;color:#212428;-webkit-transition:background-color .3s;transition:background-color .3s;}/*!sc*/ .kdGQZh .annot:hover{background-color:#FFFF99;cursor:pointer;}/*!sc*/ .kdGQZh pre code,.kdGQZh .ql-syntax{white-space:pre;overflow-x:scroll;width:904px;display:block;}/*!sc*/ @media screen and (max-width:1000px){.kdGQZh pre code,.kdGQZh .ql-syntax{max-width:95vw;}}/*!sc*/ .kdGQZh .previewWarning,.kdGQZh .previewWarning > a{color:#a09a00;text-align:center;margin-bottom:10px;}/*!sc*/ .kdGQZh ul,.kdGQZh ol{padding-left:20px;margin:0;word-break:break-word;}/*!sc*/ .kdGQZh ol ol{list-style:lower-alpha;}/*!sc*/ .kdGQZh ol ol ol{list-style:lower-roman;}/*!sc*/ .kdGQZh .edit-story{text-align:center;margin:-40px 0 0 0;}/*!sc*/ .kdGQZh > figure{margin:0 auto;}/*!sc*/ .kdGQZh > figure > figcaption{font-size:1rem;}/*!sc*/ .kdGQZh figure,.kdGQZh .image-container{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;justify-self:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;max-width:90vw;}/*!sc*/ .kdGQZh figure img,.kdGQZh .image-container img{cursor:pointer;max-width:90vw;}/*!sc*/ .kdGQZh figure span,.kdGQZh .image-container span{position:initial !important;}/*!sc*/ .kdGQZh figure.feat,.kdGQZh .image-container.feat{grid-column:1 / -1;min-width:100%;border-radius:5px;background-color:rgb(197 174 144 / 70%);}/*!sc*/ @media screen and (min-width:768px){.kdGQZh figure.feat .react-loading-skeleton,.kdGQZh .image-container.feat .react-loading-skeleton{height:450px !important;}}/*!sc*/ .kdGQZh .left-50,.kdGQZh .right-50{width:50%;margin-bottom:1em;clear:initial;}/*!sc*/ .kdGQZh .left-50{float:left;margin-right:2em;}/*!sc*/ .kdGQZh .right-50{float:right;margin-left:2em;}/*!sc*/ .kdGQZh .image-caption{line-height:0;display:block;margin:0;border:0px;display:block;font-size:13px;font-style:italic;font-weight:normal;color:rgb(78,92,110);padding:2px 0px;line-height:16px;text-align:center;min-height:1em;outline:none;background:none;resize:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;cursor:text;}/*!sc*/ .kdGQZh .youtube-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0;}/*!sc*/ .kdGQZh .youtube-container iframe{position:absolute;top:0;left:0;width:100%;height:100%;}/*!sc*/ .kdGQZh .embed-hn-story{box-shadow:#b9ffb9 0px 0.2em,#b9ffb9 0px -0.2em,#b9ffb9 0.2em 0px,#b9ffb9 -0.2em 0px,#0f0 0.2em 0.4em,#0f0 0.4em 0.2em,#005e00 0.4em 0.6em,#005e00 0.6em 0.4em;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 auto;max-width:450px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/ .kdGQZh .embed-hn-story .card-image-container img{height:100%;width:100%;object-fit:contain;}/*!sc*/ .kdGQZh .embed-hn-story .card-info h4{margin:0 5px;}/*!sc*/ .kdGQZh .embed-hn-story .card-info span{display:-webkit-box;font-size:13px;margin:5px;height:2.6em;max-height:2.6em;margin-top:0.32333em;line-height:1.3em;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;}/*!sc*/ .kdGQZh .codepen-container,.kdGQZh .codesandbox-container{grid-column:1 / -1;}/*!sc*/ .kdGQZh .codepen-container iframe,.kdGQZh .codesandbox-container iframe{border:none;border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,0.1);width:100%;height:500px;}/*!sc*/ .kdGQZh > blockquote{font-size:2rem;word-break:break-word;font-style:italic;margin-left:0;margin-right:0;padding:2rem 0;text-align:left;}/*!sc*/ @media screen and (min-width:768px){.kdGQZh > blockquote{font-size:2.5rem;}}/*!sc*/ .kdGQZh .paragraph{min-width:0;margin:0 0 25px 0;word-wrap:break-word;}/*!sc*/ .kdGQZh .line-space{margin:0 !important;}/*!sc*/ .kdGQZh h2{font-size:1.5em;}/*!sc*/ .kdGQZh .reactions{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:6px;}/*!sc*/ .kdGQZh .paragraph a,.kdGQZh .slogging a,.kdGQZh blockquote a,.kdGQZh p a,.kdGQZh .h2 a,.kdGQZh .h3 a,.kdGQZh .h4 a,.kdGQZh ul li a,.kdGQZh ol li a,.kdGQZh h1 a,.kdGQZh h2 a,.kdGQZh h3 a{color:black;padding:2px 0 1px 0;background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,0.35) calc(50% - 9px), rgba(0,255,0,0.35) 100% );-webkit-transition:background-position 120ms ease-in-out,padding 120ms ease-in-out;transition:background-position 120ms ease-in-out,padding 120ms ease-in-out;background-size:100% 200%;background-position:0 0;word-break:break-word;}/*!sc*/ .kdGQZh .paragraph a:hover,.kdGQZh .slogging a:hover,.kdGQZh blockquote a:hover,.kdGQZh p a:hover,.kdGQZh .h2 a:hover,.kdGQZh .h3 a:hover,.kdGQZh .h4 a:hover,.kdGQZh ul li a:hover,.kdGQZh ol li a:hover,.kdGQZh h1 a:hover,.kdGQZh h2 a:hover,.kdGQZh h3 a:hover{background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,1) calc(50% - 9px), rgba(0,255,0,1) 100% );background-position:0 100%;}/*!sc*/ .kdGQZh .paragraph a:focus,.kdGQZh .slogging a:focus,.kdGQZh blockquote a:focus,.kdGQZh p a:focus,.kdGQZh .h2 a:focus,.kdGQZh .h3 a:focus,.kdGQZh .h4 a:focus,.kdGQZh ul li a:focus,.kdGQZh ol li a:focus,.kdGQZh h1 a:focus,.kdGQZh h2 a:focus,.kdGQZh h3 a:focus{text-shadow:1px 1px 0 #0b0;}/*!sc*/ .kdGQZh tr,.kdGQZh th,.kdGQZh td{border:1px solid;border-collapse:collapse;}/*!sc*/ .kdGQZh th{width:300px;}/*!sc*/ .kdGQZh table{border-spacing:0;}/*!sc*/ .kdGQZh .tags{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ .kdGQZh .skeleton.meta{grid-column:1 / -1;display:grid;grid-template-columns:auto 1fr;}/*!sc*/ .kdGQZh .skeleton.meta > div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .kdGQZh .skeleton.meta > div:first-child{justify-self:start;}/*!sc*/ .kdGQZh .skeleton.meta > div:last-child{justify-self:end;}/*!sc*/ .kdGQZh footer .share{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:20px;font-size:1.6rem;}/*!sc*/ .kdGQZh footer ~ section h4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;font-size:3rem;}/*!sc*/ .kdGQZh footer ~ section h4:before,.kdGQZh footer ~ section h4:after{content:"";-webkit-flex:1;-ms-flex:1;flex:1;border-bottom:2px solid #c2cad6;}/*!sc*/ .kdGQZh footer ~ section h4:before{margin-right:0.5em;}/*!sc*/ .kdGQZh footer ~ section h4:after{margin-left:0.5em;}/*!sc*/ .kdGQZh .twitter-tweet{margin:0 auto;}/*!sc*/ .kdGQZh .slack .mr-3 img{border-radius:6px;}/*!sc*/ .kdGQZh .notice{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;background:#F5BE31;color:#212428;border-radius:4px;padding:8px 16px;margin:8px 0;}/*!sc*/ .kdGQZh .notice a{color:#212428;}/*!sc*/ .kdGQZh .notice a:not(.heading-name){-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/ .kdGQZh .notice .content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:0;}/*!sc*/ .kdGQZh .notice .icon{width:24px;height:24px;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;margin-right:4px;position:relative;top:1px;}/*!sc*/ .kdGQZh .notice-warning{background:#FF5C80;color:white;}/*!sc*/ .kdGQZh .notice-warning a{color:white;}/*!sc*/ .kdGQZh .notice-tip{background:#62ff86;color:black !important;}/*!sc*/ .kdGQZh .notice-tip a{color:black !important;}/*!sc*/ .kdGQZh blockquote{margin:0;padding-left:1.5em;font-style:italic;overflow:hidden;position:relative;color:#aaa;}/*!sc*/ .kdGQZh blockquote:before{content:"";display:inline-block;width:10px;border-radius:1px;position:absolute;margin-left:-1.5em;top:0;bottom:0;background:#0f0;}/*!sc*/ .kdGQZh p{margin:0 0 0 0;}/*!sc*/ data-styled.g45[id="sc-d7dc08c8-0"]{content:"kdGQZh,"}/*!sc*/ .eROqxA{font-size:1.4rem;-webkit-transition:color 200ms ease;transition:color 200ms ease;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;grid-column:1 / -1 !important;}/*!sc*/ .eROqxA .story-topLine{display:-webkit-box;display:-webkit-felx;display:-ms-felxbox;display:felx;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .eROqxA .story-topLine .story-stats,.eROqxA .story-topLine .story-admin{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .eROqxA .story-topLine .story-admin a{margin-right:1rem;}/*!sc*/ .eROqxA .story-topLine span{display:block;}/*!sc*/ .eROqxA .story-title{font-size:2.5em;margin:1rem 0;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .story-title{font-size:2.5rem;}}/*!sc*/ .eROqxA .title-bottom{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-jusitfy-content:space-between;-ms-flex-pack:justify;jusitfy-content:space-between;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .title-bottom{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}/*!sc*/ .eROqxA .title-bottom div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .title-bottom div{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}}/*!sc*/ .eROqxA .title-bottom .title-bottom-left{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ .eROqxA .title-bottom .title-bottom-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:auto;}/*!sc*/ .eROqxA .title-bottom .title-bottom-right span{margin-right:1rem;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .title-bottom .title-bottom-right{display:none;}}/*!sc*/ .eROqxA .header-handle{padding:4px 0;font-size:1.8rem;cursor:pointer;color:gray;}/*!sc*/ .eROqxA .header-handle a{font-weight:bold;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .header-handle{font-size:1.2rem;}}/*!sc*/ .eROqxA .profile-tooltip{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:1rem 0px;}/*!sc*/ .eROqxA .profile-tooltip .__react_component_tooltip{pointer-events:auto !important;cursor:pointer;}/*!sc*/ .eROqxA .profile-tooltip .profile-tooltip-image{width:50px;height:50px;position:relative;box-shadow:0 0.2em #c2cad6,0 -0.2em #c2cad6, 0.2em 0 #c2cad6,-0.2em 0 #c2cad6;}/*!sc*/ .eROqxA .profile-tooltip .profile-tooltip-top{margin-right:auto;}/*!sc*/ .eROqxA .profile-tooltip .profile-tooltip-details{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-left:1rem;}/*!sc*/ .eROqxA .profile-tooltip .profile-tooltip-details h2{margin:0;font-size:1.8rem;width:100%;color:#0f0;}/*!sc*/ .eROqxA .profile-tooltip .profile-tooltip-details h3{margin:0;font-size:1.2rem;width:100%;color:#0f0;}/*!sc*/ .eROqxA .profile-tooltip p{margin-top:5px;max-width:200px;}/*!sc*/ .eROqxA .divider-bullet{height:4px;width:4px;border-radius:50%;background:gray;margin:0 1.5rem;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .divider-bullet{height:2px;width:2px;}}/*!sc*/ .eROqxA .divider-line{border-top:1px solid rgba(0,0,0,0.1);margin:1rem 0 2rem 0;}/*!sc*/ .eROqxA .reading-time,.eROqxA .published-date{font-size:1.8rem;color:gray;}/*!sc*/ @media screen and (max-width:640px){.eROqxA .reading-time,.eROqxA .published-date{font-size:1.2rem;}}/*!sc*/ .eROqxA .tldr-langs{display:-webkit-box;display:-webkit-felx;display:-ms-felxbox;display:felx;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;text-align:center;}/*!sc*/ .eROqxA .tldr-content h2{margin:1rem 0 0 0;}/*!sc*/ .eROqxA .tldr-no-show{height:0;width:0;overflow:hidden;}/*!sc*/ .eROqxA .mentions-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .eROqxA .mentions-container .mentions-box{background:whitesmoke;padding:1rem;border-radius:1rem;margin-top:1rem;margin-right:1rem;}/*!sc*/ .eROqxA .mentions-container h3{font-size:1.5rem;margin:0px;color:gray;font-weight:500;}/*!sc*/ .eROqxA .mentions-container .mentions-img-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:1rem;}/*!sc*/ .eROqxA .metaContainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;row-gap:10px;}/*!sc*/ .eROqxA .metaContainer:first-child a{border-radius:5px;-webkit-align-self:baseline;-ms-flex-item-align:baseline;align-self:baseline;}/*!sc*/ .eROqxA .metaContainer:last-child{gap:15px;}/*!sc*/ .eROqxA .viewMoreBtn{border:0;padding:10px;background-color:#073b00;color:#fff;border-radius:5px;cursor:pointer;}/*!sc*/ .eROqxA .viewMoreBtn .arrowIcon{margin-left:30px;-webkit-transition:1s;transition:1s;}/*!sc*/ .eROqxA .viewMoreBtn:hover .arrowIcon{-webkit-transform:rotate(365deg);-ms-transform:rotate(365deg);transform:rotate(365deg);}/*!sc*/ .eROqxA .actionBtnContainer{position:absolute;border:1px solid #474747 !important;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;border:2px solid;-webkit-transform:translate(0px,10px);-ms-transform:translate(0px,10px);transform:translate(0px,10px);background-color:#073b00;z-index:1;}/*!sc*/ .eROqxA .actionBtnContainer span{padding:5px 10px;color:#fff;cursor:pointer;}/*!sc*/ .eROqxA .actionBtnContainer span:hover{background-color:#03b044;-webkit-transition:0.5s;transition:0.5s;}/*!sc*/ .eROqxA .story-rank{background:#f6f7f9;color:#3c3c3b;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-jusitfy-content:center;-ms-flex-pack:center;jusitfy-content:center;border-radius:0.5rem;padding:0.5rem 0.5rem;}/*!sc*/ .eROqxA .story-rank:hover{cursor:pointer;}/*!sc*/ .eROqxA .booster-btn{padding:4px 15px;margin-right:1rem;max-height:33.3px;border-radius:0.5rem;border:0px;background:#1e5500;color:#05ff00;font-weight:600;font-size:16px;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;}/*!sc*/ .eROqxA .story-stat{background:#f6f7f9;color:#3c3c3b;padding:4px;margin-right:1rem;max-height:33.3px;border-radius:0.5rem;}/*!sc*/ .eROqxA .story-stat svg{fill:#3c3c3b;}/*!sc*/ @media only screen and (max-width:640px){.eROqxA .story-stat{margin:0;}}/*!sc*/ @media only screen and (max-width:375px){.eROqxA .bookmark{margin-left:0;}}/*!sc*/ .eROqxA small{margin-right:10px;}/*!sc*/ @media only screen and (max-width:500px){.eROqxA small{margin-right:0;}}/*!sc*/ .eROqxA .vertical{width:0px;height:15px;border:1px solid #7e7e7e;}/*!sc*/ @media only screen and (min-width:640px){.eROqxA .desktop-no-show{display:none !important;}}/*!sc*/ @media only screen and (max-width:640px){.eROqxA .mobile-no-show{display:none !important;}}/*!sc*/ .eROqxA .first-place,.eROqxA .second-place,.eROqxA .third-place{-webkit-animation:zoomInRotate 2s ease-in-out;animation:zoomInRotate 2s ease-in-out;}/*!sc*/ data-styled.g55[id="sc-93e186d7-0"]{content:"eROqxA,"}/*!sc*/ .eiYCFa{width:95px;height:31px;background-color:#00ff00;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;border:1px solid;padding:10px;font-weight:bold;cursor:pointer;background-color:#003a00;border-radius:10px;}/*!sc*/ .eiYCFa .tldr-arrow-animation{-webkit-transition:0.5s all;transition:0.5s all;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}/*!sc*/ .eiYCFa:hover{-webkit-transform:scale(1.1,1.1);-ms-transform:scale(1.1,1.1);transform:scale(1.1,1.1);}/*!sc*/ data-styled.g56[id="sc-93e186d7-1"]{content:"eiYCFa,"}/*!sc*/ .bhpHZN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .bhpHZN .trendingStory{font-size:20px;color:#666105;}/*!sc*/ .bhpHZN .service-tooltip{width:800px;opacity:1 !important;}/*!sc*/ data-styled.g58[id="sc-93e186d7-3"]{content:"bhpHZN,"}/*!sc*/ .ehdhzV{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-right:15px;gap:10px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ @media screen and (max-width:610px){.ehdhzV{gap:5px;}}/*!sc*/ @media only screen and (max-width:375px){.ehdhzV{margin-right:0px;}}/*!sc*/ data-styled.g59[id="sc-93e186d7-4"]{content:"ehdhzV,"}/*!sc*/ .fEpdfH{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ @media screen and (max-width:666px){.fEpdfH{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}}/*!sc*/ data-styled.g60[id="sc-93e186d7-5"]{content:"fEpdfH,"}/*!sc*/ .dPrQoP .img{margin-right:1rem;border-radius:5px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/ .dPrQoP .img:hover{-webkit-transform:scale(1.1,1.1);-ms-transform:scale(1.1,1.1);transform:scale(1.1,1.1);}/*!sc*/ data-styled.g61[id="sc-93e186d7-6"]{content:"dPrQoP,"}/*!sc*/ .fEEqoW{padding:10px;border:2px solid;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;background:#212428;color:lightgray;min-width:140px;border:0;border-radius:0 5px 5px 0;font-size:1.5rem;cursor:pointer;font-weight:800;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .fEEqoW i{margin-left:0.5rem;}/*!sc*/ @-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}/*!sc*/ @keyframes spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}/*!sc*/ .fEEqoW:hover{background:#138a36;color:white;}/*!sc*/ data-styled.g66[id="sc-9d94a5e5-2"]{content:"fEEqoW,"}/*!sc*/ .jtwMgp{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .jtwMgp .author-email-form{margin:0 auto;margin-right:auto;}/*!sc*/ .jtwMgp .subscribe-btn{font-size:15px;}/*!sc*/ .jtwMgp .subscribe-btn-tooltip{max-width:100px;}/*!sc*/ .jtwMgp .emailContainer{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;width:100%;}/*!sc*/ .jtwMgp .emailContainer input{width:100%;}/*!sc*/ @media screen and (max-width:400px){.jtwMgp{-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}.jtwMgp .emailContainer{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.jtwMgp .emailContainer input,.jtwMgp .emailContainer button{border-radius:0px !important;}}/*!sc*/ .jtwMgp .subscribe-btn{width:100%;font-family:"IBM Plex Mono",monospace;font-weight:bold;color:white;background-color:#009900;border:1px solid #62ff86;cursor:pointer;border-radius:5px;padding:1rem 0.5rem;}/*!sc*/ .jtwMgp .subscribe-btn .icon{fill:#62ff86;}/*!sc*/ .jtwMgp .subscribe-btn:hover{color:#212428;background-color:#0f0;border:1px solid #212428;-webkit-transform:scale(1.02);-ms-transform:scale(1.02);transform:scale(1.02);-webkit-transition:all 100ms ease-in-out;transition:all 100ms ease-in-out;}/*!sc*/ .jtwMgp .subscribe-btn:hover .icon{fill:#212428;}/*!sc*/ @media screen and (max-width:1085px){.jtwMgp .subscribe-btn{width:100%;margin-top:1.5rem;}}/*!sc*/ .jtwMgp .subscribe_auth{margin:0 auto;width:100%;}/*!sc*/ @media screen and (max-width:1085px){.jtwMgp .subscribe_auth{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;}}/*!sc*/ .jtwMgp .subscribe-tooltip{position:relative;display:inline-block;}/*!sc*/ .jtwMgp .subscribe-tooltip .tooltiptext{width:100%;visibility:hidden;background-color:white;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;left:0;min-width:200px;bottom:4rem;font-family:"IBM Plex Mono",monospace;font-size:1.2rem;color:gray;font-weight:600;text-align:center;}/*!sc*/ .jtwMgp .tooltip .tooltipbadge{visibility:hidden;background-color:white;border:2px solid black;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;bottom:6.5rem;left:-200px;z-index:1;width:500px;font-family:"IBM Plex Mono",monospace;font-size:1.2rem;color:gray;font-weight:600;text-align:center;}/*!sc*/ @media screen and (max-width:1085px){.jtwMgp .tooltip .tooltipbadge{width:200px;left:-50px;}}/*!sc*/ @media screen and (max-width:720px){.jtwMgp .tooltip .tooltipbadge{width:auto;left:-10px;font-size:12px;}}/*!sc*/ .jtwMgp .subscribe-tooltip:hover .tooltiptext{visibility:visible !important;}/*!sc*/ .jtwMgp .tooltip:hover .tooltipbadge{visibility:visible;}/*!sc*/ .jtwMgp .author-email-form{width:100%;margin:0 auto;}/*!sc*/ .jtwMgp .author-email-form .emailContainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:10px;}/*!sc*/ .jtwMgp .author-email-form .emailContainer > input{width:190px;padding:10px;border:0;color:black;background-color:rgba(255,255,255,1);border-radius:5px 0px 0px 5px;border:1px solid rgba(0,0,0,0.5);}/*!sc*/ @media screen and (max-width:400px){.jtwMgp .author-email-form .emailContainer > input{width:100%;margin-bottom:10px;}}/*!sc*/ .jtwMgp .author-email-form .emailContainer > input:focus-visible{border:2px solid red;}/*!sc*/ @media screen and (max-width:500px){.jtwMgp .author-email-form{padding-left:0;}.jtwMgp .author-email-form .emailContainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.jtwMgp .author-email-form .emailContainer > input{padding:10px 10px 10px 20px;font-size:1.5rem;border:0;background-color:lightgrey;border-radius:5px;}.jtwMgp .author-email-form .emailContainer > input:focus-visible{border:2px solid red;}}/*!sc*/ data-styled.g68[id="sc-9d94a5e5-4"]{content:"jtwMgp,"}/*!sc*/ .dGrQDi{background:whitesmoke;border-radius:1rem;padding:2rem;max-width:850px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;font-size:1.5rem;font-weight:lighter;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem auto 4rem auto;}/*!sc*/ @media screen and (max-width:850px){.dGrQDi{margin:5rem;wdith:100%;}}/*!sc*/ @media screen and (max-width:640px){.dGrQDi{margin:0rem 1rem;margin-bottom:3rem;wdith:100%;}}/*!sc*/ @media screen and (max-width:480px){.dGrQDi{margin:0rem 0rem;margin-bottom:3rem;wdith:100%;}}/*!sc*/ .dGrQDi h3{margin-top:0px;font-size:3rem;}/*!sc*/ @media only screen and (max-width:400px){.dGrQDi h3{font-size:2rem;}}/*!sc*/ .dGrQDi .row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ @media screen and (max-width:640px){.dGrQDi .row{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}/*!sc*/ .dGrQDi .row .avatar{margin-right:2rem;margin-bottom:auto;box-shadow:0 0.2em #c2cad6,0 -0.2em #c2cad6, 0.2em 0 #c2cad6,-0.2em 0 #c2cad6;position:relative;min-height:130px;min-width:130px;}/*!sc*/ @media screen and (max-width:640px){.dGrQDi .row .avatar{min-height:75px;min-width:75px;margin-right:auto;margin-bottom:1rem;}}/*!sc*/ .dGrQDi .row .brand{box-shadow:0 0.2em #f5ec43,0 -0.2em #f5ec43, 0.2em 0 #f5ec43,-0.2em 0 #f5ec43;}/*!sc*/ .dGrQDi .row .author-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column;-ms-flex-flow:column;flex-flow:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-flex-wrap:no-wrap;-ms-flex-wrap:no-wrap;flex-wrap:no-wrap;-webkit-transition:all 0.3s ease-in;transition:all 0.3s ease-in;width:100%;}/*!sc*/ .dGrQDi .row .author-name-handle{margin-right:3rem;}/*!sc*/ .dGrQDi .row .author-info-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .dGrQDi .row .author-info-top .subscribe-circle{margin-bottom:1rem;}/*!sc*/ .dGrQDi .row strong{font-weight:bold;margin-right:1rem;}/*!sc*/ .dGrQDi .row .handle a{color:gray;}/*!sc*/ .dGrQDi .row .bio{color:#82858a;font-style:italic;margin-top:1rem;max-width:100vw;overflow-wrap:anywhere;}/*!sc*/ .dGrQDi .row .author-cta-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ @media screen and (max-width:480px){.dGrQDi .row .author-cta-wrapper{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0rem;width:100%;}}/*!sc*/ .dGrQDi .row .bio-cta{margin:1rem 1rem 1rem 0;justify-self:flex-end;background-color:white;display:block;text-align:center;padding:0.5rem 1rem;text-transform:capitalize;border-radius:5px;border:2px solid transparent;font-weight:bold;color:gray;}/*!sc*/ .dGrQDi .row .bio-cta i{margin-right:0.5rem;}/*!sc*/ .dGrQDi .row .bio-cta:hover{background:#138A36;color:white;}/*!sc*/ @media screen and (max-width:480px){.dGrQDi .row .bio-cta{width:100%;}}/*!sc*/ data-styled.g69[id="sc-104e382f-0"]{content:"dGrQDi,"}/*!sc*/ .ghXAMP{padding:0.5rem 1.5rem;margin:0 1.5rem 1.5rem 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background:transparent;color:black;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 3px 0 lightgray;}/*!sc*/ .ghXAMP:hover{background:#138A36;color:white;}/*!sc*/ @media screen and (max-width:640px){.ghXAMP{font-size:1.2rem;padding:0.5rem 1rem;}}/*!sc*/ data-styled.g70[id="sc-bc42364f-0"]{content:"ghXAMP,"}/*!sc*/ .cdoWeI{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#138a36;font-weight:bold;font-size:1.5rem;padding:0.5rem 1rem;margin:0 1rem 1rem 0;border-radius:0.5rem;height:35px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;box-shadow:0 0 3px 0 lightgray;}/*!sc*/ .cdoWeI img{margin-right:1rem;-webkit-filter:brightness(0) invert(1) grayscale(100%);filter:brightness(0) invert(1) grayscale(100%);}/*!sc*/ @media screen and (max-width:640px){.cdoWeI{font-size:1.2rem;padding:0.2rem 0.6rem;color:white;}}/*!sc*/ data-styled.g71[id="sc-29806bfb-0"]{content:"cdoWeI,"}/*!sc*/ .buhXYs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;justify-items:start;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-column:1 / span 1 !important;grid-row:span 5;}/*!sc*/ @media screen and (max-width:1000px){.buhXYs{display:none;}}/*!sc*/ .buhXYs .nft{cursor:pointer;}/*!sc*/ @media screen and (max-width:768px){.buhXYs{grid-gap:10px;}}/*!sc*/ .buhXYs + *{margin-top:0;}/*!sc*/ .buhXYs + blockquote,.buhXYs + .code-container{grid-column:2 / -2 !important;}/*!sc*/ .buhXYs > a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;background-color:white;}/*!sc*/ .buhXYs .profileImageContainer{width:50px;height:50px;position:relative;cursor:pointer;border-radius:50%;box-shadow:0 0.2em #c2cad6,0 -0.2em #c2cad6, 0.2em 0 #c2cad6,-0.2em 0 #c2cad6;}/*!sc*/ .buhXYs .profileImageContainer img{border-radius:50%;}/*!sc*/ @media only screen and (max-width:600px){.buhXYs .profileImageContainer{margin:0 auto;}}/*!sc*/ .buhXYs > a > .profileImage{max-width:50px;object-fit:cover;border-radius:50px;box-shadow:0 0.2em #c2cad6,0 -0.2em #c2cad6, 0.2em 0 #c2cad6,-0.2em 0 #c2cad6;}/*!sc*/ .buhXYs .brand{box-shadow:0 0.2em #f5ec43,0 -0.2em #f5ec43, 0.2em 0 #f5ec43,-0.2em 0 #f5ec43;}/*!sc*/ .buhXYs > a > .profileImage.rainbow{box-shadow:none;}/*!sc*/ .buhXYs h3{margin:0 0 2rem;font-size:1.8rem;}/*!sc*/ .buhXYs h3 small{display:block;margin-top:2rem;}/*!sc*/ .buhXYs p{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;font-size:1.6rem;font-style:italic;}/*!sc*/ .buhXYs a.about-page-link{padding:2px 10px 0 0;border:2px dashed;background-color:#106a00;font-family:"HackerNoon";font-size:17px;color:#fff;}/*!sc*/ .buhXYs a.about-page-link .new-sticker{background:yellow;-webkit-transform:rotate(-40deg);-ms-transform:rotate(-40deg);transform:rotate(-40deg);display:inline-block;padding:5px;margin-right:10px;color:#234a00;}/*!sc*/ .buhXYs a.about-page-link:hover{background:#518d38;cursor:pointer;}/*!sc*/ .buhXYs a.about-page-link i{font-size:16px;margin-right:7px;}/*!sc*/ .buhXYs .profile_share_mobile{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:10px 0;}/*!sc*/ .buhXYs .profile_share_mobile img{background:black;min-width:30px;height:30px;padding:5px;border-radius:50%;}/*!sc*/ @media screen and (max-width:1070px){.buhXYs .profile_share_mobile{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/ @media screen and (max-width:650px){.buhXYs .profile_share_mobile{max-width:100%;}}/*!sc*/ .buhXYs .superpeer-link{background:transparent;border:3px solid #212428;font-weight:900;font-size:14px;display:block;width:100%;text-align:center;padding:20px 0;margin-top:25px;font-family:"IBM Plex Mono",monospace;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:all 120ms ease-in-out;transition:all 120ms ease-in-out;}/*!sc*/ .buhXYs .superpeer-link i{font-size:34px;-webkit-transform:translateY(3px);-ms-transform:translateY(3px);transform:translateY(3px);line-height:1;margin-right:15px;}/*!sc*/ .buhXYs .superpeer-link:hover{background:#0f0;}/*!sc*/ .buhXYs .superpeer-link .book{font-size:16px;line-height:1.3;}/*!sc*/ .buhXYs .superpeer-link .book .line{padding:2px 0 1px 0;cursor:pointer;background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,0.35) calc(50% - 9px), rgba(0,255,0,0.35) 100% );-webkit-transition:all 120ms ease-in-out;transition:all 120ms ease-in-out;background-size:100% 200%;background-position:0 0;word-break:break-word;}/*!sc*/ data-styled.g89[id="sc-6d048d67-0"]{content:"buhXYs,"}/*!sc*/ .cziptZ .circle-button-wrapper{width:20;height:20;position:relative;top:33px;left:33px;}/*!sc*/ .cziptZ .author-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;}/*!sc*/ .cziptZ .tooltip-title{color:black;margin:0px;font-size:1.5rem;}/*!sc*/ .cziptZ p{font-size:1.2rem;color:gray;}/*!sc*/ .cziptZ .author-img{width:50px;height:50px;border-radius:50%;margin-right:1rem;}/*!sc*/ .cziptZ img{width:25px;height:25px;margin-right:1rem;}/*!sc*/ .cziptZ .__react_component_tooltip{pointer-events:auto !important;cursor:pointer;opacity:1 !important;max-width:500px;border:1px solid lightgray;box-shadow:0rem 0rem 1rem lightgray;}/*!sc*/ data-styled.g90[id="sc-6d048d67-1"]{content:"cziptZ,"}/*!sc*/ .evreGv{max-width:280px;padding:1rem;text-align:left;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:1.5rem;}/*!sc*/ @media screen and (max-width:750px){.evreGv{max-width:320px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}/*!sc*/ @media screen and (max-width:850px){.evreGv{min-width:0px;width:100%;max-width:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;margin-bottom:0px;}}/*!sc*/ .evreGv .articles-wrapper{max-width:300px;}/*!sc*/ .evreGv .date{font-size:1rem;color:gray;}/*!sc*/ .evreGv .img{margin:auto;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-radius:1rem;margin-bottom:1rem;}/*!sc*/ .evreGv .img img{object-fit:cover;min-height:150px;}/*!sc*/ @media screen and (max-width:640px){.evreGv .img img{min-height:100px;}}/*!sc*/ .evreGv .text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-direction:column;-ms-flex-line-packalign-direction:column;align-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:105px;}/*!sc*/ @media screen and (max-width:850px){.evreGv .text{margin:10px 2rem;-webkit-flex:1;-ms-flex:1;flex:1;min-height:0px;}}/*!sc*/ .evreGv .divider-bullet{height:4px;width:4px;border-radius:50%;background:gray;margin:0 0.5rem;}/*!sc*/ @media screen and (max-width:640px){.evreGv .divider-bullet{height:2px;width:2px;}}/*!sc*/ .evreGv .related{background:#138A36;color:white;font-weight:bold;padding:0rem 0.5rem;border-radius:0.5rem;font-size:0.8rem;margin-left:auto;}/*!sc*/ @media screen and (max-width:850px){.evreGv .related{margin:0 2rem;min-height:0px;margin-right:auto;margin-left:0px;}}/*!sc*/ .evreGv .ad-tag{background:gold;color:black;}/*!sc*/ .evreGv .card-title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ @media screen and (max-width:640px){.evreGv .card-title{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start;}}/*!sc*/ .evreGv .card-info{margin-right:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ .evreGv .card-info .author-link{color:lightGray;font-size:1.2rem;}/*!sc*/ .evreGv .card-info .author-link:hover{color:#138A36;}/*!sc*/ @media screen and (max-width:640px){.evreGv .card-info .author-link{margin-right:1rem;}}/*!sc*/ .evreGv div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:space-evenly;-webkit-justify-content:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly;}/*!sc*/ .evreGv strong{font-size:2rem;line-height:25px;margin-bottom:10px;}/*!sc*/ @media screen and (max-width:500px){.evreGv strong{fontsize:1.5rem;}}/*!sc*/ .evreGv span{font-size:1.2rem;}/*!sc*/ data-styled.g92[id="sc-65adb81b-0"]{content:"evreGv,"}/*!sc*/ .ktrYOp > pre{overflow-x:scroll;max-width:100%;overflow:hidden;}/*!sc*/ .ktrYOp .annot{background-color:#ffff00;color:#212428;-webkit-transition:background-color 0.3s;transition:background-color 0.3s;}/*!sc*/ .ktrYOp .annot:hover{background-color:#ffff99;cursor:pointer;}/*!sc*/ .ktrYOp pre code{white-space:pre;overflow-x:scroll;width:800px;display:block;}/*!sc*/ @media screen and (max-width:1000px){.ktrYOp pre code{max-width:95vw;}}/*!sc*/ .ktrYOp .previewWarning,.ktrYOp .previewWarning > a{color:#a09a00;text-align:center;margin-bottom:10px;}/*!sc*/ .ktrYOp ul,.ktrYOp ol{padding-left:20px;margin:0;word-break:break-word;}/*!sc*/ .ktrYOp ol ol{list-style:lower-alpha;}/*!sc*/ .ktrYOp ol ol ol{list-style:lower-roman;}/*!sc*/ .ktrYOp .edit-story{text-align:center;margin:-40px 0 0 0;}/*!sc*/ .ktrYOp > figure{margin:0 auto;}/*!sc*/ .ktrYOp > figure > figcaption{font-size:1rem;}/*!sc*/ .ktrYOp figure,.ktrYOp .image-container{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;justify-self:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;max-width:90vw;}/*!sc*/ .ktrYOp figure img,.ktrYOp .image-container img{cursor:pointer;max-width:90vw;}/*!sc*/ .ktrYOp figure span,.ktrYOp .image-container span{position:initial !important;}/*!sc*/ .ktrYOp figure.feat,.ktrYOp .image-container.feat{grid-column:1 / -1;min-width:100%;border-radius:5px;}/*!sc*/ @media screen and (min-width:768px){.ktrYOp figure.feat .react-loading-skeleton,.ktrYOp .image-container.feat .react-loading-skeleton{height:450px !important;}}/*!sc*/ .ktrYOp .left-50,.ktrYOp .right-50{width:50%;margin-bottom:1em;clear:initial;}/*!sc*/ .ktrYOp .left-50{float:left;margin-right:2em;}/*!sc*/ .ktrYOp .right-50{float:right;margin-left:2em;}/*!sc*/ .ktrYOp .image-caption{line-height:0;display:block;margin:0;border:0px;display:block;font-size:13px;font-style:italic;font-weight:normal;color:rgb(78,92,110);padding:2px 0px;line-height:16px;text-align:center;min-height:1em;outline:none;background:none;resize:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;cursor:text;}/*!sc*/ .ktrYOp .youtube-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0;}/*!sc*/ .ktrYOp .youtube-container iframe{position:absolute;top:0;left:0;width:100%;height:100%;}/*!sc*/ .ktrYOp .embed-hn-story{box-shadow:#b9ffb9 0px 0.2em,#b9ffb9 0px -0.2em,#b9ffb9 0.2em 0px,#b9ffb9 -0.2em 0px,#0f0 0.2em 0.4em, #0f0 0.4em 0.2em,#005e00 0.4em 0.6em,#005e00 0.6em 0.4em;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 auto;max-width:450px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/ .ktrYOp .embed-hn-story .card-image-container img{height:100%;width:100%;object-fit:contain;}/*!sc*/ .ktrYOp .embed-hn-story .card-info h4{margin:0 5px;}/*!sc*/ .ktrYOp .embed-hn-story .card-info span{display:-webkit-box;font-size:13px;margin:5px;height:2.6em;max-height:2.6em;margin-top:0.32333em;line-height:1.3em;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;}/*!sc*/ .ktrYOp .codepen-container,.ktrYOp .codesandbox-container{grid-column:1 / -1;}/*!sc*/ .ktrYOp .codepen-container iframe,.ktrYOp .codesandbox-container iframe{border:none;border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,0.1);width:100%;height:500px;}/*!sc*/ .ktrYOp > blockquote{font-size:2rem;word-break:break-word;font-style:italic;margin-left:0;margin-right:0;padding:2rem 0;text-align:left;}/*!sc*/ @media screen and (min-width:768px){.ktrYOp > blockquote{font-size:2.5rem;}}/*!sc*/ .ktrYOp .paragraph{min-width:0;margin:0 0 25px 0;word-wrap:break-word;}/*!sc*/ .ktrYOp .line-space{margin:0 !important;}/*!sc*/ .ktrYOp h2{font-size:1.5em;}/*!sc*/ .ktrYOp .reactions{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:6px;}/*!sc*/ .ktrYOp .paragraph a,.ktrYOp .slogging a,.ktrYOp blockquote a,.ktrYOp p a,.ktrYOp .h2 a,.ktrYOp .h3 a,.ktrYOp .h4 a,.ktrYOp ul li a,.ktrYOp ol li a,.ktrYOp h1 a,.ktrYOp h2 a,.ktrYOp h3 a{color:black;padding:2px 0 1px 0;background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,0.35) calc(50% - 9px), rgba(0,255,0,0.35) 100% );-webkit-transition:background-position 120ms ease-in-out,padding 120ms ease-in-out;transition:background-position 120ms ease-in-out,padding 120ms ease-in-out;background-size:100% 200%;background-position:0 0;word-break:break-word;}/*!sc*/ .ktrYOp .paragraph a:hover,.ktrYOp .slogging a:hover,.ktrYOp blockquote a:hover,.ktrYOp p a:hover,.ktrYOp .h2 a:hover,.ktrYOp .h3 a:hover,.ktrYOp .h4 a:hover,.ktrYOp ul li a:hover,.ktrYOp ol li a:hover,.ktrYOp h1 a:hover,.ktrYOp h2 a:hover,.ktrYOp h3 a:hover{background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,1) calc(50% - 9px), rgba(0,255,0,1) 100% );background-position:0 100%;}/*!sc*/ .ktrYOp .paragraph a:focus,.ktrYOp .slogging a:focus,.ktrYOp blockquote a:focus,.ktrYOp p a:focus,.ktrYOp .h2 a:focus,.ktrYOp .h3 a:focus,.ktrYOp .h4 a:focus,.ktrYOp ul li a:focus,.ktrYOp ol li a:focus,.ktrYOp h1 a:focus,.ktrYOp h2 a:focus,.ktrYOp h3 a:focus{text-shadow:1px 1px 0 #0b0;}/*!sc*/ .ktrYOp tr,.ktrYOp th,.ktrYOp td{border:1px solid;border-collapse:collapse;}/*!sc*/ .ktrYOp th{width:300px;}/*!sc*/ .ktrYOp table{width:100%;border-spacing:0;}/*!sc*/ .ktrYOp .tags{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ .ktrYOp .skeleton.meta{grid-column:1 / -1;display:grid;grid-template-columns:auto 1fr;}/*!sc*/ .ktrYOp .skeleton.meta > div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .ktrYOp .skeleton.meta > div:first-child{justify-self:start;}/*!sc*/ .ktrYOp .skeleton.meta > div:last-child{justify-self:end;}/*!sc*/ data-styled.g98[id="sc-2e79ac2f-0"]{content:"ktrYOp,"}/*!sc*/ .cdKvIK{position:fixed;z-index:10;background-color:white;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;height:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#3c3c3b;border:1px solid white;border-radius:5px;}/*!sc*/ .cdKvIK button{background-color:#3c3c3b;border:none;margin-left:10px;color:white;}/*!sc*/ .cdKvIK button:hover{cursor:pointer;}/*!sc*/ data-styled.g106[id="sc-2e79ac2f-8"]{content:"cdKvIK,"}/*!sc*/ .kIDgmw{width:20px;height:20px;position:absolute;bottom:-10px;left:30px;z-index:-1;background-color:#3c3c3b;border-bottom:1px solid white;border-right:1px solid white;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}/*!sc*/ data-styled.g107[id="sc-2e79ac2f-9"]{content:"kIDgmw,"}/*!sc*/ html{box-sizing:border-box;font-size:10px;line-height:1.666;}/*!sc*/ *,*:before,*:after{box-sizing:inherit;}/*!sc*/ .spin{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;-webkit-animation-name:spin;animation-name:spin;-webkit-animation-duration:5000ms;animation-duration:5000ms;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;}/*!sc*/ @-webkit-keyframes spin{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}/*!sc*/ @keyframes spin{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}/*!sc*/ body{padding:0;margin:0;font-size:1.75rem;font-family:'IBM Plex Sans',sans-serif;color:#3c3c3b;-webkit-transition:background-color 200ms ease;transition:background-color 200ms ease;-webkit-transition:color 200ms ease;transition:color 200ms ease;overflow-x:hidden;background:#FFFFFF;}/*!sc*/ body span.highlight{background:#9cffa3;}/*!sc*/ h1,h2,h3{-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;font-family:'IBM Plex Mono',monospace;line-height:1.4;margin-bottom:3rem;}/*!sc*/ h1{font-size:1.75em;}/*!sc*/ h2{font-size:1.5rem;}/*!sc*/ a,button{outline:none;}/*!sc*/ a{color:#3c3c3b;-webkit-transition:color 200ms ease;transition:color 200ms ease;-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ a[disabled]{opacity:0.75;cursor:not-allowed;}/*!sc*/ input::-webkit-input-placeholder{font-style:italic;opacity:1;}/*!sc*/ input::-moz-placeholder{font-style:italic;opacity:1;}/*!sc*/ input:-ms-input-placeholder{font-style:italic;opacity:1;}/*!sc*/ input::placeholder{font-style:italic;opacity:1;}/*!sc*/ p code{background:#f5f2f0;}/*!sc*/ textarea{background:#ffffff;color:#000000;}/*!sc*/ svg path{fill:#000000;}/*!sc*/ body.dark-mode{background-color:#212428;color:#f6f7f9;}/*!sc*/ body.dark-mode input{background:#212428;color:#f6f7f9;}/*!sc*/ body.dark-mode .badgeColors{background:#212428;}/*!sc*/ body.dark-mode .search{border:0px solid #0b0;}/*!sc*/ body.dark-mode .quote-header{background:black;}/*!sc*/ body.dark-mode .paragraph a,body.dark-mode .slogging a,body.dark-mode blockquote a,body.dark-mode p a,body.dark-mode .h2 a,body.dark-mode .h3 a,body.dark-mode .h4 a,body.dark-mode ul li a,body.dark-mode ol li a,body.dark-mode h1 a,body.dark-mode h2 a,body.dark-mode h3 a{color:#f6f7f9;}/*!sc*/ body.dark-mode .highlight{background:#0b0;color:#f6f7f9;}/*!sc*/ body.dark-mode .bg-white{background-color:#212428;}/*!sc*/ body.dark-mode .text-black{color:#f6f7f9;}/*!sc*/ body.dark-mode a{color:#f6f7f9;}/*!sc*/ body.dark-mode .coin-description a{color:#f6f7f9;}/*!sc*/ body.dark-mode mark a{color:#3c3c3b;}/*!sc*/ body.dark-mode li h2 a{color:#f6f7f9;}/*!sc*/ body.dark-mode a.edit-link{color:#8595ad;}/*!sc*/ body.dark-mode .paragraph code,body.dark-mode main > div > ul code{color:#c2cad6;background:black;}/*!sc*/ body.dark-mode pre{background:black;}/*!sc*/ body.dark-mode:not(pre)>code[class*=language-],body.dark-mode pre[class*=language-]{background:black;}/*!sc*/ body.dark-mode code{color:#c2cad6;background:black;}/*!sc*/ body.dark-mode .tags a,body.dark-mode .tag a{color:#c1cad4;}/*!sc*/ body.dark-mode .paragraph a:hover,body.dark-mode h1 a:hover,body.dark-mode h3 a:hover,body.dark-mode .paragraph a:focus,body.dark-mode h1 a:focus,body.dark-mode h3 a:focus{background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), rgba(0,255,0,1) calc(50% - 9px), rgba(0,255,0,1) 100% );color:#212428;}/*!sc*/ body.dark-mode .tooltip-title{color:white;}/*!sc*/ body.dark-mode .authorBio-section{background:rgba(0,0,0,0.2);}/*!sc*/ body.dark-mode .poll_comments{background:rgba(0,0,0,0.2);}/*!sc*/ body.dark-mode .ProseMirror{background:#212428 !important;color:white;}/*!sc*/ body.dark-mode .comment-block{background:#212428;color:white;}/*!sc*/ body.dark-mode .comment-block a{color:white;}/*!sc*/ body.dark-mode .comment-block p{color:white;}/*!sc*/ body.dark-mode .bio-cta{background:rgba(0,0,0,0.2) !important;color:lightGray !important;}/*!sc*/ body.dark-mode .fs-hn-cta{background:#138A36;}/*!sc*/ body.dark-mode .story-rank{background:#3c3c3b;color:#f6f7f9;}/*!sc*/ body.dark-mode .story-stat{background:#3c3c3b !important;color:#f6f7f9 !important;}/*!sc*/ body.dark-mode .lang{background-color:black;}/*!sc*/ body.dark-mode .story-stat svg{fill:#f6f7f9;}/*!sc*/ body.dark-mode header.tagged-header{background:black;}/*!sc*/ body.dark-mode header .lang-button,body.dark-mode header .purr-cat-button{background:black;border:2px solid white;}/*!sc*/ body.dark-mode header .lang-button:hover,body.dark-mode header .purr-cat-button:hover{background:darkGreen;color:white;}/*!sc*/ body.dark-mode header .lang-button:hover img,body.dark-mode header .purr-cat-button:hover img{background:lightGreen;}/*!sc*/ body.dark-mode header .lang-button img,body.dark-mode header .purr-cat-button img{margin-right:1rem;background:lightgreen;}/*!sc*/ body.dark-mode .mainNav{background-color:#0b0;}/*!sc*/ body.dark-mode .mainNav .tippy-box li a,body.dark-mode .mainNav .tippy-box button{background-color:#0b0;color:#f6f7f9;}/*!sc*/ body.dark-mode .mainNav .tippy-box li a:hover,body.dark-mode .mainNav .tippy-box button:hover{background-color:#62ff86;}/*!sc*/ body.dark-mode button.subscribe{color:#f6f7f9;border:2px solid #f6f7f9;}/*!sc*/ body.dark-mode .footer a{color:inherit;}/*!sc*/ body.dark-mode .story-nav{background:#3c3c3b;}/*!sc*/ body.dark-mode i.fa-bookmark{color:#c1cad4;}/*!sc*/ body.dark-mode .verified img{-webkit-filter:brightness(0.5) saturate(0.8);filter:brightness(0.5) saturate(0.8);}/*!sc*/ body.dark-mode .download-button{background:#020;}/*!sc*/ body.dark-mode .mint{background:#212428;border:2px solid #8595ad;box-shadow:#52627a 0.2em 0.2em;}/*!sc*/ body.dark-mode .mint:hover{background-color:#52627a;}/*!sc*/ body.dark-mode .chart{background:#212428;}/*!sc*/ body.dark-mode .chart .tooltip{background:#212428;}/*!sc*/ body.dark-mode .chart .chart-misc .date-pickers button{color:#8595ad;border:2px solid #8595ad;}/*!sc*/ body.dark-mode .powered img{-webkit-filter:invert(1);filter:invert(1);}/*!sc*/ body.dark-mode .OTDwrapper{background:#212428;}/*!sc*/ body.dark-mode .sectionTitle{background:#212428;}/*!sc*/ body.dark-mode .yearBtn{color:#52627a;}/*!sc*/ body.dark-mode .onthisdayLayout{background:#212428;}/*!sc*/ body.dark-mode .OnThisDay{background:black;}/*!sc*/ body.dark-mode .cloudyBottom{margin:auto;}/*!sc*/ body.dark-mode .cloudyBottom span{background:black !important;}/*!sc*/ body.dark-mode .rec-arrow{color:white !important;}/*!sc*/ body.dark-mode .rec-arrow:hover{background:#3c3c3b !important;}/*!sc*/ body.dark-mode button.rec-arrow:active,body.dark-mode button.rec-arrow:focus{background-color:black !important;color:white !important;}/*!sc*/ body.dark-mode small.date{color:whitesmoke;}/*!sc*/ body.dark-mode .rec-dot{box-shadow:0 0 1px 3px #3c3c3b;}/*!sc*/ body.dark-mode button.rec-dot_active{box-shadow:0 0 1px 3px #c2cad6;background:#c2cad6;}/*!sc*/ body.dark-mode .rec-carousel-wrapper{background:#212428;}/*!sc*/ body.dark-mode .page-header{background:#3c3c3b;border-bottom:1rem solid #0b0;}/*!sc*/ body.dark-mode .page-header span{background:#0b0;}/*!sc*/ body.dark-mode .storiesTitle{background:#0b0;}/*!sc*/ body.dark-mode .storiesTitle span{background:#0b0;color:#FFFFFF;}/*!sc*/ body.dark-mode .year-header{background:#3c3c3b;color:#62ff86;}/*!sc*/ body.dark-mode .addEventWrapper{background:rgba(0,187,0,0.6);}/*!sc*/ body.dark-mode .addEventWrapper .addEventBtn{color:#62ff86;}/*!sc*/ body.dark-mode .eventsContainer{background:rgba(0,187,0,.4);}/*!sc*/ body.dark-mode .eventCard{border:1px solid #003b00;background:rgba(0,187,0,0.6);}/*!sc*/ body.dark-mode .onthisdayModal{background:rgba(98,255,134,0.5);}/*!sc*/ body.dark-mode .onthisdayModal form .editCard{background:rgba(255,255,255,0.5);}/*!sc*/ body.dark-mode .onthisdayModal form .learnmoreBtn{color:#212428;}/*!sc*/ body.dark-mode .carousel-card{border:2px solid #3c3c3b;background:transparent;}/*!sc*/ body.dark-mode .profile_info_top,body.dark-mode .profile_info_bottom,body.dark-mode .author-stats,body.dark-mode .BadgesContainer,body.dark-mode .sub-btn{background:rgba(0,0,0,0.3) !important;}/*!sc*/ body.dark-mode .story-card{border:2px solid #3c3c3b;}/*!sc*/ @media screen and (max-width:768px){body.dark-mode .story-card{background:black;}}/*!sc*/ body.dark-mode .card-reactions .emojis{background:#3c3c3b;color:white;}/*!sc*/ body.dark-mode .card-reactions .emojis svg{fill:white;}/*!sc*/ body.dark-mode .story-card-alt{background:black;}/*!sc*/ body.dark-mode .ad-tag{color:black;border:1px solid black;}/*!sc*/ body.dark-mode .votingButton{background:#3c3c3b;color:#f6f7f9;}/*!sc*/ body.dark-mode .votingButton:hover{background:rgb(144,238,144);color:#3c3c3b;}/*!sc*/ body.dark-mode .story-card h2 a{font-size:2rem;}/*!sc*/ body.dark-mode .classicFooterColor a{color:#00ff00 !important;}/*!sc*/ body.dark-mode .react-tabs ul li:last-child{border-right:3px solid transparent;}/*!sc*/ body.dark-mode .react-tabs ul .inactive:hover{background:#52627a;}/*!sc*/ body.dark-mode .react-tabs ul::before,body.dark-mode .react-tabs ul::after{border-bottom:3px solid #8595ad;}/*!sc*/ body.dark-mode .quoteBox{border:1px solid #52627a;}/*!sc*/ body.dark-mode .storyCards{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 auto;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-animation:fadein 1s;-moz-animation:fadein 1s;-ms-animation:fadein 1s;-o-animation:fadein 1s;-webkit-animation:fadein 1s;animation:fadein 1s;}/*!sc*/ @-webkit-keyframes fadein{0%{opacity:0;}100%{opacity:1;}}/*!sc*/ @keyframes fadein{0%{opacity:0;}100%{opacity:1;}}/*!sc*/ @media screen and (max-width:768px){body.dark-mode .storyCards{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;height:auto;}}/*!sc*/ body.dark-mode .card-wrapper{border:2px solid grey;}/*!sc*/ @media screen and (max-width:1000px) and (min-width:768px){body.dark-mode .timeNotFeatured div{background:#3c3c3b;}body.dark-mode .OTDwrapper{background:#212428;}body.dark-mode .sectionTitle{background:#212428;}body.dark-mode .yearBtn{color:#52627a;}@media screen and (max-width:1000px) and (min-width:768px){body.dark-mode .timeNotFeatured div{background:#3c3c3b;}}}/*!sc*/ body.dark-mode .ais-SearchBox-input{color:#212428;}/*!sc*/ body.dark-mode .search-container{border:none;margin-left:0px;}/*!sc*/ body.dark-mode .ais-SearchBox-form input{background:black !important;color:white !important;}/*!sc*/ body.dark-mode .ais-SearchBox-form input::-webkit-input-place-holder{margin-left:2rem;color:gray;}/*!sc*/ body.dark-mode .ais-SearchBox-form input::-moz-place-holder{margin-left:2rem;color:gray;}/*!sc*/ body.dark-mode .ais-SearchBox-form input:-ms-input-place-holder{margin-left:2rem;color:gray;}/*!sc*/ body.dark-mode .ais-SearchBox-form input::place-holder{margin-left:2rem;color:gray;}/*!sc*/ body.dark-mode .trending-tittle-wrapper{background:black;color:#c2cad6;margin-bottom:0.5rem;}/*!sc*/ body.dark-mode .trending-tittle-wrapper .trending-title a{background:none;color:#c2cad6;}/*!sc*/ body.dark-mode .trending-tittle-wrapper img{background:#c2cad6;width:25px;height:25px;border-radius:50%;padding:5px;}/*!sc*/ body.dark-mode .tag-title-link{color:#c2cad6;}/*!sc*/ body.dark-mode .trending-story-card{background:black;color:#c2cad6;}/*!sc*/ body.dark-mode .translation-tittle-wrapper img{background:#c2cad6;border-radius:50%;}/*!sc*/ body.dark-mode .tag-title{background:none;color:#c2cad6;}/*!sc*/ body.dark-mode .tag-title:hover{color:#0b0;}/*!sc*/ body.dark-mode .trending-company-card,body.dark-mode .trending-coin-card,body.dark-mode .trending-tag-card,body.dark-mode .translation-card{background:black;padding-left:2rem;color:#c2cad6;}/*!sc*/ body.dark-mode .col-right-tabs .trending-tab-btn{background:#212428;color:gray;border:1px solid black;margin-top:0.5rem;}/*!sc*/ body.dark-mode .col-right-tabs .trending-tab-btn:first-child{border-radius:0.5rem 0 0 0;border-top:1px solid #212428 !important;border-left:1px solid #212428 !important;}/*!sc*/ body.dark-mode .col-right-tabs .trending-tab-btn:last-child{border-radius:0 0.5rem 0 0;border-top:1px solid #212428 !important;border-right:1px solid #212428 !important;}/*!sc*/ body.dark-mode .col-right-tabs .trending-tab-active{color:#c2cad6;background:black;font-weight:bold;}/*!sc*/ body.dark-mode .tag-tittle-wrapper,body.dark-mode .translation-tittle-wrapper{background:black;padding-left:2rem;color:#c2cad6;margin-bottom:0.5rem;}/*!sc*/ body.dark-mode .search-tab-button{background:black;color:gray;}/*!sc*/ body.dark-mode .search-tab-button:hover{color:lightgray;}/*!sc*/ body.dark-mode .search-tab-button-active{color:#0b0;}/*!sc*/ body.dark-mode .search-story-card,body.dark-mode .search-tag-card,body.dark-mode .search-people-card,body.dark-mode .search-company-wrapper,body.dark-mode .search-coin-card{background:black;margin-bottom:0.5rem;border:none;}/*!sc*/ body.dark-mode .search-story-card h2,body.dark-mode .search-tag-card h2,body.dark-mode .search-people-card h2,body.dark-mode .search-company-wrapper h2,body.dark-mode .search-coin-card h2,body.dark-mode .search-story-card .display-name,body.dark-mode .search-tag-card .display-name,body.dark-mode .search-people-card .display-name,body.dark-mode .search-company-wrapper .display-name,body.dark-mode .search-coin-card .display-name,body.dark-mode .search-story-card .handle,body.dark-mode .search-tag-card .handle,body.dark-mode .search-people-card .handle,body.dark-mode .search-company-wrapper .handle,body.dark-mode .search-coin-card .handle,body.dark-mode .search-story-card .search-company-name,body.dark-mode .search-tag-card .search-company-name,body.dark-mode .search-people-card .search-company-name,body.dark-mode .search-company-wrapper .search-company-name,body.dark-mode .search-coin-card .search-company-name{color:#c2cad6;}/*!sc*/ body.dark-mode .story-hits-layout,body.dark-mode .tag-hits-layout,body.dark-mode .coin-hits-layout{background:transparent;padding:0px;}/*!sc*/ body.dark-mode .company-hits-layout,body.dark-mode .peoples-hits-layout{padding-top:0px;margin-top:0.5rem;background:transparent;}/*!sc*/ body.dark-mode .search-parcat-card{background:black;border:1px solid gray;}/*!sc*/ body.dark-mode .search-parcat small{background:black;color:gray;}/*!sc*/ body.dark-mode .search-parcat small:hover{background:green;color:white;}/*!sc*/ body.dark-mode .search-parcat .lazy-load-image-background.opacity{opacity:0;}/*!sc*/ body.dark-mode .search-parcat .lazy-load-image-background.opacity.lazy-load-image-loaded{opacity:1;-webkit-transition:opacity .3s;transition:opacity .3s;}/*!sc*/ body.dark-mode .search-parcat .ReactModal__Overlay{z-index:5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ body.dark-mode .search-parcat .ReactModal__Content{position:static !important;border:2px solid #3c3c3b !important;border-radius:2px !important;box-shadow:2px 2px 0px #cdcdcd,-2px -2px 0px #ffffff;}/*!sc*/ body.dark-mode .search-parcat .nft{-webkit-clip-path:polygon(25% 5%,75% 5%,100% 50%,75% 95%,25% 95%,0% 50%);-webkit-clip-path:polygon(25% 5%,75% 5%,100% 50%,75% 95%,25% 95%,0% 50%);clip-path:polygon(25% 5%,75% 5%,100% 50%,75% 95%,25% 95%,0% 50%);}/*!sc*/ body.dark-mode .search-parcat .nft:after{--borderWidth:6px;content:'';position:absolute;top:calc(-1 * var(--borderWidth));left:calc(-1 * var(--borderWidth));height:calc(100% + var(--borderWidth) * 2);width:calc(100% + var(--borderWidth) * 2);background:#c2cad6;border-radius:calc(2 * var(--borderWidth));z-index:-1;background-size:300% 300%;}/*!sc*/ body.dark-mode .search-parcat .rainbow{--borderWidth:3px;position:relative;border-radius:var(--borderWidth);}/*!sc*/ body.dark-mode .search-parcat .rainbow:after{--borderWidth:3px;content:'';position:absolute;top:calc(-1 * var(--borderWidth));left:calc(-1 * var(--borderWidth));height:calc(100% + var(--borderWidth) * 2);width:calc(100% + var(--borderWidth) * 2);background:linear-gradient(60deg,#f79533,#f37055,#ef4e7b,#a166ab,#5073b8,#1098ad,#07b39b,#6fba82);border-radius:calc(2 * var(--borderWidth));z-index:-1;-webkit-animation:animatedgradient 3s ease alternate infinite;animation:animatedgradient 3s ease alternate infinite;background-size:300% 300%;}/*!sc*/ @-webkit-keyframes animatedgradient{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}/*!sc*/ @keyframes animatedgradient{0%{background-position:0% 50%;}50%{background-position:100% 50%;}100%{background-position:0% 50%;}}/*!sc*/ body.dark-mode .search-parcat [data-rmiz-modal-overlay="hidden"]{background-color:transparent;}/*!sc*/ body.dark-mode .search-parcat [data-rmiz-modal-overlay="visible"]{background-color:transparent;}/*!sc*/ data-styled.g108[id="sc-global-gNyTYt1"]{content:"sc-global-gNyTYt1,"}/*!sc*/ .bRkRGv{min-height:100vh;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;}/*!sc*/ data-styled.g109[id="sc-9d336bae-0"]{content:"bRkRGv,"}/*!sc*/ .ghWRJY{position:relative;}/*!sc*/ @media (max-width:480px){.ghWRJY{padding:1rem 1rem;}}/*!sc*/ .ghWRJY .badgeColors{background:#f6f7f9;}/*!sc*/ .ghWRJY .badgeColors:hover{background:!important;color:!important;box-shadow:0 0.2em ,0 -0.2em , 0.2em 0 ,-0.2em 0;-webkit-transition:all 120ms ease-in-out;transition:all 120ms ease-in-out;}/*!sc*/ .ghWRJY .selectedLang{box-shadow:0 0.2em #0b0,0 -0.2em #0b0,0.2em 0 #0b0,-0.2em 0 #0b0;}/*!sc*/ .ghWRJY .fa-headphones{color:!important;}/*!sc*/ .ghWRJY .styled_anchor{color:!important;}/*!sc*/ .ghWRJY .styled_anchor:hover{color:white !important;background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), calc(50% - 9px), 100% );}/*!sc*/ .ghWRJY .profile-container,.ghWRJY > a > .profileImage{box-shadow:0 0.2em ,0 -0.2em , 0.2em 0 ,-0.2em 0 !important;}/*!sc*/ .ghWRJY .styled_anchorReg{padding:0 1rem;background-image:linear-gradient( transparent 0%, transparent calc(20% - 9px), transparent calc(50% - 9px), 100% );}/*!sc*/ .ghWRJY .styled_anchorReg:hover{color:!important;background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), calc(50% - 9px), 100% );}/*!sc*/ .ghWRJY .customColorLink{background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), calc(50% - 9px), 100% ) !important;}/*!sc*/ .ghWRJY .customColorLink:hover{background-image:linear-gradient( transparent 0%, transparent calc(50% - 9px), calc(50% - 9px), 100% );}/*!sc*/ .ghWRJY .votingButton{background:whitesmoke;color:black;}/*!sc*/ .ghWRJY .votingButton:hover{background:black !important;color:white !important;}/*!sc*/ .ghWRJY .title-short{background:transparent;}/*!sc*/ .ghWRJY .rankBox p{background:!important;color:!important;border:3px solid !important;}/*!sc*/ .ghWRJY .story-title-anchor:hover,.ghWRJY .company-anchor:hover{background:!important;}/*!sc*/ .ghWRJY .company-details,.ghWRJY .story-details{border:1px solid !important;}/*!sc*/ .ghWRJY .yearBtnActive{color:!important;border-bottom:2px solid !important;}/*!sc*/ .ghWRJY .yearBtn:hover{color:!important;background: !important;}/*!sc*/ .ghWRJY .card-wrapper{background:transparent !important;-webkit-animation:2s linear alternate fade;animation:2s linear alternate fade;}/*!sc*/ @-webkit-keyframes fade{0%{opacity:0.1;}25%{opacity:1;}}/*!sc*/ @keyframes fade{0%{opacity:0.1;}25%{opacity:1;}}/*!sc*/ .ghWRJY #about{background:transparent !important;}/*!sc*/ .ghWRJY #about a{border:2px solid !important;color:!important;}/*!sc*/ .ghWRJY #about a:hover{background:!important;border:2px solid !important;color:!important;}/*!sc*/ .ghWRJY #about .react-tabs__tab--selected{color:!important;background:!important;}/*!sc*/ .ghWRJY #about .react-tabs__tab--selected a{color:!important;background:!important;}/*!sc*/ .ghWRJY #about .react-tabs__tab:hover{color:!important;}/*!sc*/ .ghWRJY #about .react-tabs__tab-panel{background:!important;}/*!sc*/ data-styled.g110[id="sc-9d336bae-1"]{content:"ghWRJY,"}/*!sc*/ .gYRgFU .dabytag{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:850px;margin:auto;margin-top:3rem;}/*!sc*/ .gYRgFU .dabytag .da-toggle-btn{margin-left:auto;position:relative;top:4rem;right:1rem;z-index:3;background:white;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-radius:50%;padding:0.5rem;cursor:pointer;}/*!sc*/ .gYRgFU .related-section{margin-bottom:50px;}/*!sc*/ .gYRgFU .related-section .articles-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:200px;}/*!sc*/ .gYRgFU .topics-section,.gYRgFU .lang-section,.gYRgFU .related-section{margin:auto;width:98%;max-width:850px;}/*!sc*/ .gYRgFU .topics-section h4,.gYRgFU .lang-section h4,.gYRgFU .related-section h4{font-size:3rem;}/*!sc*/ .gYRgFU .topics-section .tags,.gYRgFU .lang-section .tags,.gYRgFU .related-section .tags{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ @media screen and (max-width:850px){.gYRgFU .topics-section,.gYRgFU .lang-section,.gYRgFU .related-section{padding:2rem;width:100%;}.gYRgFU .topics-section h4,.gYRgFU .lang-section h4,.gYRgFU .related-section h4{margin-left:2rem;margin-bottom:1rem;font-size:3rem;}.gYRgFU .topics-section .tags,.gYRgFU .lang-section .tags,.gYRgFU .related-section .tags{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:1rem;}}/*!sc*/ @media screen and (max-width:480px){.gYRgFU .topics-section,.gYRgFU .lang-section,.gYRgFU .related-section{padding:0 1rem;}.gYRgFU .topics-section h4,.gYRgFU .lang-section h4,.gYRgFU .related-section h4{margin-left:1rem;margin-bottom:1rem;font-size:2rem;}.gYRgFU .topics-section .tags,.gYRgFU .lang-section .tags,.gYRgFU .related-section .tags{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin:0px;}}/*!sc*/ data-styled.g121[id="sc-738aab49-0"]{content:"gYRgFU,"}/*!sc*/ .SWeJa a{background:#0f0;padding-bottom:3rem;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;}/*!sc*/ .SWeJa .cta-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;font-size:4.8vw;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:#212428;font-weight:bold;max-width:400px;width:90%;margin:4rem auto 1rem auto;padding:0em 0em 0em 0.5em;-webkit-transition:font-size 0.3s ease;transition:font-size 0.3s ease;}/*!sc*/ @media screen and (min-width:425px){.SWeJa .cta-top{font-size:4rem;}}/*!sc*/ @media screen and (min-width:768px){.SWeJa .cta-top{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:3rem;max-width:none;width:initial;margin-top:2rem;}}/*!sc*/ @media screen and (min-width:768px){.SWeJa .cta-top:hover{font-size:3.5rem;}}/*!sc*/ .SWeJa strong{color:#212428;}/*!sc*/ .SWeJa .fs-cta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ data-styled.g123[id="sc-92a1b621-1"]{content:"SWeJa,"}/*!sc*/ .ensLvG{width:850px;height:185.5px;background-color:#009300;position:relative;overflow:hidden;-webkit-transition:filter 0.5s;transition:filter 0.5s;border-radius:1rem;}/*!sc*/ .ensLvG .l1{display:none;}/*!sc*/ @media screen and (max-width:399px){.ensLvG{width:calc(100vw - 4rem);height:75px;}}/*!sc*/ @media screen and (max-width:850px){.ensLvG{width:95%;}}/*!sc*/ .ensLvG:hover{cursor:pointer;}/*!sc*/ .ensLvG .info{width:100%;height:100%;position:absolute;z-index:2;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:white;margin:0 0 0 50px;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .info{margin-left:20px;}}/*!sc*/ .ensLvG .info img{width:80px;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .info img{width:30px;height:30px;}}/*!sc*/ .ensLvG .info p{text-transform:uppercase;width:55%;max-height:100%;font-family:"HackerNoon",sans-serif;text-align:center;font-size:18px;margin-right:90px;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .info p{font-size:10px;width:50%;margin-right:50px;}}/*!sc*/ .ensLvG .background{position:absolute;z-index:1;}/*!sc*/ .ensLvG .background .l1{width:400px;height:600px;background-color:#29c929;border-radius:30%;position:absolute;left:-200px;top:-10px;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .background .l1{width:200px;height:300px;left:-100px;top:-5px;}}/*!sc*/ .ensLvG .background .d1{width:400px;height:600px;background-color:#007200;position:absolute;left:300px;top:-10px;z-index:4;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .background .d1{width:220px;height:300px;left:140px;top:-5px;}}/*!sc*/ .ensLvG .background .l2{width:120px;height:200px;background-color:#29c929;border-radius:40px;position:absolute;left:250px;top:-100px;-webkit-transform:rotate(55deg);-ms-transform:rotate(55deg);transform:rotate(55deg);}/*!sc*/ @media screen and (max-width:690px){.ensLvG .background .l2{width:60px;height:100px;left:125px;top:-50px;}}/*!sc*/ .ensLvG .background .l3{width:120px;height:200px;background-color:#29c929;border-radius:60px;position:absolute;left:690px;top:-50px;-webkit-transform:rotate(55deg);-ms-transform:rotate(55deg);transform:rotate(55deg);z-index:5;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .background .l3{width:60px;height:100px;left:345px;top:-25px;border-radius:30px;}}/*!sc*/ .ensLvG .background .d2{width:200px;height:200px;background-color:#007200;position:absolute;left:250px;border-radius:50%;top:-60px;z-index:4;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .background .d2{width:100px;height:100px;left:125px;top:-30px;}}/*!sc*/ .ensLvG .background .m1{width:70px;height:70px;background-color:#009300;position:absolute;left:250px;border-radius:50%;top:123px;z-index:5;}/*!sc*/ @media screen and (max-width:690px){.ensLvG .background .m1{width:40px;height:40px;left:115px;top:56px;}}/*!sc*/ data-styled.g150[id="sc-a0a54eeb-0"]{content:"ensLvG,"}/*!sc*/ .jvdbKp{max-width:850px;margin:auto;}/*!sc*/ .jvdbKp h4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:3rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;text-transform:uppercase;margin:5rem 0 rem 0;}/*!sc*/ .jvdbKp a{margin:0px;}/*!sc*/ .jvdbKp .web-tags{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ @media screen and (max-width:850px){.jvdbKp h4{margin-left:3rem;margin-bottom:3rem;font-size:2.5rem;}}/*!sc*/ @media screen and (max-width:650px){.jvdbKp .web-tags{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-left:2rem;}.jvdbKp h4{margin-left:3rem;margin-bottom:3rem;font-size:2rem;}}/*!sc*/ @media screen and (max-width:480px){.jvdbKp{margin:0;}.jvdbKp h4{margin-left:1rem;margin-bottom:1rem;font-size:2rem;}.jvdbKp .web-tags{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}}/*!sc*/ data-styled.g151[id="sc-fee3e5e9-0"]{content:"jvdbKp,"}/*!sc*/ .dzAAXf{padding:0.5rem 1.5rem;margin:0 1rem 1rem 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 3px 0 lightgray;}/*!sc*/ .dzAAXf:hover{background:#138a36;color:white;}/*!sc*/ @media screen and (max-width:640px){.dzAAXf{font-size:1.2rem;padding:0.5rem 1.5rem;}}/*!sc*/ data-styled.g152[id="sc-fee3e5e9-1"]{content:"dzAAXf,"}/*!sc*/ .yKmBk{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;margin:5px;}/*!sc*/ data-styled.g153[id="sc-fee3e5e9-2"]{content:"yKmBk,"}/*!sc*/ </style></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WGQVQ44" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="__next" data-reactroot=""><div class="sc-9d336bae-0 bRkRGv"><header class="sc-eeb22f6c-0 eTNptX"><div class="mainNav" style="background:;background-image:"><div class="left-portion"><div class="search-container active"><div class="input-holder"><div class="ais-SearchBox"><form novalidate="" class="ais-SearchBox-form" action="" role="search"><input type="search" placeholder="Discover Anything" autoComplete="off" autoCorrect="off" autoCapitalize="off" spellcheck="false" required="" maxLength="512" value="" class="ais-SearchBox-input"/><button type="submit" title="Submit your search query." class="ais-SearchBox-submit"><svg class="ais-SearchBox-submitIcon" xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 40 40" aria-hidden="true"><path d="M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z"></path></svg></button><button type="reset" title="Clear the search query." class="ais-SearchBox-reset" hidden=""><svg class="ais-SearchBox-resetIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="10" height="10" aria-hidden="true"><path d="M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z"></path></svg></button></form></div><img src="https://hackernoon.imgix.net/search-new.png?w=19&h=19" class="search" alt="Search icon" width="19" height="19"/></div></div></div><a class="logo" href="/"><span class="desktop" style="background-color:;padding:5px;border-radius:5px"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27248%27%20height=%2740%27/%3e"/></span><img alt="Hackernoon logo" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Hackernoon logo" srcSet="https://hackernoon.imgix.net/hn-logo.png?auto=format&fit=max&w=256 1x, https://hackernoon.imgix.net/hn-logo.png?auto=format&fit=max&w=640 2x" src="https://hackernoon.imgix.net/hn-logo.png?auto=format&fit=max&w=640" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></span><span class="mobile"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2737%27%20height=%2740%27/%3e"/></span><img alt="Hackernoon logo" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Hackernoon logo" srcSet="https://hackernoon.imgix.net/hn-icon.png?auto=format&fit=max&w=48 1x, https://hackernoon.imgix.net/hn-icon.png?auto=format&fit=max&w=96 2x" src="https://hackernoon.imgix.net/hn-icon.png?auto=format&fit=max&w=96" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></span></a><div class="right-portion"><div style="width:fit-content" class="sc-eeb22f6c-1 cOdmIY"><a style="color:#003b00;border-color:#003b00;background-color:#88ff88;border-radius:5px" href="/reader-boot" class="sc-b3d23cc4-0 jECpNX">Read</a><a style="color:#003b00;border-color:#003b00;background-color:#88ff88;border-radius:5px;margin-right:2rem" href="https://app.hackernoon.com/new" class="sc-b3d23cc4-0 jECpNX">Write</a></div><div><img width="35" height="35" src="https://hackernoon.imgix.net/unread-bell.png?w=40" style="vertical-align:middle" alt="see notifications" class="sc-4d156c87-0 hslCzy"/><div class="sc-4d156c87-1 izlxCY"><div class="header">Notifications</div><div class="content"></div><div style="display:flex"><div class="more">see <!-- --> more</div></div></div></div><div class="sc-dd1bca92-0 jSiCMG"><div data-focus-guard="true" tabindex="-1" style="width:1px;height:0px;padding:0;overflow:hidden;position:fixed;top:1px;left:1px"></div><div data-focus-lock-disabled="disabled"><button aria-label="Toggle menu" aria-expanded="false" aria-controls="main-menu" class="sc-14b24a79-0 ihbTZc"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 20" width="22" style="fill:"><path style="fill:" d="M21 9h1v2h-1v1H1v-1H0V9h1V8h20v1zM21 17h1v2h-1v1H1v-1H0v-2h1v-1h20v1zM22 1v2h-1v1H1V3H0V1h1V0h20v1h1z"></path></svg></button><div aria-hidden="true" style="background-color:" class="sc-16ad823d-0 bfEqpI"><div class="mobile-header"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e"/></span><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="hackernoon-logo" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img srcSet="https://hackernoon.imgix.net/hn-icon.png?auto=format&fit=max&w=96 1x, https://hackernoon.imgix.net/hn-icon.png?auto=format&fit=max&w=96 2x" src="https://hackernoon.imgix.net/hn-icon.png?auto=format&fit=max&w=96" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="hackernoon-logo" loading="lazy"/></noscript></span><div class="mobile-header-left"><a href="https://app.hackernoon.com/signup" class="mobile-auth">LOGIN / SIGNUP</a><img class="close-nav-img" src="https://hackernoon.imgix.net/icons/SVG/awesome/Window%20Close.svg"/></div></div><div class="sc-16ad823d-1 kcgCcU"></div></div></div><div data-focus-guard="true" tabindex="-1" style="width:1px;height:0px;padding:0;overflow:hidden;position:fixed;top:1px;left:1px"></div></div></div></div><div class="sc-72f8e89d-0 lkKurX subNav" style="border-top:;background-color:;color:"><ul style="background-color:" class="sc-b69cf9f6-0 kTjQvw"></ul></div><div><div style="background:;color:" class="sc-507e8eeb-0 iocYRY"><a class="logo" href="/"><img src="/hn-logo.png" alt="Hackernoon logo"/></a><a style="color:" class="daLink" target="_blank" rel="sponsored"><span style="color:;display:flex;align-items:center;background:;padding:0 10px;border-radius:5px"></span></a><div class="colorPickerIcon"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2725%27%20height=%2725%27/%3e"/></span><img alt="paint-brush" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="paint-brush" srcSet="https://hackernoon.imgix.net/brush2.png?w=25&auto=format&fit=max 1x, https://hackernoon.imgix.net/brush2.png?w=25&auto=format&fit=max 2x" src="https://hackernoon.imgix.net/brush2.png?w=25&auto=format&fit=max" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></div></div></div><div class="sc-9de06f04-0 byYhvg story-nav show"><div class="title"><span class="story-title">How To Launch Your Own Production-ready Cryptocurrency</span><span class="by"> <!-- -->by</span><a class="profile" href="/u/adam.bavosa">@<!-- -->adam.bavosa</a><div class="profile-img"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e"/></span><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img srcSet="https://cdn.hackernoon.com/avatars/robot-a3.png?auto=format&fit=max&w=32 1x, https://cdn.hackernoon.com/avatars/robot-a3.png?auto=format&fit=max&w=64 2x" src="https://cdn.hackernoon.com/avatars/robot-a3.png?auto=format&fit=max&w=64" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></div></div><div class="sharing"></div></div></header><div style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><main class="sc-9d336bae-1 ghWRJY"><div class="sc-d7dc08c8-0 kdGQZh"><div class="sc-93e186d7-0 eROqxA"><div class="metaContainer desktop-no-show"><div class="sc-93e186d7-5 fEpdfH"><div class="sc-93e186d7-4 ehdhzV"><span class="story-stat"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" width="22" style="width:14px;fill:darkgray"><path style="width:14px;fill:darkgray" d="M22 7v2h-1v1h-1v1h-1v1h-1v1h-1v5h1v4h-2v-1h-2v-1h-2v-1h-2v1H8v1H6v1H4v-4h1v-5H4v-1H3v-1H2v-1H1V9H0V7h7V5h1V3h1V1h1V0h2v1h1v2h1v2h1v2h7z"></path></svg> <!-- -->26,767<!-- --> <!-- -->reads</span></div></div></div><div class="story-topLine"><div class="story-stats"><span class="story-stat mobile-no-show"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" width="22" style="width:14px"><path style="width:14px" d="M22 7v2h-1v1h-1v1h-1v1h-1v1h-1v5h1v4h-2v-1h-2v-1h-2v-1h-2v1H8v1H6v1H4v-4h1v-5H4v-1H3v-1H2v-1H1V9H0V7h7V5h1V3h1V1h1V0h2v1h1v2h1v2h1v2h7z"></path></svg> <!-- -->26,767<!-- --> <!-- -->reads</span></div><div class="story-admin"></div></div><h1 class="story-title" style="text-align:left">How To Launch Your Own Production-ready Cryptocurrency</h1><div class="title-bottom"><div class="title-bottom-left"><span class="header-handle " data-tip="true" data-for="story-author" aria-label="bookmark story" data-delay-hide="1000"><span> by </span><a> <!-- -->Adam Bavosa</a></span><span class="divider-bullet"></span><span class="published-date">February 14th, 2018</span></div><div class="title-bottom-right"><div style="flex-shrink:0"><span style="display:flex;cursor:pointer" data-tip="true" data-for="terminal-view"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2720%27%20height=%2720%27/%3e"/></span><img alt="Read on Terminal Reader" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Read on Terminal Reader" srcSet="https://hackernoon.imgix.net/computer.png?auto=format&fit=max&w=32 1x, https://hackernoon.imgix.net/computer.png?auto=format&fit=max&w=48 2x" src="https://hackernoon.imgix.net/computer.png?auto=format&fit=max&w=48" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></span></div><div style="flex-shrink:0"><span style="display:flex;cursor:pointer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2720%27%20height=%2720%27/%3e"/></span><img alt="Read this story w/o Javascript" data-tip="true" data-for="arweave-backup" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Read this story w/o Javascript" data-tip="true" data-for="arweave-backup" srcSet="https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format&fit=max&w=32 1x, https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format&fit=max&w=48 2x" src="https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format&fit=max&w=48" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></span></div></div></div><div class="divider-line"></div><div class="tldr-langs"><div class="sc-93e186d7-5 fEpdfH"><div class="sc-93e186d7-4 ehdhzV"><div class="sc-93e186d7-1 eiYCFa"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2750%27%20height=%2715%27/%3e"/></span><img alt="Open TLDR" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="tldr-logo" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Open TLDR" srcSet="https://hackernoon.imgix.net/tl;dr-dark.png?auto=format&fit=max&w=64 1x, https://hackernoon.imgix.net/tl;dr-dark.png?auto=format&fit=max&w=128 2x" src="https://hackernoon.imgix.net/tl;dr-dark.png?auto=format&fit=max&w=128" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="tldr-logo" loading="lazy"/></noscript></span><img src="https://hackernoon.imgix.net/arrow-dark.png" alt="tldt arrow" width="12px" height="12px" class="tldr-arrow "/></div></div></div><div class="sc-93e186d7-3 bhpHZN"></div></div><div class="tldr-no-show"><h2>Too Long; Didn't Read</h2><em>This article covers </em><a href="https://hackernoon.com/tagged/blockchain" target="_blank"><em>blockchain</em></a><em> programming for </em><a href="https://hackernoon.com/tagged/cryptocurrency" target="_blank"><em>cryptocurrency</em></a><em>, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.</em><div class="mentions-container"><div class="mentions-box"><h3>Company<!-- --> Mentioned</h3><div class="mentions-img-wrapper"><div title="fees" class="sc-93e186d7-6 dPrQoP"><a href="/company/fees" style="text-align:left" target="_blank" rel="noopener noreferrer"><div class="img"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e"/></span><img data-tip="true" data-for="tldr-mention-fees" alt="Mention Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain"/><noscript><img data-tip="true" data-for="tldr-mention-fees" alt="Mention Thumbnail" srcSet="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fcompany-news-fallback.jpeg?alt=media&token=3d46938d-374a-40ad-8b75-040adf039b00&auto=format&fit=max&w=32 1x, https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fcompany-news-fallback.jpeg?alt=media&token=3d46938d-374a-40ad-8b75-040adf039b00&auto=format&fit=max&w=64 2x" src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fcompany-news-fallback.jpeg?alt=media&token=3d46938d-374a-40ad-8b75-040adf039b00&auto=format&fit=max&w=64" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" class="img" loading="lazy"/></noscript></span></div></a></div></div></div><div class="mentions-box"><h3>Coin<!-- --> Mentioned</h3><div class="mentions-img-wrapper"><div title="Ethereum" class="sc-93e186d7-6 dPrQoP"><a href="/coins/ETH" style="text-align:left" target="_blank" rel="noopener noreferrer"><div class="img"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e"/></span><img data-tip="true" data-for="tldr-mention-ETH" alt="Mention Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain"/><noscript><img data-tip="true" data-for="tldr-mention-ETH" alt="Mention Thumbnail" srcSet="https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png?auto=format&fit=max&w=32 1x, https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png?auto=format&fit=max&w=64 2x" src="https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png?auto=format&fit=max&w=64" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" class="img" loading="lazy"/></noscript></span></div></a></div></div></div></div></div></div><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%271380%27%20height=%27600%27/%3e"/></span><img alt="featured image - How To Launch Your Own Production-ready Cryptocurrency" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="image-container feat" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="featured image - How To Launch Your Own Production-ready Cryptocurrency" srcSet="https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png?auto=format&fit=max&w=1920 1x, https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png?auto=format&fit=max&w=3840 2x" src="https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png?auto=format&fit=max&w=3840" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="image-container feat" loading="lazy"/></noscript></span><div style="grid-column:1 / -1"></div><div class="sc-6d048d67-0 buhXYs profile"><div class="sc-6d048d67-1 cziptZ"><div class="profileImageContainer "><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img data-for="author-tooltip" data-tip="true" data-delay-hide="200" alt="Adam Bavosa HackerNoon profile picture" href="/u/adam.bavosa" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" class="profileImage " style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:cover"/><noscript><img data-for="author-tooltip" data-tip="true" data-delay-hide="200" alt="Adam Bavosa HackerNoon profile picture" href="/u/adam.bavosa" sizes="100vw" srcSet="https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 640w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 750w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 828w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 1080w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 1200w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 1920w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 2048w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max 3840w" src="https://hackernoon.imgix.net/avatars/robot-a3.png?w=100&auto=format&fit=max" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:cover" class="profileImage " loading="lazy"/></noscript></span></div></div></div><div><div class="sc-2e79ac2f-0 ktrYOp"><div><p><span><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%271380%27%20height=%27600%27/%3e"/></span><img alt="" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="image-container undefined" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="" srcSet="https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png?auto=format&fit=max&w=1920 1x, https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png?auto=format&fit=max&w=3840 2x" src="https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png?auto=format&fit=max&w=3840" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="image-container undefined" loading="lazy"/></noscript></span></span></p> <p><em>This article covers</em> <a href="https://hackernoon.com/tagged/blockchain?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc"><em>blockchain</em></a> <em>programming for</em> <a href="https://hackernoon.com/tagged/cryptocurrency?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc"><em>cryptocurrency</em></a><em>, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.</em></p> <p>The way we do money is changing. What can you do to keep up? Blockchain and cryptocurrency have been around for years, but only in the past several months has the conversation spread far beyond arcane internet forums and tech company break rooms.</p> <p>Maybe it’s time for you to make your own cryptocurrency, to make your own medium of exchange for goods and services. That may sound complicated! But it’s simpler than you would expect — thanks to the great strides the decentralization community has made and continues to innovate with.</p> <h3>Bank of the Future</h3> <p>A cryptocurrency replaces today’s bank. Banks keep track of the amount of money you have in an account. Instead of trusting a single institution to keep track of this for you, you can trust a massive computer network made up of anyone and everyone to keep track, publicly. The collective computers in this network confirm every single transaction of currency that ever happened and ever will happen. This public consensus is the assurance that people rely on when using cryptocurrency for payment.</p> <p>Your own cryptocurrency can be the token that you accept for business — kind of like tokens in an arcade. This currency can be brought into existence today. The first step is to choose a big, decentralized computer network that is constantly confirming the legitimacy of new additions to its blockchain. Let’s go with Ethereum.</p> <h3>Smart Contract Programming</h3> <p>Ethereum is a decentralized computing platform for executing smart contracts. These are programs that run code in a transparent environment, without the possibility of third-party tampering. A user’s private key is used to create a fundamentally unique signature for every request that executes a smart contract (<em>see</em> <a href="https://theethereum.wiki/w/index.php/Accounts,_Addresses,_Public_And_Private_Keys,_And_Tokens?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc"><em>this wiki</em></a> <em>if you are not familiar with asymmetrical cryptography</em>).</p> <p>The Ethereum community has a sizable following of open source software engineers that are relentlessly developing amazing tools for the greater good of humanity. To make your own cryptocurrency on the Ethereum network, you need these four tools:</p> <ul> <li><a href="https://solidity.readthedocs.io/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Solidity</a> — An Ethereum smart contract programming language.</li> <li><a href="http://truffleframework.com/docs/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Truffle Framework</a> — An Ethereum development kit.</li> <li><a href="https://github.com/ethereum/wiki/wiki/JavaScript-API?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Web3.js</a> — A JavaScript package for interacting with the Ethereum network with an internet browser or Node.js.</li> <li>Ether (ETH) — The currency of the <a href="https://ethereum.org/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Ethereum network</a>.</li> </ul> <p>Optional tools:</p> <ul> <li><a href="https://metamask.io/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">MetaMask</a> — a Chrome extension for crypto payments.</li> </ul> <p>Cryptocurrency is merely one of limitless <a href="https://hackernoon.com/the-industries-beyond-cryptocurrency-that-will-be-transformed-by-blockchain-developers-be70a62937ef?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">use-cases for a blockchain</a>. The brilliant community rallying around Solidity makes it attractive to invest effort in building decentralized apps with Ethereum. First let’s build your own cryptocurrency to start learning blockchain development.</p> <h3>Developing the ERC-20 Token</h3> <p>The Ethereum community has established some standards regarding the functionality of smart contracts, including tokens. The cryptocurrency token in this tutorial is based on the <a href="https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">ERC-20 Token Standard</a>.</p> <p>If you don’t have node.js, install it now (<em>The tests in below will not work with versions earlier than</em> <strong><em>node.js 8</em></strong>). Then open a terminal window and do:</p> <p class="line-space"> <br/> </p><p class="line-space"> <br/> </p><p class="line-space"> <br/> </p><p class="line-space"> <br/> </p><p>npm install -g trufflemkdir MyToken && cd MyTokentruffle initnpm init -ynpm install -E zeppelin-solidity</p><p>This installs the Truffle CLI, creates a project directory for your token, and installs an open source Solidity library called <a href="https://github.com/OpenZeppelin/zeppelin-solidity?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">OpenZeppelin</a>.</p> <p>Next we can begin writing our Solidity contract. Take a few minutes to familiarize yourself with <a href="https://en.wikipedia.org/wiki/Solidity?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Solidity</a> as well as the <strong>DANGERS</strong> <a href="https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md?ref=hackernoon.com#approve" target="_blank" rel="noopener noreferrer ugc">noted in the Token Standard</a>. In your project directory, create a file in the auto-generated <code>contracts/</code> folder and name it <strong>Token.sol</strong>. Add the following code that follows the ERC-20 Token Standard specification.</p> <p>This token is not mineable and there is a fixed supply. By default, there are <strong>1 billion tokens</strong>, and each token can be divided into fractions up to 18 decimal places. The smallest fraction of a token is referred to as <strong>Wei</strong> in Ethereum or <strong>Satoshi</strong> in Bitcoin. You can change these numbers, the token name, and the token symbol to whatever you want (<em>see the above constructor function</em>).</p> <p>Once this code is deployed to the main Ethereum network, anyone who wants to send or receive your token will execute the code in this contract. The <code>balances</code> map is the data structure that holds all of the information regarding who owns tokens. The <strong>address</strong> is the wallet owner’s public key, and the <strong>unsigned 256 bit integer</strong> is the number of token Wei in the wallet.</p> <h3>Read vs. Write</h3> <p>Read and Write operations for the blockchain have two easy rules: reads are free, writes are not. Since we are using the Ethereum network, <strong>ETH needs to be spent</strong> by the caller when doing blockchain additions. Additions are made by functions that change state, like transferring tokens from one wallet to another. This can be contrasted with read functions, such as viewing the balance of a wallet. Read functions add no new data to the blockchain and they are always <strong>free to execute</strong>.</p> <h3>Test Your Code</h3> <p>Before we deploy our contract, we should thoroughly test it. Truffle includes <a href="http://truffleframework.com/docs/getting_started/solidity-tests?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Solidity test</a> and <a href="http://truffleframework.com/docs/getting_started/javascript-tests?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">JavaScript test</a> documentation in their getting started guide. I’ve included sample integration tests with JavaScript (truffle-keys <a href="https://github.com/ajb413/erc20-ethereum-token/blob/master/test/truffle-keys.js?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">here</a>).</p> <p><strong>test/integration.test.js — node.js 8 or later</strong></p> <p>The tests here are not exhaustive, but they are a good starting point for an engineer that is learning Solidity. This test file can only be run inside of the <code>truffle develop</code> environment.</p> <p>In order to migrate the contract to an Ethereum client using truffle, add this file <strong>2_deploy_contracts.js</strong> to <code>migrations/</code>. This migration step is required for the tests to run.</p> <p>To run the integration tests we will use the Truffle CLI:</p> <p>npm i ethereumjs-tx</p> <p class="line-space"> <br/> </p><p>truffle developtruffle(develop)> test</p><p><a href="http://truffleframework.com/docs/getting_started/console?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">The truffle develop command</a> boots a test blockchain on your local machine. The test network has 10 default Ethereum key pairs that each have <strong>100 ETH</strong> every time the server is started. These keys will call the functions in your Solidity contract to test their functionality.</p> <p>The <code>test</code> command will execute all of the tests in the <code>test/</code> folder. Explore the <code>integration.test.js</code> file to learn exactly what the tests are doing to your test wallets and test blockchain.</p> <h3>Deploying</h3> <p>After you are comfortable with, Solidity, network gas prices, and writing your own tests, you can put your token on a public test network. The <strong>Ropsten network</strong> is one of several public test networks used for Ethereum development. Network connections can be <a href="http://truffleframework.com/docs/advanced/configuration?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">configured</a> in the <code>truffle.js</code> file.</p> <p>If you do not have an Ethereum wallet of your own, I suggest you make one now. If you do not have a mnemonic and wallet, use <a href="https://iancoleman.io/bip39/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">this tool</a> to generate one. Select <strong>ETH</strong> in the coin dropdown, and click the English button. <strong>Save the mnemonic somewhere safe and secure!</strong></p> <p>It’s a good idea to make separate wallets for test and main networks, so it’s less likely that you’ll have an ETH wasting accident. Add your Ethereum key set mnemonic to your environment variables as <code>ethereum_mnemonic</code> like referenced in the above truffle config file.</p> <p class="line-space"> <br/> </p><p>## bashexport ethereum_mnemonic="candy maple cake...."</p><p>If you do not have test ETH in your wallet on the Ropsten network, install the MetaMask Chrome extension to get some for free from a <a href="https://faucet.metamask.io/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">faucet</a>. In order to execute a transaction in your token contract, you need to spend some ETH on fees — work that is done in the network on your behalf.</p> <p>truffle migrate --network ropsten</p> <p>This command will log the <strong>contract address</strong>, be sure to save it! Migrate uses the <code>--network</code> flag and refers to the <code>ropsten</code> key in the networks object in <code>truffle.js</code>. An object for the main Ethereum network can be included like the Ropsten object. I excluded it from my truffle box code for safety reasons. See the "live" connection object in this <a href="http://truffleframework.com/tutorials/deploying-to-the-live-network?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Truffle Tutorial</a> for the <strong>Main Ethereum network.</strong></p> <p>Once your token contract is deployed, you can review your token balance using the MetaMask Chrome extension. In the MetaMask UI, select the Ropsten Test Network from the dropdown picker on the top left, then click the tokens tab. Click the <strong>Add Token</strong> button and input your contract address that was logged from the <code>truffle migrate</code> command.</p> <p>MetaMask can transfer token, or you can create your own contract invoking UI with Web3.js. The token contract above is exciting to see for ICO developers, but it isn’t able to do the newsworthy <strong>crowdsale</strong> out of the box. Let’s make that happen.</p> <h3>Crowdsales</h3> <p>Now that you have installed Truffle, used the CLI, explored Solidity, and written some test code, we can unbox an existing Truffle project — <strong>Crowdsalable Ethereum Token</strong>. Let’s make a new directory and pull this project directly from <a href="https://github.com/ajb413/crowdsalable-eth-token?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">my Github repo</a> using the Truffle CLI.</p> <p class="line-space"> <br/> </p><p>mkdir crowdsalable-eth-token && cd crowdsalable-eth-tokentruffle unbox <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="395e504d795e504d514c5b175a5654">[email protected]</a>:ajb413/crowdsalable-eth-token.git</p><p>This Truffle project has a more robust implementation of an Ethereum token. The token name and symbol can be changed by the owner after the contract is already deployed. The owner can also <strong>configure and open new crowdsales at any time.</strong></p> <p>The truffle box comes with a development mode UI for executing contracts on the local Ethereum client. The UI uses the 10 static wallets that the <code>truffle develop</code> command initializes on your machine - to execute transfers, view wallet balances, and launch the exciting crowdsale.</p> <h3>Broadcast Crowdsale Announcements</h3> <p>The <code>app/</code> folder contains the web UI and also an extra bit of PubNub magic. When a crowdsale is launched, the owner has the option to <strong>text message</strong> all of their followers with the crowdsale details, so they can begin purchasing your token.</p> <p>This functionality is powered by the ClickSend API and PubNub Functions. In order to enable this realtime updating feature, you must sign up for <a href="https://admin.pubnub.com/?ref=hackernoon.com#/register?utm_source=Syndication&utm_medium=Medium&utm_campaign=SYN-CY18-Q1-Medium-February-13&utm_content=byo-crypto" target="_blank" rel="noopener noreferrer ugc">PubNub</a> and <a href="https://www.clicksend.com/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">ClickSend</a>. You insert your <strong>api key</strong>, <strong>publish key</strong>, and <strong>subscribe key</strong> where noted in <strong>app.js</strong> and <strong>sms-handler.js</strong>. Also edit the JavaScript array of <strong>Phone Numbers</strong> to choose who receives an SMS.</p> <p>excerpt from <strong>app/js/app.js</strong></p> <p>excerpt from <strong>app/pubnub-functions/sms-handler.js — <em>Deploy this to PubNub Functions!</em></strong></p> <p>The PubNub Function event handler must be deployed in the <a href="https://admin.pubnub.com/?utm_source=Syndication&utm_medium=Medium&utm_campaign=SYN-CY18-Q1-Medium-February-13&utm_content=byo-crypto&ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">PubNub Admin Dashboard</a>. See <a href="https://www.pubnub.com/docs/blocks/tutorials/hello-world?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">this tutorial</a> for deploying function event handler code in 2 minutes.</p> <h3>A Development UI with Web3.js</h3> <p>Next we run the local Ethereum client the same way we did earlier.</p> <p class="line-space"> <br/> </p><p class="line-space"> <br/> </p><p>cd crowdsalable-eth-tokennpm itruffle develop</p><p>## Truffle development blockchain and console are booted</p> <p class="line-space"> <br/> </p><p class="line-space"> <br/> </p><p>truffle(develop)> compiletruffle(develop)> migratetruffle(develop)> test</p><ul> <li>Leave the truffle console running</li> <li>Open a new command line window</li> <li>Navigate to the same project directory</li> <li>Run the development UI with:</li> </ul> <p>npm run dev</p> <p class="line-space"> <br/> </p><p>> crowdsalable-eth-token dev /crowdsalable-eth-token> webpack-dev-server</p><p>Project is running at <a href="http://localhost:8080/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">http://localhost:8080/</a></p> <p>Next, open the UI in your browser and explore the key features. We can:</p> <ul> <li>Launch a new crowdsale</li> <li>Transfer token from wallet to wallet</li> <li>Purchase token from a crowdsale using ETH</li> <li>Check the balance of any wallet</li> </ul> <p>The nature of the development environment allows anyone to invoke functions like <code>createCrowdsale</code> and <code>transfer</code>, when in reality, these methods cannot be invoked by just anyone. For <code>onlyOwner</code> decorated Solidity functions, the invoker must be the owner of the contract and must sign their requests with their private key (<em>see</em> <code>_rawTransaction_</code> <em>function in</em> <strong><em>test/integration.test.js</em></strong>). Also functions like <code>transfer</code> will only be able to send token from the wallet that the private key belongs to. This will be more restrictive on the main network for the right reasons.</p> <p>web3.eth.sendRawTransaction(...)</p> <p>After you have deployed your <strong>PubNub Function</strong>, you are able to launch a crowdsale and <strong>send a mass SMS</strong> to all of your followers when the contract opens. Input a name, click the <strong>Launch</strong> button, and check your phone!</p> <p>The configuration of the crowdsale is specified in the <code>app/js/app.js</code> script in the <code>launchCrowdsale</code> event handler. By default, the crowdsale is open forever, starts with <strong>100,000 TOK</strong> to sell, and a buyer receives <strong>3 TOK per ETH</strong> that they pay.</p> <p>Use the default wallet public keys listed at the bottom of the UI for transfers, purchases, and balance checks. Remember, on this network, the wallets each have 100 fake ETH to play with.</p> <p>If you’ve made it this far, you now have some command over blockchain and PubNub. To recap, we covered:</p> <ul> <li>What cryptocurrencies are</li> <li>How to build an Ethereum token that is compliant with the standard</li> <li>How to transfer the token and invoke contract methods</li> <li>How to test all of the contract code</li> <li>How to create a crowdsale</li> <li>How to broadcast an announcement to all of your followers with PubNub</li> </ul> <p>The true power of blockchain is yet to be realized because the technology is only recently picking up widespread interest. PubNub will stay involved. For live demonstrations of blockchain programming, check out our <a href="https://www.pubnub.com/company/events/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">events</a> and <a href="https://www.meetup.com/MobileDeveloperGroup/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer ugc">Meetup</a> page. Best of luck to you in your blockchain adventures!</p></div><div style="visibility:hidden" class="sc-2e79ac2f-8 cdKvIK"><button><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" width="22" style="width:18px;fill:white"><path style="width:18px;fill:white" d="M16 9h1v2h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1H9v1H8v1H7v1H6v1H0v-6h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1V9h1V8h1V7h1V6h1V5h2v1h1v1h1v1h1v1zM22 4v2h-1v1h-1v1h-1v1h-1V8h-1V7h-1V6h-1V5h-1V4h-1V3h1V2h1V1h1V0h2v1h1v1h1v1h1v1h1z"></path></svg></button><button><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 22" width="22" style="width:18px;fill:white"><path style="width:18px;fill:white" d="M20 3v2h-1v2h-1v1h-5V7h-2v1h-1v1H9v4h1v1h1v1h2v-1h5v1h1v2h1v2h-1v2h-1v1h-5v-1h-1v-2h-1v-2h-1v-1H9v-1H8v-1H7v1H2v-1H1v-2H0v-2h1V8h1V7h5v1h1V7h1V6h1V5h1V3h1V1h1V0h5v1h1v2h1z"></path></svg></button><button><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 22" width="22" style="width:18px;fill:white"><path style="width:18px;fill:white" d="M14 19v2h-1v1H1v-1H0V5h1V4h3v15h10z"></path><path style="width:18px;fill:white" d="M20 6v11h-1v1H6v-1H5V1h1V0h8v6h6z"></path><path style="width:18px;fill:white" d="M20 4v1h-5V0h1v1h1v1h1v1h1v1h1z"></path></svg></button><a style="margin-left:15px;color:white" href="#commentSection"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 19" width="22" style="width:18px;fill:white"><path style="width:18px;fill:white" d="M21 6V4h-1V3h-1V2h-2V1h-3V0H8v1H5v1H3v1H2v1H1v2H0v6h1v2h1v2H1v1H0v2h5v-1h1v-1h2v1h6v-1h3v-1h2v-1h1v-1h1v-2h1V6h-1ZM6 13h1v-1h1v-2H6V5h4v8H9v1H6v-1Zm6 0h1v-1h1v-2h-2V5h4v8h-1v1h-3v-1Z"></path></svg></a><button style="margin-right:10px"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="22" style="width:18px;fill:white"><path style="width:18px;fill:white" d="M20 2v12h-1v1h-2v1h-6v-1H4v1H3v4H1V3H0V1h1V0h2v1h1v2H3v1h1V3h7v1h6V3h2V2h1z"></path></svg></button><div class="sc-2e79ac2f-9 kIDgmw"></div></div></div></div><span style="width:1px;height:1px"></span></div><div class="sc-738aab49-0 gYRgFU"><div class="dabytag"><div class="sc-a0a54eeb-0 ensLvG"><a href="https://bit.ly/4fb8Vca" target="_blank"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Fastex" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Fastex" sizes="100vw" srcSet="https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=640 640w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=750 750w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=828 828w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=1080 1080w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=1200 1200w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=1920 1920w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=2048 2048w, https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=3840 3840w" src="https://hackernoon.imgix.net/images/img-ap23061.jpeg?auto=format&fit=max&w=3840" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span> </a></div></div><div style="display:flex;align-items:flex-end;justify-content:center"><div>L O A D I N G<br/>. . . comments & <span style="font-style:italic"> more!</span><br/></div></div><br/><section><div class="sc-104e382f-0 dGrQDi authorBio-section"><h3>About Author</h3><div class="row"><div class="avatar "><a href="/u/adam.bavosa"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Adam Bavosa HackerNoon profile picture" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:cover"/><noscript><img alt="Adam Bavosa HackerNoon profile picture" sizes="100vw" srcSet="https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 640w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 750w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 828w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 1080w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 1200w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 1920w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 2048w, https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max 3840w" src="https://hackernoon.imgix.net/avatars/robot-a3.png?w=200&auto=format&fit=max" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:cover" loading="lazy"/></noscript></span></a></div><div class="author-info"><div class="author-info-top"><span class="author-name-handle"><strong>Adam Bavosa</strong><span class="handle"><a href="/u/adam.bavosa">@<!-- -->adam.bavosa</a></span></span><div class="sc-9d94a5e5-4 jtwMgp"><form class="author-email-form"><div class="emailContainer"><input type="email" placeholder="name@company.com" name="email" required="" value=""/><button class="sc-9d94a5e5-2 fEEqoW plus-icon subscribe-tooltip sub-btn"><div><span data-tip="true" data-for="subscribe-btn-tooltip">Subscribe <i class=""></i></span></div></button></div></form></div></div><span class="bio">Open Source Software Engineer</span><div class="author-cta-wrapper"><a class="bio-cta" href="/u/adam.bavosa"><i style="font-size:1.8rem"></i>Read my stories</a></div></div></div></div></section><div id="commentSection"></div><section class="topics-section"><h4>TOPICS</h4><div class="tags"><a class="sc-29806bfb-0 cdoWeI parent-category" href="/c/web3"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2720%27%20height=%2720%27/%3e"/></span><img alt="purcat-img" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="purcat-img" srcSet="https://cdn.hackernoon.com/icons/SVG/Web%203.svg?auto=format&fit=max&w=32 1x, https://cdn.hackernoon.com/icons/SVG/Web%203.svg?auto=format&fit=max&w=48 2x" src="https://cdn.hackernoon.com/icons/SVG/Web%203.svg?auto=format&fit=max&w=48" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span><span style="text-transform:uppercase;color:white;margin-left:1rem">web3</span></a><a class="sc-bc42364f-0 ghXAMP" href="/tagged/ethereum"> #<!-- -->ethereum</a><a class="sc-bc42364f-0 ghXAMP" href="/tagged/cryptocurrency"> #<!-- -->cryptocurrency</a><a class="sc-bc42364f-0 ghXAMP" href="/tagged/blockchain"> #<!-- -->blockchain</a><a class="sc-bc42364f-0 ghXAMP" href="/tagged/build-your-own-crypto"> #<!-- -->build-your-own-crypto</a><a class="sc-bc42364f-0 ghXAMP" href="/tagged/crypto"> #<!-- -->crypto</a></div></section><div class="sc-fee3e5e9-0 jvdbKp"><h4>THIS ARTICLE WAS FEATURED IN<!-- -->...</h4><div class="web-tags"><a href="https://www.arweave.net/riSJBHHSoQUYZ4y6WgXwy7tHsN1mY6a9s-lNpcAboP0" target="_blank" rel="nofollow" class="sc-fee3e5e9-2 yKmBk"><div style="width:fit-content" class="sc-fee3e5e9-1 dzAAXf"><div style="display:flex;align-items:center;justify-self:center"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2724%27%20height=%2724%27/%3e"/></span><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="filter:invert(0%);position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img srcSet="https://hackernoon.imgix.net/images/arweave.png?auto=format&fit=max&w=32 1x, https://hackernoon.imgix.net/images/arweave.png?auto=format&fit=max&w=48 2x" src="https://hackernoon.imgix.net/images/arweave.png?auto=format&fit=max&w=48" decoding="async" data-nimg="intrinsic" style="filter:invert(0%);position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span><div style="margin-left:5px">Permanent on Arweave</div></div></div></a><a href="https://terminal.hackernoon.com/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371?ref=hackernoon" target="_blank" rel="nofollow" class="sc-fee3e5e9-2 yKmBk"><div class="sc-fee3e5e9-1 dzAAXf"><span style="display:flex;cursor:pointer" data-tip="true" data-for="terminal-view"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2722%27%20height=%2722%27/%3e"/></span><img alt="Read on Terminal Reader" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Read on Terminal Reader" srcSet="https://hackernoon.imgix.net/computer.png?auto=format&fit=max&w=32 1x, https://hackernoon.imgix.net/computer.png?auto=format&fit=max&w=48 2x" src="https://hackernoon.imgix.net/computer.png?auto=format&fit=max&w=48" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></span> Terminal</div></a><a href="/lite/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371?ref=hackernoon" target="_blank" rel="nofollow" class="sc-fee3e5e9-2 yKmBk"><div class="sc-fee3e5e9-1 dzAAXf"><span style="display:flex;cursor:pointer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2722%27%20height=%2722%27/%3e"/></span><img alt="Read this story w/o Javascript" data-tip="true" data-for="lite-tooltip" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Read this story w/o Javascript" data-tip="true" data-for="lite-tooltip" srcSet="https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format&fit=max&w=32 1x, https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format&fit=max&w=48 2x" src="https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format&fit=max&w=48" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></span> Lite</div></a></div></div><section class="related-section"><h4>RELATED STORIES</h4><div class="articles-wrapper"><div><div><div class="sc-65adb81b-0 evreGv"><div class="img"><a href="https://bit.ly/4fb8Vca" style="display:contents" target="_blank" rel="noopener noreferrer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27260%27%20height=%27150%27/%3e"/></span><img alt="Article Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Article Thumbnail" srcSet="https://hackernoon.imgix.net/images/img-q8130qx.jpeg?auto=format&fit=max&w=500 1x, https://hackernoon.imgix.net/images/img-q8130qx.jpeg?auto=format&fit=max&w=500 2x" src="https://hackernoon.imgix.net/images/img-q8130qx.jpeg?auto=format&fit=max&w=500" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="img" loading="lazy"/></noscript></span></a></div><div class="text"><strong><a href="https://bit.ly/4fb8Vca" style="text-decoration:none;text-align:left" target="_blank" rel="noopener noreferrer">ftNFT YoCerebrum Awards 2024: Vote Now!!</a></strong><div class="card-title"><div class="card-info"><span class="author"><span style="color:gray">visit</span> <strong><a class="author-link" target="_blank" rel="noopener noreferrer" href="https://bit.ly/4fb8Vca"> <!-- -->Fastex<!-- --> </a></strong></span><div></div></div><a class="related ad-tag" target="_blank" rel="noopener noreferrer" href="https://bit.ly/4fb8Vca"><span class="centered "> <!-- -->#<!-- -->Sponsored</span></a></div></div></div></div></div><div class="sc-65adb81b-0 evreGv"><div class="img"><a href="../broadcast-ethereum-events-with-web3-js-and-pubnub-267f6e38210b" style="display:contents" target="_blank" rel="noopener noreferrer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27260%27%20height=%27150%27/%3e"/></span><img alt="Article Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Article Thumbnail" srcSet="https://hackernoon.imgix.net/fallback-feat.png?auto=format&fit=max&w=260 1x, https://hackernoon.imgix.net/fallback-feat.png?auto=format&fit=max&w=260 2x" src="https://hackernoon.imgix.net/fallback-feat.png?auto=format&fit=max&w=260" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="img" loading="lazy"/></noscript></span></a></div><div class="text"><strong><a href="../broadcast-ethereum-events-with-web3-js-and-pubnub-267f6e38210b" style="text-decoration:none;text-align:left" target="_blank" rel="noopener noreferrer">Broadcast Ethereum Events with Web3.js and PubNub</a></strong><div class="card-title"><div class="card-info"><span class="author"><span style="color:gray">by</span> <strong><a class="author-link" href="https://hackernoon.com/u/adam.bavosa">adam.bavosa<!-- --> </a></strong></span><div></div><div class="divider-bullet"></div><div class="date">May 24, 2018</div></div><a class="related" href="/tagged/ethereum"><span class="centered"> <!-- -->#<!-- -->ethereum</span></a></div></div></div><div class="sc-65adb81b-0 evreGv"><div class="img"><a href="../1-100-crypto-countdown-golem-5392489d463e" style="display:contents" target="_blank" rel="noopener noreferrer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27260%27%20height=%27150%27/%3e"/></span><img alt="Article Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Article Thumbnail" srcSet="https://hackernoon.imgix.net/hn-images/1*U0jdb07476TSAbJTShBk7Q.png?auto=format&fit=max&w=260 1x, https://hackernoon.imgix.net/hn-images/1*U0jdb07476TSAbJTShBk7Q.png?auto=format&fit=max&w=260 2x" src="https://hackernoon.imgix.net/hn-images/1*U0jdb07476TSAbJTShBk7Q.png?auto=format&fit=max&w=260" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="img" loading="lazy"/></noscript></span></a></div><div class="text"><strong><a href="../1-100-crypto-countdown-golem-5392489d463e" style="text-decoration:none;text-align:left" target="_blank" rel="noopener noreferrer">(1/100) Crypto Countdown: Golem</a></strong><div class="card-title"><div class="card-info"><span class="author"><span style="color:gray">by</span> <strong><a class="author-link" href="https://hackernoon.com/u/markbmilton">markbmilton<!-- --> </a></strong></span><div></div><div class="divider-bullet"></div><div class="date">Aug 23, 2018</div></div><a class="related" href="/tagged/blockchain"><span class="centered"> <!-- -->#<!-- -->blockchain</span></a></div></div></div><div class="sc-65adb81b-0 evreGv"><div class="img"><a href="../$joe-research-report" style="display:contents" target="_blank" rel="noopener noreferrer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27260%27%20height=%27150%27/%3e"/></span><img alt="Article Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Article Thumbnail" srcSet="https://hackernoon.imgix.net/images/FROzJqlEDZh6TKOy8qSvzctK75s2-8wa3j1c.jpeg?auto=format&fit=max&w=260 1x, https://hackernoon.imgix.net/images/FROzJqlEDZh6TKOy8qSvzctK75s2-8wa3j1c.jpeg?auto=format&fit=max&w=260 2x" src="https://hackernoon.imgix.net/images/FROzJqlEDZh6TKOy8qSvzctK75s2-8wa3j1c.jpeg?auto=format&fit=max&w=260" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="img" loading="lazy"/></noscript></span></a></div><div class="text"><strong><a href="../$joe-research-report" style="text-decoration:none;text-align:left" target="_blank" rel="noopener noreferrer">A Research Report on the Trader $JOE DeFi Platform</a></strong><div class="card-title"><div class="card-info"><span class="author"><span style="color:gray">by</span> <strong><a class="author-link" href="https://hackernoon.com/u/mbapesacademy">mbapesacademy<!-- --> </a></strong></span><div></div><div class="divider-bullet"></div><div class="date">Mar 20, 2022</div></div><a class="related" href="/tagged/cryptocurrency-investment"><span class="centered"> <!-- -->#<!-- -->cryptocurrency-investment</span></a></div></div></div><div class="sc-65adb81b-0 evreGv"><div class="img"><a href="../07-03-2018-biggest-stories-in-the-cryptosphere-e4608e633053" style="display:contents" target="_blank" rel="noopener noreferrer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27260%27%20height=%27150%27/%3e"/></span><img alt="Article Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Article Thumbnail" srcSet="https://hackernoon.imgix.net/hn-images/1*nfurHXt2iECkxlcreuU4SQ.jpeg?auto=format&fit=max&w=260 1x, https://hackernoon.imgix.net/hn-images/1*nfurHXt2iECkxlcreuU4SQ.jpeg?auto=format&fit=max&w=260 2x" src="https://hackernoon.imgix.net/hn-images/1*nfurHXt2iECkxlcreuU4SQ.jpeg?auto=format&fit=max&w=260" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="img" loading="lazy"/></noscript></span></a></div><div class="text"><strong><a href="../07-03-2018-biggest-stories-in-the-cryptosphere-e4608e633053" style="text-decoration:none;text-align:left" target="_blank" rel="noopener noreferrer">07/03/2018: Biggest Stories in the Cryptosphere</a></strong><div class="card-title"><div class="card-info"><span class="author"><span style="color:gray">by</span> <strong><a class="author-link" href="https://hackernoon.com/u/BlockEx">BlockEx<!-- --> </a></strong></span><div></div><div class="divider-bullet"></div><div class="date">Mar 07, 2018</div></div><a class="related" href="/tagged/blockchain"><span class="centered"> <!-- -->#<!-- -->blockchain</span></a></div></div></div><div class="sc-65adb81b-0 evreGv"><div class="img"><a href="../05-02-2018-biggest-stories-in-the-cryptosphere-c3be4a3b5d5a" style="display:contents" target="_blank" rel="noopener noreferrer"><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27260%27%20height=%27150%27/%3e"/></span><img alt="Article Thumbnail" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="img" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Article Thumbnail" srcSet="https://hackernoon.imgix.net/fallback-feat.png?auto=format&fit=max&w=260 1x, https://hackernoon.imgix.net/fallback-feat.png?auto=format&fit=max&w=260 2x" src="https://hackernoon.imgix.net/fallback-feat.png?auto=format&fit=max&w=260" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="img" loading="lazy"/></noscript></span></a></div><div class="text"><strong><a href="../05-02-2018-biggest-stories-in-the-cryptosphere-c3be4a3b5d5a" style="text-decoration:none;text-align:left" target="_blank" rel="noopener noreferrer">05/02/2018: Biggest Stories in the Cryptosphere</a></strong><div class="card-title"><div class="card-info"><span class="author"><span style="color:gray">by</span> <strong><a class="author-link" href="https://hackernoon.com/u/BlockEx">BlockEx<!-- --> </a></strong></span><div></div><div class="divider-bullet"></div><div class="date">Feb 05, 2018</div></div><a class="related" href="/tagged/bitcoin"><span class="centered"> <!-- -->#<!-- -->bitcoin</span></a></div></div></div></div></section><div class="sc-92a1b621-1 SWeJa"><a class="fs-hn-cta" href="https://hackernoon.com/login"><div class="cta-top"><small>Join HackerNoon</small><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2770%27%20height=%2770%27/%3e"/></span><img alt="loading" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="loading" srcSet="https://hackernoon.com/watch-gif.gif?auto=format&fit=max&w=96 1x, https://hackernoon.com/watch-gif.gif?auto=format&fit=max&w=256 2x" src="https://hackernoon.com/watch-gif.gif?auto=format&fit=max&w=256" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" loading="lazy"/></noscript></span></div><strong>Latest technology trends. Customized Experience. Curated Stories. Publish Your Ideas </strong></a></div></div></main></div></div><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"data":{"pageLang":"en","datePublished":"2018-02-14","slug":"how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371","articleBody":"This article covers blockchain programming for cryptocurrency , testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution. The way we do money is changing. What can you do to keep up? Blockchain and cryptocurrency have been around for years, but only in the past several months has the conversation spread far beyond arcane internet forums and tech company break rooms. Maybe it’s time for you to make your own cryptocurrency, to make your own medium of exchange for goods and services. That may sound complicated! But it’s simpler than you would expect — thanks to the great strides the decentralization community has made and continues to innovate with. Bank of the Future A cryptocurrency replaces today’s bank. Banks keep track of the amount of money you have in an account. Instead of trusting a single institution to keep track of this for you, you can trust a massive computer network made up of anyone and everyone to keep track, publicly. The collective computers in this network confirm every single transaction of currency that ever happened and ever will happen. This public consensus is the assurance that people rely on when using cryptocurrency for payment. Your own cryptocurrency can be the token that you accept for business — kind of like tokens in an arcade. This currency can be brought into existence today. The first step is to choose a big, decentralized computer network that is constantly confirming the legitimacy of new additions to its blockchain. Let’s go with Ethereum. Smart Contract Programming Ethereum is a decentralized computing platform for executing smart contracts. These are programs that run code in a transparent environment, without the possibility of third-party tampering. A user’s private key is used to create a fundamentally unique signature for every request that executes a smart contract ( ). see this wiki if you are not familiar with asymmetrical cryptography The Ethereum community has a sizable following of open source software engineers that are relentlessly developing amazing tools for the greater good of humanity. To make your own cryptocurrency on the Ethereum network, you need these four tools: — An Ethereum smart contract programming language. Solidity — An Ethereum development kit. Truffle Framework — A JavaScript package for interacting with the Ethereum network with an internet browser or Node.js. Web3.js Ether (ETH) — The currency of the . Ethereum network Optional tools: — a Chrome extension for crypto payments. MetaMask Cryptocurrency is merely one of limitless . The brilliant community rallying around Solidity makes it attractive to invest effort in building decentralized apps with Ethereum. First let’s build your own cryptocurrency to start learning blockchain development. use-cases for a blockchain Developing the ERC-20 Token The Ethereum community has established some standards regarding the functionality of smart contracts, including tokens. The cryptocurrency token in this tutorial is based on the . ERC-20 Token Standard If you don’t have node.js, install it now ( ). Then open a terminal window and do: The tests in below will not work with versions earlier than node.js 8 npm install -g trufflemkdir MyToken \u0026\u0026 cd MyTokentruffle initnpm init -ynpm install -E zeppelin-solidity This installs the Truffle CLI, creates a project directory for your token, and installs an open source Solidity library called . OpenZeppelin Next we can begin writing our Solidity contract. Take a few minutes to familiarize yourself with as well as the . In your project directory, create a file in the auto-generated folder and name it . Add the following code that follows the ERC-20 Token Standard specification. Solidity DANGERS noted in the Token Standard contracts/ Token.sol This token is not mineable and there is a fixed supply. By default, there are , and each token can be divided into fractions up to 18 decimal places. The smallest fraction of a token is referred to as in Ethereum or in Bitcoin. You can change these numbers, the token name, and the token symbol to whatever you want ( ). 1 billion tokens Wei Satoshi see the above constructor function Once this code is deployed to the main Ethereum network, anyone who wants to send or receive your token will execute the code in this contract. The map is the data structure that holds all of the information regarding who owns tokens. The is the wallet owner’s public key, and the is the number of token Wei in the wallet. balances address unsigned 256 bit integer Read vs. Write Read and Write operations for the blockchain have two easy rules: reads are free, writes are not. Since we are using the Ethereum network, by the caller when doing blockchain additions. Additions are made by functions that change state, like transferring tokens from one wallet to another. This can be contrasted with read functions, such as viewing the balance of a wallet. Read functions add no new data to the blockchain and they are always . ETH needs to be spent free to execute Test Your Code Before we deploy our contract, we should thoroughly test it. Truffle includes and documentation in their getting started guide. I’ve included sample integration tests with JavaScript (truffle-keys ). Solidity test JavaScript test here test/integration.test.js — node.js 8 or later The tests here are not exhaustive, but they are a good starting point for an engineer that is learning Solidity. This test file can only be run inside of the environment. truffle develop In order to migrate the contract to an Ethereum client using truffle, add this file to . This migration step is required for the tests to run. 2_deploy_contracts.js migrations/ To run the integration tests we will use the Truffle CLI: npm i ethereumjs-tx truffle developtruffle(develop)\u003e test boots a test blockchain on your local machine. The test network has 10 default Ethereum key pairs that each have every time the server is started. These keys will call the functions in your Solidity contract to test their functionality. The truffle develop command 100 ETH The command will execute all of the tests in the folder. Explore the file to learn exactly what the tests are doing to your test wallets and test blockchain. test test/ integration.test.js Deploying After you are comfortable with, Solidity, network gas prices, and writing your own tests, you can put your token on a public test network. The is one of several public test networks used for Ethereum development. Network connections can be in the file. Ropsten network configured truffle.js If you do not have an Ethereum wallet of your own, I suggest you make one now. If you do not have a mnemonic and wallet, use to generate one. Select in the coin dropdown, and click the English button. this tool ETH Save the mnemonic somewhere safe and secure! It’s a good idea to make separate wallets for test and main networks, so it’s less likely that you’ll have an ETH wasting accident. Add your Ethereum key set mnemonic to your environment variables as like referenced in the above truffle config file. ethereum_mnemonic ## bashexport ethereum_mnemonic=\"candy maple cake....\" If you do not have test ETH in your wallet on the Ropsten network, install the MetaMask Chrome extension to get some for free from a . In order to execute a transaction in your token contract, you need to spend some ETH on fees — work that is done in the network on your behalf. faucet truffle migrate --network ropsten This command will log the , be sure to save it! Migrate uses the flag and refers to the key in the networks object in . An object for the main Ethereum network can be included like the Ropsten object. I excluded it from my truffle box code for safety reasons. See the \"live\" connection object in this for the contract address --network ropsten truffle.js Truffle Tutorial Main Ethereum network. Once your token contract is deployed, you can review your token balance using the MetaMask Chrome extension. In the MetaMask UI, select the Ropsten Test Network from the dropdown picker on the top left, then click the tokens tab. Click the button and input your contract address that was logged from the command. Add Token truffle migrate MetaMask can transfer token, or you can create your own contract invoking UI with Web3.js. The token contract above is exciting to see for ICO developers, but it isn’t able to do the newsworthy out of the box. Let’s make that happen. crowdsale Crowdsales Now that you have installed Truffle, used the CLI, explored Solidity, and written some test code, we can unbox an existing Truffle project — . Let’s make a new directory and pull this project directly from using the Truffle CLI. Crowdsalable Ethereum Token my Github repo mkdir crowdsalable-eth-token \u0026\u0026 cd crowdsalable-eth-tokentruffle unbox git@github.com:ajb413/crowdsalable-eth-token.git This Truffle project has a more robust implementation of an Ethereum token. The token name and symbol can be changed by the owner after the contract is already deployed. The owner can also configure and open new crowdsales at any time. The truffle box comes with a development mode UI for executing contracts on the local Ethereum client. The UI uses the 10 static wallets that the command initializes on your machine - to execute transfers, view wallet balances, and launch the exciting crowdsale. truffle develop Broadcast Crowdsale Announcements The folder contains the web UI and also an extra bit of PubNub magic. When a crowdsale is launched, the owner has the option to all of their followers with the crowdsale details, so they can begin purchasing your token. app/ text message This functionality is powered by the ClickSend API and PubNub Functions. In order to enable this realtime updating feature, you must sign up for and . You insert your , , and where noted in and . Also edit the JavaScript array of to choose who receives an SMS. PubNub ClickSend api key publish key subscribe key app.js sms-handler.js Phone Numbers excerpt from app/js/app.js excerpt from app/pubnub-functions/sms-handler.js — Deploy this to PubNub Functions! The PubNub Function event handler must be deployed in the . See for deploying function event handler code in 2 minutes. PubNub Admin Dashboard this tutorial A Development UI with Web3.js Next we run the local Ethereum client the same way we did earlier. cd crowdsalable-eth-tokennpm itruffle develop ## Truffle development blockchain and console are booted truffle(develop)\u003e compiletruffle(develop)\u003e migratetruffle(develop)\u003e test Leave the truffle console running Open a new command line window Navigate to the same project directory Run the development UI with: npm run dev \u003e crowdsalable-eth-token dev /crowdsalable-eth-token\u003e webpack-dev-server Project is running at http://localhost:8080/ Next, open the UI in your browser and explore the key features. We can: Launch a new crowdsale Transfer token from wallet to wallet Purchase token from a crowdsale using ETH Check the balance of any wallet The nature of the development environment allows anyone to invoke functions like and , when in reality, these methods cannot be invoked by just anyone. For decorated Solidity functions, the invoker must be the owner of the contract and must sign their requests with their private key ( ). Also functions like will only be able to send token from the wallet that the private key belongs to. This will be more restrictive on the main network for the right reasons. createCrowdsale transfer onlyOwner see _rawTransaction_ function in test/integration.test.js transfer web3.eth.sendRawTransaction(...) After you have deployed your , you are able to launch a crowdsale and to all of your followers when the contract opens. Input a name, click the button, and check your phone! PubNub Function send a mass SMS Launch The configuration of the crowdsale is specified in the script in the event handler. By default, the crowdsale is open forever, starts with to sell, and a buyer receives that they pay. app/js/app.js launchCrowdsale 100,000 TOK 3 TOK per ETH Use the default wallet public keys listed at the bottom of the UI for transfers, purchases, and balance checks. Remember, on this network, the wallets each have 100 fake ETH to play with. If you’ve made it this far, you now have some command over blockchain and PubNub. To recap, we covered: What cryptocurrencies are How to build an Ethereum token that is compliant with the standard How to transfer the token and invoke contract methods How to test all of the contract code How to create a crowdsale How to broadcast an announcement to all of your followers with PubNub The true power of blockchain is yet to be realized because the technology is only recently picking up widespread interest. PubNub will stay involved. For live demonstrations of blockchain programming, check out our and page. Best of luck to you in your blockchain adventures! events Meetup","arweave":"riSJBHHSoQUYZ4y6WgXwy7tHsN1mY6a9s-lNpcAboP0","createdAt":"2018-02-14T18:20:58.061Z","excerpt":"\u003cem\u003eThis article covers \u003c/em\u003e\u003ca href=\"https://hackernoon.com/tagged/blockchain\" target=\"_blank\"\u003e\u003cem\u003eblockchain\u003c/em\u003e\u003c/a\u003e\u003cem\u003e programming for \u003c/em\u003e\u003ca href=\"https://hackernoon.com/tagged/cryptocurrency\" target=\"_blank\"\u003e\u003cem\u003ecryptocurrency\u003c/em\u003e\u003c/a\u003e\u003cem\u003e, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.\u003c/em\u003e","featureImgColor":"rgb(197 174 144 / 70%)","firstSeenAt":false,"id":"how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371","imageSizes":{"https://hackernoon.com/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png":{"width":1380,"height":600}},"mainImage":"https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png","mainImageHeight":600,"mainImageWidth":1380,"mentions":[{"image":"https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png","name":"Ethereum","collection":"coins","id":"ETH","manual":false},{"image":null,"name":"fees","collection":"companies","id":"fees","manual":false}],"owner":"adam.bavosa","parentCategory":"web3","parsed":"\u003cp\u003e\u003cimg src=\"https://hackernoon.com/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eThis article covers\u003c/em\u003e \u003ca href=\"https://hackernoon.com/tagged/blockchain\"\u003e\u003cem\u003eblockchain\u003c/em\u003e\u003c/a\u003e \u003cem\u003eprogramming for\u003c/em\u003e \u003ca href=\"https://hackernoon.com/tagged/cryptocurrency\"\u003e\u003cem\u003ecryptocurrency\u003c/em\u003e\u003c/a\u003e\u003cem\u003e, testing the code, and deploying to the blockchain. Learn how to create wallets and a simple user interface for smart contract execution.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe way we do money is changing. What can you do to keep up? Blockchain and cryptocurrency have been around for years, but only in the past several months has the conversation spread far beyond arcane internet forums and tech company break rooms.\u003c/p\u003e\n\u003cp\u003eMaybe it’s time for you to make your own cryptocurrency, to make your own medium of exchange for goods and services. That may sound complicated! But it’s simpler than you would expect — thanks to the great strides the decentralization community has made and continues to innovate with.\u003c/p\u003e\n\u003ch3\u003eBank of the Future\u003c/h3\u003e\n\u003cp\u003eA cryptocurrency replaces today’s bank. Banks keep track of the amount of money you have in an account. Instead of trusting a single institution to keep track of this for you, you can trust a massive computer network made up of anyone and everyone to keep track, publicly. The collective computers in this network confirm every single transaction of currency that ever happened and ever will happen. This public consensus is the assurance that people rely on when using cryptocurrency for payment.\u003c/p\u003e\n\u003cp\u003eYour own cryptocurrency can be the token that you accept for business — kind of like tokens in an arcade. This currency can be brought into existence today. The first step is to choose a big, decentralized computer network that is constantly confirming the legitimacy of new additions to its blockchain. Let’s go with Ethereum.\u003c/p\u003e\n\u003ch3\u003eSmart Contract Programming\u003c/h3\u003e\n\u003cp\u003eEthereum is a decentralized computing platform for executing smart contracts. These are programs that run code in a transparent environment, without the possibility of third-party tampering. A user’s private key is used to create a fundamentally unique signature for every request that executes a smart contract (\u003cem\u003esee\u003c/em\u003e \u003ca href=\"https://theethereum.wiki/w/index.php/Accounts,_Addresses,_Public_And_Private_Keys,_And_Tokens\"\u003e\u003cem\u003ethis wiki\u003c/em\u003e\u003c/a\u003e \u003cem\u003eif you are not familiar with asymmetrical cryptography\u003c/em\u003e).\u003c/p\u003e\n\u003cp\u003eThe Ethereum community has a sizable following of open source software engineers that are relentlessly developing amazing tools for the greater good of humanity. To make your own cryptocurrency on the Ethereum network, you need these four tools:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://solidity.readthedocs.io/\"\u003eSolidity\u003c/a\u003e — An Ethereum smart contract programming language.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://truffleframework.com/docs/\"\u003eTruffle Framework\u003c/a\u003e — An Ethereum development kit.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ethereum/wiki/wiki/JavaScript-API\"\u003eWeb3.js\u003c/a\u003e — A JavaScript package for interacting with the Ethereum network with an internet browser or Node.js.\u003c/li\u003e\n\u003cli\u003eEther (ETH) — The currency of the \u003ca href=\"https://ethereum.org/\"\u003eEthereum network\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOptional tools:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://metamask.io/\"\u003eMetaMask\u003c/a\u003e — a Chrome extension for crypto payments.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCryptocurrency is merely one of limitless \u003ca href=\"https://hackernoon.com/the-industries-beyond-cryptocurrency-that-will-be-transformed-by-blockchain-developers-be70a62937ef\"\u003euse-cases for a blockchain\u003c/a\u003e. The brilliant community rallying around Solidity makes it attractive to invest effort in building decentralized apps with Ethereum. First let’s build your own cryptocurrency to start learning blockchain development.\u003c/p\u003e\n\u003ch3\u003eDeveloping the ERC-20 Token\u003c/h3\u003e\n\u003cp\u003eThe Ethereum community has established some standards regarding the functionality of smart contracts, including tokens. The cryptocurrency token in this tutorial is based on the \u003ca href=\"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\"\u003eERC-20 Token Standard\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you don’t have node.js, install it now (\u003cem\u003eThe tests in below will not work with versions earlier than\u003c/em\u003e \u003cstrong\u003e\u003cem\u003enode.js 8\u003c/em\u003e\u003c/strong\u003e). Then open a terminal window and do:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003cp\u003enpm install -g trufflemkdir MyToken \u0026amp;\u0026amp; cd MyTokentruffle initnpm init -ynpm install -E zeppelin-solidity\u003c/p\u003e\u003cp\u003eThis installs the Truffle CLI, creates a project directory for your token, and installs an open source Solidity library called \u003ca href=\"https://github.com/OpenZeppelin/zeppelin-solidity\"\u003eOpenZeppelin\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNext we can begin writing our Solidity contract. Take a few minutes to familiarize yourself with \u003ca href=\"https://en.wikipedia.org/wiki/Solidity\"\u003eSolidity\u003c/a\u003e as well as the \u003cstrong\u003eDANGERS\u003c/strong\u003e \u003ca href=\"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#approve\"\u003enoted in the Token Standard\u003c/a\u003e. In your project directory, create a file in the auto-generated \u003ccode\u003econtracts/\u003c/code\u003e folder and name it \u003cstrong\u003eToken.sol\u003c/strong\u003e. Add the following code that follows the ERC-20 Token Standard specification.\u003c/p\u003e\n\u003cp\u003eThis token is not mineable and there is a fixed supply. By default, there are \u003cstrong\u003e1 billion tokens\u003c/strong\u003e, and each token can be divided into fractions up to 18 decimal places. The smallest fraction of a token is referred to as \u003cstrong\u003eWei\u003c/strong\u003e in Ethereum or \u003cstrong\u003eSatoshi\u003c/strong\u003e in Bitcoin. You can change these numbers, the token name, and the token symbol to whatever you want (\u003cem\u003esee the above constructor function\u003c/em\u003e).\u003c/p\u003e\n\u003cp\u003eOnce this code is deployed to the main Ethereum network, anyone who wants to send or receive your token will execute the code in this contract. The \u003ccode\u003ebalances\u003c/code\u003e map is the data structure that holds all of the information regarding who owns tokens. The \u003cstrong\u003eaddress\u003c/strong\u003e is the wallet owner’s public key, and the \u003cstrong\u003eunsigned 256 bit integer\u003c/strong\u003e is the number of token Wei in the wallet.\u003c/p\u003e\n\u003ch3\u003eRead vs. Write\u003c/h3\u003e\n\u003cp\u003eRead and Write operations for the blockchain have two easy rules: reads are free, writes are not. Since we are using the Ethereum network, \u003cstrong\u003eETH needs to be spent\u003c/strong\u003e by the caller when doing blockchain additions. Additions are made by functions that change state, like transferring tokens from one wallet to another. This can be contrasted with read functions, such as viewing the balance of a wallet. Read functions add no new data to the blockchain and they are always \u003cstrong\u003efree to execute\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3\u003eTest Your Code\u003c/h3\u003e\n\u003cp\u003eBefore we deploy our contract, we should thoroughly test it. Truffle includes \u003ca href=\"http://truffleframework.com/docs/getting_started/solidity-tests\"\u003eSolidity test\u003c/a\u003e and \u003ca href=\"http://truffleframework.com/docs/getting_started/javascript-tests\"\u003eJavaScript test\u003c/a\u003e documentation in their getting started guide. I’ve included sample integration tests with JavaScript (truffle-keys \u003ca href=\"https://github.com/ajb413/erc20-ethereum-token/blob/master/test/truffle-keys.js\"\u003ehere\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etest/integration.test.js — node.js 8 or later\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe tests here are not exhaustive, but they are a good starting point for an engineer that is learning Solidity. This test file can only be run inside of the \u003ccode\u003etruffle develop\u003c/code\u003e environment.\u003c/p\u003e\n\u003cp\u003eIn order to migrate the contract to an Ethereum client using truffle, add this file \u003cstrong\u003e2_deploy_contracts.js\u003c/strong\u003e to \u003ccode\u003emigrations/\u003c/code\u003e. This migration step is required for the tests to run.\u003c/p\u003e\n\u003cp\u003eTo run the integration tests we will use the Truffle CLI:\u003c/p\u003e\n\u003cp\u003enpm i ethereumjs-tx\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003etruffle developtruffle(develop)\u0026gt; test\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://truffleframework.com/docs/getting_started/console\"\u003eThe truffle develop command\u003c/a\u003e boots a test blockchain on your local machine. The test network has 10 default Ethereum key pairs that each have \u003cstrong\u003e100 ETH\u003c/strong\u003e every time the server is started. These keys will call the functions in your Solidity contract to test their functionality.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003etest\u003c/code\u003e command will execute all of the tests in the \u003ccode\u003etest/\u003c/code\u003e folder. Explore the \u003ccode\u003eintegration.test.js\u003c/code\u003e file to learn exactly what the tests are doing to your test wallets and test blockchain.\u003c/p\u003e\n\u003ch3\u003eDeploying\u003c/h3\u003e\n\u003cp\u003eAfter you are comfortable with, Solidity, network gas prices, and writing your own tests, you can put your token on a public test network. The \u003cstrong\u003eRopsten network\u003c/strong\u003e is one of several public test networks used for Ethereum development. Network connections can be \u003ca href=\"http://truffleframework.com/docs/advanced/configuration\"\u003econfigured\u003c/a\u003e in the \u003ccode\u003etruffle.js\u003c/code\u003e file.\u003c/p\u003e\n\u003cp\u003eIf you do not have an Ethereum wallet of your own, I suggest you make one now. If you do not have a mnemonic and wallet, use \u003ca href=\"https://iancoleman.io/bip39/\"\u003ethis tool\u003c/a\u003e to generate one. Select \u003cstrong\u003eETH\u003c/strong\u003e in the coin dropdown, and click the English button. \u003cstrong\u003eSave the mnemonic somewhere safe and secure!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIt’s a good idea to make separate wallets for test and main networks, so it’s less likely that you’ll have an ETH wasting accident. Add your Ethereum key set mnemonic to your environment variables as \u003ccode\u003eethereum_mnemonic\u003c/code\u003e like referenced in the above truffle config file.\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e## bashexport ethereum_mnemonic=\u0026quot;candy maple cake....\u0026quot;\u003c/p\u003e\u003cp\u003eIf you do not have test ETH in your wallet on the Ropsten network, install the MetaMask Chrome extension to get some for free from a \u003ca href=\"https://faucet.metamask.io/\"\u003efaucet\u003c/a\u003e. In order to execute a transaction in your token contract, you need to spend some ETH on fees — work that is done in the network on your behalf.\u003c/p\u003e\n\u003cp\u003etruffle migrate --network ropsten\u003c/p\u003e\n\u003cp\u003eThis command will log the \u003cstrong\u003econtract address\u003c/strong\u003e, be sure to save it! Migrate uses the \u003ccode\u003e--network\u003c/code\u003e flag and refers to the \u003ccode\u003eropsten\u003c/code\u003e key in the networks object in \u003ccode\u003etruffle.js\u003c/code\u003e. An object for the main Ethereum network can be included like the Ropsten object. I excluded it from my truffle box code for safety reasons. See the \u0026quot;live\u0026quot; connection object in this \u003ca href=\"http://truffleframework.com/tutorials/deploying-to-the-live-network\"\u003eTruffle Tutorial\u003c/a\u003e for the \u003cstrong\u003eMain Ethereum network.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eOnce your token contract is deployed, you can review your token balance using the MetaMask Chrome extension. In the MetaMask UI, select the Ropsten Test Network from the dropdown picker on the top left, then click the tokens tab. Click the \u003cstrong\u003eAdd Token\u003c/strong\u003e button and input your contract address that was logged from the \u003ccode\u003etruffle migrate\u003c/code\u003e command.\u003c/p\u003e\n\u003cp\u003eMetaMask can transfer token, or you can create your own contract invoking UI with Web3.js. The token contract above is exciting to see for ICO developers, but it isn’t able to do the newsworthy \u003cstrong\u003ecrowdsale\u003c/strong\u003e out of the box. Let’s make that happen.\u003c/p\u003e\n\u003ch3\u003eCrowdsales\u003c/h3\u003e\n\u003cp\u003eNow that you have installed Truffle, used the CLI, explored Solidity, and written some test code, we can unbox an existing Truffle project — \u003cstrong\u003eCrowdsalable Ethereum Token\u003c/strong\u003e. Let’s make a new directory and pull this project directly from \u003ca href=\"https://github.com/ajb413/crowdsalable-eth-token\"\u003emy Github repo\u003c/a\u003e using the Truffle CLI.\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003emkdir crowdsalable-eth-token \u0026amp;\u0026amp; cd crowdsalable-eth-tokentruffle unbox git@github.com:ajb413/crowdsalable-eth-token.git\u003c/p\u003e\u003cp\u003eThis Truffle project has a more robust implementation of an Ethereum token. The token name and symbol can be changed by the owner after the contract is already deployed. The owner can also \u003cstrong\u003econfigure and open new crowdsales at any time.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe truffle box comes with a development mode UI for executing contracts on the local Ethereum client. The UI uses the 10 static wallets that the \u003ccode\u003etruffle develop\u003c/code\u003e command initializes on your machine - to execute transfers, view wallet balances, and launch the exciting crowdsale.\u003c/p\u003e\n\u003ch3\u003eBroadcast Crowdsale Announcements\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003eapp/\u003c/code\u003e folder contains the web UI and also an extra bit of PubNub magic. When a crowdsale is launched, the owner has the option to \u003cstrong\u003etext message\u003c/strong\u003e all of their followers with the crowdsale details, so they can begin purchasing your token.\u003c/p\u003e\n\u003cp\u003eThis functionality is powered by the ClickSend API and PubNub Functions. In order to enable this realtime updating feature, you must sign up for \u003ca href=\"https://admin.pubnub.com/#/register?utm_source=Syndication\u0026amp;utm_medium=Medium\u0026amp;utm_campaign=SYN-CY18-Q1-Medium-February-13\u0026amp;utm_content=byo-crypto\"\u003ePubNub\u003c/a\u003e and \u003ca href=\"https://www.clicksend.com/\"\u003eClickSend\u003c/a\u003e. You insert your \u003cstrong\u003eapi key\u003c/strong\u003e, \u003cstrong\u003epublish key\u003c/strong\u003e, and \u003cstrong\u003esubscribe key\u003c/strong\u003e where noted in \u003cstrong\u003eapp.js\u003c/strong\u003e and \u003cstrong\u003esms-handler.js\u003c/strong\u003e. Also edit the JavaScript array of \u003cstrong\u003ePhone Numbers\u003c/strong\u003e to choose who receives an SMS.\u003c/p\u003e\n\u003cp\u003eexcerpt from \u003cstrong\u003eapp/js/app.js\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eexcerpt from \u003cstrong\u003eapp/pubnub-functions/sms-handler.js — \u003cem\u003eDeploy this to PubNub Functions!\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe PubNub Function event handler must be deployed in the \u003ca href=\"https://admin.pubnub.com/?utm_source=Syndication\u0026amp;utm_medium=Medium\u0026amp;utm_campaign=SYN-CY18-Q1-Medium-February-13\u0026amp;utm_content=byo-crypto\"\u003ePubNub Admin Dashboard\u003c/a\u003e. See \u003ca href=\"https://www.pubnub.com/docs/blocks/tutorials/hello-world\"\u003ethis tutorial\u003c/a\u003e for deploying function event handler code in 2 minutes.\u003c/p\u003e\n\u003ch3\u003eA Development UI with Web3.js\u003c/h3\u003e\n\u003cp\u003eNext we run the local Ethereum client the same way we did earlier.\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003cp\u003ecd crowdsalable-eth-tokennpm itruffle develop\u003c/p\u003e\u003cp\u003e## Truffle development blockchain and console are booted\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003cp\u003etruffle(develop)\u0026gt; compiletruffle(develop)\u0026gt; migratetruffle(develop)\u0026gt; test\u003c/p\u003e\u003cul\u003e\n\u003cli\u003eLeave the truffle console running\u003c/li\u003e\n\u003cli\u003eOpen a new command line window\u003c/li\u003e\n\u003cli\u003eNavigate to the same project directory\u003c/li\u003e\n\u003cli\u003eRun the development UI with:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003enpm run dev\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u0026gt; crowdsalable-eth-token dev /crowdsalable-eth-token\u0026gt; webpack-dev-server\u003c/p\u003e\u003cp\u003eProject is running at \u003ca href=\"http://localhost:8080/\"\u003ehttp://localhost:8080/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNext, open the UI in your browser and explore the key features. We can:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLaunch a new crowdsale\u003c/li\u003e\n\u003cli\u003eTransfer token from wallet to wallet\u003c/li\u003e\n\u003cli\u003ePurchase token from a crowdsale using ETH\u003c/li\u003e\n\u003cli\u003eCheck the balance of any wallet\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe nature of the development environment allows anyone to invoke functions like \u003ccode\u003ecreateCrowdsale\u003c/code\u003e and \u003ccode\u003etransfer\u003c/code\u003e, when in reality, these methods cannot be invoked by just anyone. For \u003ccode\u003eonlyOwner\u003c/code\u003e decorated Solidity functions, the invoker must be the owner of the contract and must sign their requests with their private key (\u003cem\u003esee\u003c/em\u003e \u003ccode\u003e_rawTransaction_\u003c/code\u003e \u003cem\u003efunction in\u003c/em\u003e \u003cstrong\u003e\u003cem\u003etest/integration.test.js\u003c/em\u003e\u003c/strong\u003e). Also functions like \u003ccode\u003etransfer\u003c/code\u003e will only be able to send token from the wallet that the private key belongs to. This will be more restrictive on the main network for the right reasons.\u003c/p\u003e\n\u003cp\u003eweb3.eth.sendRawTransaction(...)\u003c/p\u003e\n\u003cp\u003eAfter you have deployed your \u003cstrong\u003ePubNub Function\u003c/strong\u003e, you are able to launch a crowdsale and \u003cstrong\u003esend a mass SMS\u003c/strong\u003e to all of your followers when the contract opens. Input a name, click the \u003cstrong\u003eLaunch\u003c/strong\u003e button, and check your phone!\u003c/p\u003e\n\u003cp\u003eThe configuration of the crowdsale is specified in the \u003ccode\u003eapp/js/app.js\u003c/code\u003e script in the \u003ccode\u003elaunchCrowdsale\u003c/code\u003e event handler. By default, the crowdsale is open forever, starts with \u003cstrong\u003e100,000 TOK\u003c/strong\u003e to sell, and a buyer receives \u003cstrong\u003e3 TOK per ETH\u003c/strong\u003e that they pay.\u003c/p\u003e\n\u003cp\u003eUse the default wallet public keys listed at the bottom of the UI for transfers, purchases, and balance checks. Remember, on this network, the wallets each have 100 fake ETH to play with.\u003c/p\u003e\n\u003cp\u003eIf you’ve made it this far, you now have some command over blockchain and PubNub. To recap, we covered:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhat cryptocurrencies are\u003c/li\u003e\n\u003cli\u003eHow to build an Ethereum token that is compliant with the standard\u003c/li\u003e\n\u003cli\u003eHow to transfer the token and invoke contract methods\u003c/li\u003e\n\u003cli\u003eHow to test all of the contract code\u003c/li\u003e\n\u003cli\u003eHow to create a crowdsale\u003c/li\u003e\n\u003cli\u003eHow to broadcast an announcement to all of your followers with PubNub\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe true power of blockchain is yet to be realized because the technology is only recently picking up widespread interest. PubNub will stay involved. For live demonstrations of blockchain programming, check out our \u003ca href=\"https://www.pubnub.com/company/events/\"\u003eevents\u003c/a\u003e and \u003ca href=\"https://www.meetup.com/MobileDeveloperGroup/\"\u003eMeetup\u003c/a\u003e page. Best of luck to you in your blockchain adventures!\u003c/p\u003e","profile":{"avatar":"https://cdn.hackernoon.com/avatars/robot-a3.png","bio":"Open Source Software Engineer","callToActions":[],"displayName":"Adam Bavosa","handle":"adam.bavosa","allowSubscribers":true},"publishedAt":1518632458.061,"tags":["ethereum","cryptocurrency","blockchain","build-your-own-crypto","crypto"],"title":"How To Launch Your Own Production-ready Cryptocurrency","backlinks":{"fetched":"2024-07-25T05:05:12.097Z","urls":[]},"annotations":[],"draftId":"how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371","fromMongo":true,"relatedStories":[{"id":"vVyaj5e6J3gcJaffZxSI","active":true,"category":[],"companyName":"Fastex","customAd":"https://cdn.hackernoon.com/images/img-ap23061.jpeg","firstColor":"#29c929","font":"HackerNoon","fontColor":"#FFFFFF","image":"https://cdn.hackernoon.com/images/img-q8130qx.jpeg","link":"https://bit.ly/4fb8Vca","logo":"https://cdn.hackernoon.com/images/img-8p3308w.png","parentCategory":["web3","gaming"],"secondColor":"#009300","tags":[],"text":"ftNFT YoCerebrum Awards 2024: Vote Now!","thirdColor":"#007200","type":"tag","website":"https://bit.ly/4fb8Vca"},{"id":"broadcast-ethereum-events-with-web3-js-and-pubnub-267f6e38210b","title":"Broadcast Ethereum Events with Web3.js and PubNub","slug":"broadcast-ethereum-events-with-web3-js-and-pubnub-267f6e38210b","mainImage":"https://hackernoon.com/fallback-feat.png","tags":["ethereum","cryptocurrency"],"profile":{"displayName":"Adam Bavosa","handle":"adam.bavosa","avatar":"https://hackernoon.com/fallback-profile.png"},"fromSlack":false,"publishedAt":"2018-05-24T19:34:04.130Z"},{"id":"1-100-crypto-countdown-golem-5392489d463e","title":"(1/100) Crypto Countdown: Golem","slug":"1-100-crypto-countdown-golem-5392489d463e","mainImage":"https://hackernoon.com/hn-images/1*U0jdb07476TSAbJTShBk7Q.png","tags":["blockchain","golem","crypto","ethereum","crypto-countdown"],"profile":{"displayName":"Mark Milton","handle":"markbmilton","autoGenerated":true,"avatar":"https://hackernoon.com/fallback-profile.png"},"fromSlack":false,"publishedAt":"2018-08-23T23:12:58.360Z"},{"id":"p3Jm1gp3kjDiLCsEXtn2","title":"A Research Report on the Trader $JOE DeFi Platform","slug":"$joe-research-report","mainImage":"https://cdn.hackernoon.com/images/FROzJqlEDZh6TKOy8qSvzctK75s2-8wa3j1c.jpeg","tags":["cryptocurrency-investment","nft","blockchain","traderjoe-avalanche","avalanche","crypto-trading","tokenomics","blockchain-writing-contest"],"profile":{"displayName":"MBApes Academy","callToActions":[{"name":"Read My Stories","icon":"fa fa-book","active":true,"id":"ee481c9d03254","url":"https://hackernoon.com/u/mbapesacademy"},{"name":"Nominated for 2022 - HackerNoon Contributor of the Year - Nft","icon":"fa-star","active":true,"id":"2022 hackernoon contributor of the year nft","url":"https://www.noonies.tech/2022/web3/2022-hackernoon-contributor-of-the-year-nft"}],"awards":{"noonies2022nom_2022 hackernoon contributor of the year nft":{"awardUrl":"https://www.noonies.tech/2022/web3/2022-hackernoon-contributor-of-the-year-nft","year":"2022","description":"nomination","awardImgUrl":"","title":"2022 - HackerNoon Contributor of the Year - Nft"}},"bio":"Published Educational Guides","long_bio":"","handle":"mbapesacademy","about_page_settings":{},"avatar":"https://cdn.hackernoon.com/images/FROzJqlEDZh6TKOy8qSvzctK75s2-l493jc2.png","socialMedia":{"twitter":"MBApesNFT"},"interested_tags":["hackernoon-top-story","cryptocurrency","blockchain"]},"fromSlack":false,"publishedAt":"2022-03-20T09:50:00.774Z"},{"id":"07-03-2018-biggest-stories-in-the-cryptosphere-e4608e633053","title":"07/03/2018: Biggest Stories in the Cryptosphere","slug":"07-03-2018-biggest-stories-in-the-cryptosphere-e4608e633053","mainImage":"https://hackernoon.com/hn-images/1*nfurHXt2iECkxlcreuU4SQ.jpeg","tags":["blockchain","smart-contracts","intellectual-property","patents","cryptocurrency"],"profile":{"displayName":"BlockEx","handle":"BlockEx","avatar":"https://hackernoon.com/fallback-profile.png","autoGenerated":true},"fromSlack":false,"publishedAt":"2018-03-07T15:18:39.492Z"},{"id":"05-02-2018-biggest-stories-in-the-cryptosphere-c3be4a3b5d5a","title":"05/02/2018: Biggest Stories in the Cryptosphere","slug":"05-02-2018-biggest-stories-in-the-cryptosphere-c3be4a3b5d5a","mainImage":"https://hackernoon.com/fallback-feat.png","tags":["bitcoin","blockchain","cryptocurrency","south-korea","new-york"],"profile":{"displayName":"BlockEx","handle":"BlockEx","avatar":"https://hackernoon.com/fallback-profile.png","autoGenerated":true},"fromSlack":false,"publishedAt":"2018-02-05T14:59:06.798Z"},{"id":"01-06-2018-biggest-stories-in-the-cryptosphere-3d0709c856db","title":"01/06/2018: Biggest Stories in the Cryptosphere","slug":"01-06-2018-biggest-stories-in-the-cryptosphere-3d0709c856db","mainImage":"https://hackernoon.com/hn-images/1*HOQubWx9kVt3h6ovrxnGWw.jpeg","tags":["blockchain","cryptocurrency","compliance","coupon","central-banking"],"profile":{"displayName":"BlockEx","handle":"BlockEx","autoGenerated":true,"avatar":"https://hackernoon.com/fallback-profile.png"},"fromSlack":false,"publishedAt":"2018-06-01T10:47:55.584Z"},{"id":"06-04-2018-biggest-stories-in-the-cryptosphere-d1ef0847361b","title":"06/04/2018: Biggest Stories in the Cryptosphere","slug":"06-04-2018-biggest-stories-in-the-cryptosphere-d1ef0847361b","mainImage":"https://hackernoon.com/fallback-feat.png","tags":["bitcoin","ico","cryptocurrency","blockchain","regulation"],"profile":{"displayName":"BlockEx","handle":"BlockEx","avatar":"https://hackernoon.com/fallback-profile.png","autoGenerated":true},"fromSlack":false,"publishedAt":"2018-04-06T14:49:56.962Z"}],"tagAd":{"id":"vVyaj5e6J3gcJaffZxSI","active":true,"category":[],"companyName":"Fastex","customAd":"https://cdn.hackernoon.com/images/img-ap23061.jpeg","firstColor":"#29c929","font":"HackerNoon","fontColor":"#FFFFFF","image":"https://cdn.hackernoon.com/images/img-q8130qx.jpeg","link":"https://bit.ly/4fb8Vca","logo":"https://cdn.hackernoon.com/images/img-8p3308w.png","parentCategory":["web3","gaming"],"secondColor":"#009300","tags":[],"text":"ftNFT YoCerebrum Awards 2024: Vote Now!","thirdColor":"#007200","type":"tag","website":"https://bit.ly/4fb8Vca"},"staticData":{"frLangTooltip":"Lisez cette histoire en Français!","about":"About","enLangTooltip":"Read this story in the original language, English!","loggedOutBookmark":"Create an account to store your bookmarks","learnMore":"Learn More","stats":"Stats","editStory":"Edit Story","audioPresented":"Audio Presented by","by":"by","audioTranslationText":null,"newStory":"New Story","loggedInBookmark":"Bookmark story","esLangTooltip":"Lee esta historia en Español!","relatedStories":"RELATED STORIES","addComment":"Add Comment","ptLangTooltip":"Leia esta história em português!","hiLangTooltip":"इस कहानी को हिंदी में पढ़ें!","comments":"Comments","removeBookmark":"Remove bookmark","commentReply":"Reply","minutes":"min","reads":"reads","trLangTooltip":"Bu hikayeyi Türkçe okuyun!","tags":"TOPICS","jaLangTooltip":"この物語を日本語で読んでください!","bnLangTooltip":"এই গল্পটি বাংলায় পড়ুন!","storyMentions":"MENTIONED IN THIS STORY","ruLangTooltip":"Прочтите эту историю на русском языке!","deLangTooltip":"Lesen Sie diese Geschichte auf Deutsch!","featuredIn":"THIS ARTICLE WAS FEATURED IN","tldrTitle":"Too Long; Didn't Read","koLangTooltip":"이 이야기를 한국어로 읽어보세요!","zhLangTooltip":"用繁體中文閱讀這個故事!","viLangTooltip":"Đọc bài viết này bằng tiếng Việt!"},"stats":{"pageviews":26767},"socialPreviewImage":"https://hackernoon.imgix.net/hn-images/1*CRPGT-xg-TExDl3cRLI-Og.png","requirePrism":true,"audioData":[{"avatar":"https://cdn.hackernoon.com/avatars/robot-b5.png","url":"https://storage.googleapis.com/hackernoon/audios/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371-en-US-Wavenet-I-MALE--407ee124d31f.mp3","audioPath":"audios/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371-en-US-Wavenet-I-MALE--407ee124d31f.mp3","nickname":"Dr. One (en-US)"}]},"slug":"how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371"},"__N_SSG":true},"page":"/[slug]","query":{"slug":"how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371"},"buildId":"xXlSxcnUdbwy3ckXHYhzq","isFallback":false,"dynamicIds":[83253,52876,50834,88554],"gsp":true,"scriptLoader":[{"id":"gtag_manager","strategy":"afterInteractive","dangerouslySetInnerHTML":{"__html":"(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'\u0026l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-WGQVQ44')"}}]}</script><div> <script type="text/javascript"> var _iub = _iub || []; _iub.csConfiguration = {"applyGdprForCH":false,"askConsentAtCookiePolicyUpdate":true,"countryDetection":true,"enableFadp":true,"enableLgpd":true,"enableTcf":true,"enableUspr":true,"gdprAppliesGlobally":false,"googleAdditionalConsentMode":true,"lang":"en","lgpdAppliesGlobally":false,"perPurposeConsent":true,"siteId":1848357,"tcfPurposes":{"2":"consent_only","7":"consent_only","8":"consent_only","9":"consent_only","10":"consent_only"},"cookiePolicyId":18778700, "banner":{ "acceptButtonCaptionColor":"white","acceptButtonColor":"#00d500","acceptButtonDisplay":true,"backgroundColor":"#000001","brandBackgroundColor":"#00FF00","brandTextColor":"#000000","closeButtonRejects":true,"customizeButtonCaptionColor":"#FFFFFF","customizeButtonColor":"#00AA00","customizeButtonDisplay":true,"explicitWithdrawal":true,"listPurposes":true,"logo":"https://hackernoon.imgix.net/hn-logo.png?auto=format&fit=max&w=320","ownerName":"Hacker Noon","position":"float-bottom-left","rejectButtonDisplay":true,"showPurposesToggles":true,"showTotalNumberOfProviders":true }}; </script> <script type="text/javascript" src="https://cs.iubenda.com/autoblocking/1848357.js"></script> <script type="text/javascript" src="//cdn.iubenda.com/cs/tcf/stub-v2.js"></script> <script type="text/javascript" src="//cdn.iubenda.com/cs/tcf/safe-tcf-v2.js"></script> <script type="text/javascript" src="//cdn.iubenda.com/cs/gpp/stub.js"></script> <script type="text/javascript" src="//cdn.iubenda.com/cs/iubenda_cs.js" charset="UTF-8" async></script> </div></body></html>