Index
b'# RSK Truffle Token Box\n\nTruffle box with everything you need to start creating a token using Open Zeppelin smart contracts library in Truffle framework, connected to a RSK network.\nIt includes network configurations for local node (regtest), Testnet and Mainnet.\n\n## Requirements\n\nThere are a few technical requirements before we start. \nTo use `Truffle boxes`, you need to have installed in your computer:\n\n- Git\n- a POSIX compliant shell\n- cURL\n- Node.js and NPM\n- a code editor\n\nIf you don\'t have any of them installed, go to the tutorial [Truffle boxes prerequisites](https://developers.rsk.co/tutorials/truffle-boxes/truffle-boxes-prerequisites/) which have all the instructions to setup these requirements.\n\n**Truffle framework**\n\nOnce you have those requirements installed, you only need one command to install `Truffle`.\nIt is better to do it globally:\n\n```shell\nnpm install -g truffle\n```\n\n## Installation\n\n1. Create a new folder. \nFor example, create the folder `rsk-token`.\nNavigate to the folder in the terminal.\n\n```shell\nmkdir rsk-token\ncd rsk-token\n```\n\n2. Run the unbox command. \nThis also takes care of installing the necessary dependencies and it can take some time.\n\n```shell\ntruffle unbox rsksmart/rsk-token-box\n```\n\nThis is the result using Windows OS:\n\n![truffle unbox](/images/image-01.png)\n\n## Development console\n\nTruffle has an interactive console that also spawns a development blockchain. This is very useful for compiling, deploying and testing locally.\n\n3. Run the development console. This command is successful if you see a list of 10 accounts, a mnemonic and the command prompt is now `truffle(develop)>`\n\n```shell\ntruffle develop\n```\n\nYou will now be in the truffle develop console with seeded accounts and their associated private keys listed.\n\n```txt\nC:\\RSK\\rsk-next>truffle develop\n\nTruffle Develop started at http://127.0.0.1:8545/\n\nAccounts:\n(0) 0x1056f747cf4bc7710e178b2aeed4eb8c8506c728\n(1) 0x45a71c00382c2898b5d6fae69a6f7bfe6edab80c\n(2) 0x1596384706dc9ac4cca7f50279a4abe591d6c3fe\n(3) 0x9576d0a496b645baa64f22aceb2328e7468d4113\n(4) 0xd431572eef7d77584d944c1809398a155e89f830\n(5) 0x92c111839718fe0800fadccc67068b40b8524a0f\n(6) 0x6da22b5a027146619bfe6704957f7f36ff029c48\n(7) 0x2c3a82d8c3993f8c80dcaf91025437bd057df867\n(8) 0xc43ae7a44f7deb759177b7093f06512a0a9ff5d7\n(9) 0xe61bf00cd7dce248449cfe58f23a4ef7d542bc0b\n\nPrivate Keys:\n(0) f32f32839fe27ad906b63eafb326f26fed95c231e3c5e33c7cdd08f62db63167\n(1) ebef990088f27f6ef13b5e52a77d5dcc5a76862a701908c586d01b6fe93562b3\n(2) 598ccae5e4436fedeb0e798c0d254789c55a63401ebfc3ae8ddde29634ddfcde\n(3) 09934b80f391e0024b8cb00cd73790fdf64c4d0509e144766414fee317cd3f4e\n(4) ac745b84b6574b5738d364b43e0d471c9d5107504acc709c90f6f091b78c751b\n(5) 449654cde095f2349113ef12a93e139b4302bc95adb3619d08adf53dde9b8847\n(6) c217f12a89c352fc70b5f1bd5742314b4fb1bb1e35cb779fdb3c2390106355db\n(7) 1d4c74dfa4e99e161130c18cc63938bb120a128cefbf1b9188efc678bf5722cb\n(8) 0f44e0becf2e090db498a1b747d2a758fcc81fb0241f350d61117a9c6b1fa82e\n(9) 85218c5eec657470dafeb09e6f7101f91d21bfe822fbeeecfc9275f798662a63\n\nMnemonic: virtual valve razor retreat either turn possible student grief engage attract fiber\n\n\xe2\x9a\xa0\xef\xb8\x8f Important \xe2\x9a\xa0\xef\xb8\x8f : This mnemonic was created for you by Truffle. It is not secure.\nEnsure you do not use it on production blockchains, or else you risk losing funds.\n\ntruffle(develop)>\n```\n\n## Token.sol\n\nTake a look at the smart contract `Token.sol`. You can check it out in folder `contracts`.\n\n![Token.sol](/images/image-19.png)\n\n> Token.sol has only 7 code lines!\n\nThis smart contract is a mintable [ERC20](https://eips.ethereum.org/EIPS/eip-20) token. This means that, in addition to the standard ERC20 specification, it has a function for issuing new tokens.\n\nTo create our ERC20 Token, we will import `ERC20Mintable` from Open Zeppelin. \nThis library itself imports several other libraries such as `SafeMath.sol`, the standards for this kind of token, and the capability to mint tokens.\n\nInside the token, we define some basic information about the token: `name`, `symbol`, and number of `decimals` for the precision.\n\nTo inherit the library\'s attributes and functions, we simply define our contract as a `ERC20Mintable` using the `is` keyword in this way.\n\n4. Compile the smart contract. \n\nNote inside the development console we don\'t preface commands with `truffle`.\n\n> To make sure you\'re in the development console, the command prompt must be `truffle(develop)>`\n\n```shell\ncompile\n```\n\nThe `compile output` should be similar to:\n\n![truffle compile](/images/image-02.png)\n\n5. Deploy (migrate) the smart contract.\n\n```shell\nmigrate\n```\n\nAnd the `migrate output` should be similar to:\n\n![truffle migrate](/images/image-03.png)\n\n6. Running contract tests.\n\nThis Truffle box also comes with the file `TestToken.js` which include some examples for testing the smart contract. \nYou can check it out in the `test` folder.\n\nThere are many other tests which can be done to check an ERC20 token.\n\nRun this command in the development console:\n\n```shell\ntest\n```\n\nThis `test output` should be similar to:\n\n![truffle test](/images/image-04.png)\n\nNote the command varies slightly if you\'re in or outside of the development console.\n\n```javascript\n// inside the development console.\ntest\n\n// outside the development console.\ntruffle test\n```\n\n## Interact with the token using Truffle console \n\n1. Get your accounts in Truffle console.\n\nIn the Truffle console, enter:\n\n```javascript\nconst accounts = await web3.eth.getAccounts()\n```\n\nDon\xe2\x80\x99t worry about the `undefined` return, it is ok. See the addresses after it by entering the command below:\n\n```javascript\naccounts\n```\n\nAnd to view each account:\n\n```javascript\naccounts[0]\naccounts[1]\n```\n\nTake a look in the results:\n\n![accounts](/images/image-05.png)\n\n2. Interact with the token using Truffle console.\n\nFirst of all, connect with your token\n\n```javascript\nconst token = await Token.deployed()\n```\n\n3. Confirm if our instance is OK.\n\nEnter the instance\xe2\x80\x99s name: `token`, then `.`, without space hit the TAB button twice to trigger auto-complete as seen below. \nThis will display the published address of the smart contract, and the transaction hash for its deployment, among other things, including all public variables and methods available.\n\n```javascript\ntoken. [TAB] [TAB]\n```\n\n![token tab tab](/images/image-06.png)\n\n4. Check the total supply\n\nTo check if we have tokens already minted, call the `totalSupply` function:\n\n```javascript\n(await token.totalSupply()).toString()\n```\n\nThe returned value is 0, which is expected, since we did not perform any initial mint when we deployed the token.\n\n5. Check the token balance\n\nTo check the balance of an account, call the `balanceOf` function. For example, to check the balance of account 0:\n\n```javascript\n(await token.balanceOf(accounts[0])).toString()\n```\n\nTake a look in the results of total supply and balanceOf:\n\n![total supply and balanceOf 0](/images/image-09.png)\n\nThe returned value is also 0, which is expected, since we did not make any initial mint when we deployed the token, and by definition no accounts can have any tokens yet.\n\n6. Mint tokens\n\nRun this command:\n\n```javascript\ntoken.mint(accounts[0], 10000)\n```\n\nThis command sent a transaction to mint 100 tokens for account 0. \n\n![token.mint account 0](/images/image-10.png)\n\nYou can also mint to a specific address, `0xa52515946DAABe072f446Cc014a4eaA93fb9Fd79`:\n\n```javascript\ntoken.mint("0xa52515946DAABe072f446Cc014a4eaA93fb9Fd79", 10000)\n```\n\n![token.mint address](/images/image-11.png)\n\n7. Reconfirm the token balance\n\nCheck the balance of account 0 again:\n\n```javascript\n(await token.balanceOf(accounts[0])).toString()\n```\n\nThe returned value is 10000, which is 100 with 2 decimal places of precision. This is exactly what we expected, as we issued 100 tokens\n\nAlso, you can get the balance of a specific address, for example, `0xa52515946DAABe072f446Cc014a4eaA93fb9Fd79`:\n\n```javascript\n(await token.balanceOf("0xa52515946DAABe072f446Cc014a4eaA93fb9Fd79")).toString()\n```\n\nTake a look in the results:\n\n![balanceOf account 0 and address with 10000](/images/image-13.png)\n\n8. Check the total supply (again)\n\nCheck the total supply again:\n\n```javascript\n(await token.totalSupply()).toString()\n```\n\n![totalSupply 20000](/images/image-15.png)\n\nThe returned value is 20000, which is 200 with 2 decimal places of precision. \nAfter minting 100 tokens for 2 accounts, this is perfect!\n\n9. Transfer tokens\n\nTo transfer 40 tokens from account 0 to account 2. \nThis can be done by calling the `transfer` function.\n\n```javascript\ntoken.transfer(accounts[2], 4000, {from: accounts[0]})\n```\n\n![token.transfer](/images/image-16.png)\n\nAccount 2 had no tokens before the transfer, and now it should have 40. Account 1 must have 60 tokens. Also the total supply will be the same.\n\nLet\xe2\x80\x99s check the balance of each account and the total supply:\n\n```javascript\n(await token.balanceOf(accounts[2])).toString()\n(await token.balanceOf(accounts[0])).toString()\n(await token.totalSupply()).toString()\n```\n\nTake a look in the results:\n\n![balances after transfer](/images/image-17.png)\n\nGreat! The balances of both accounts and the total supply are correct.\n\n### Exit Truffle console\n\nIn the Truffle console, enter this command to exit the terminal:\n\n```shell\n.exit\n```\n\n## Using RSK networks\n\nThis Truffle box is already configured to connect to three RSK networks: \n\n1. regtest (local node)\n2. testnet\n3. mainnet\n\nTestnet will be used here. \n\nWe need to do some tasks:\n\n- Setup an account and get R-BTC\n- Update RSK network gas price\n- Connect to an RSK network\n- Deploy in the network of your choose\n\n### Setup an account & get R-BTC\n\n1. Create a wallet\n\nThe easy way to setup an account is using a web3 wallet injected in the browser.\nSome options are:\n- [Metamask](https://metamask.io/)\n- [Nifty](https://www.poa.network/for-users/nifty-wallet)\n\nSelect the RSK Network in the web wallet.\n- Nifty: select in the dropdown list\n- Metamask: go to [RSK Testnet](https://developers.rsk.co/wallet/use/metamask/) to configure it in `Custom RPC`\n\nYou can learn more about [account based RSK addresses](https://developers.rsk.co/rsk/architecture/account-based/ "Account based RSK addresses - RSK Developers Portal").\n\nTake a look `truffle-config.js` file to realize that we are using `HDWalletProvider` with RSK Networks derivations path:\n- RSK Testnet dpath: `m/44\xe2\x80\x99/37310\xe2\x80\x99/0\xe2\x80\x99/0`\n- RSK Mainnet dpath: `m/44\xe2\x80\x99/137\xe2\x80\x99/0\xe2\x80\x99/0`\n\nFor more information check [RSKIP57](https://github.com/rsksmart/RSKIPs/blob/master/IPs/RSKIP57.md).\n\n2. Update `.secret` file\n\nAfter create your wallet, update your mnemonic in the file `.secret`, located in the folder project, and save it.\n\n3. Get some R-BTCs:\n- For the RSK Testnet, get tR-BTC from [our faucet](https://faucet.testnet.rsk.co/).\n- For the RSK Mainnet, get R-BTC from [an exchange](https://developers.rsk.co/rsk/rbtc/).\n\n### Setup the gas price\n\n**Gas** is the internal pricing for running a transaction or contract. When you send tokens, interact with a contract, send R-BTC, or do anything else on the blockchain, you must pay for that computation. That payment is calculated as gas. In RSK, this is paid in **R-BTC**.\nThe **minimumGasPrice** is written in the block header by miners and establishes the minimum gas price that a transaction should have in order to be included in that block.\n\nTo update the **minimumGasPrice** in our project run this query using cURL:\n\n**Testnet**\n\n```shell\ncurl https://public-node.testnet.rsk.co/ -X POST -H "Content-Type: application/json" \\\n --data \'{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}\' \\\n > .minimum-gas-price-testnet.json\n```\n\n**Mainnet**\n\n```shell\ncurl https://public-node.rsk.co/ -X POST -H "Content-Type: application/json" \\\n --data \'{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}\' \\\n > .minimum-gas-price-mainnet.json\n```\n\nThis query saved the details of latest block to \nfile .minimum-gas-price-testnet.json \nor .minimum-gas-price-mainnet.json, respectively.\n\nIn the `truffle-config.js`, we are reading the parameter `minimumGasPrice` in each json file.\n\nFor more information about the **Gas** and **minimumGasPrice** please go to the [gas page](https://developers.rsk.co/rsk/rbtc/gas/ "Gas - RSK Developers Portal").\n\n### Connect to RSK Testnet or Mainnet\n\nRun the development console for any RSK network.\n\n```shell\n# Console for Testnet\ntruffle console --network testnet\n\n# Console for Mainnet\ntruffle console --network mainnet\n```\n\n### Test the connection to RSK network\n\nOn any of the networks, run this commands in the Truffle console:\n\n#### Block number\nShows the last block number.\n\n```javascript\n(await web3.eth.getBlockNumber()).toString()\n```\n#### Network ID\n\nTo get the network ID, run this command:\n\n```javascript\n(await web3.eth.net.getId()).toString()\n```\n\nList of network IDs:\n- mainnet: 30\n- testnet: 31\n- regtest (local node): 33\n\nExit the Truffle console:\n\n```shell\n.exit\n```\n\n### Compile and migrate the smart contracts. \n\nWe will do it running the below commands directly in the terminal, without using the truffle console, this is to show you an alternative.\n\nOn any of the networks, run this commands in a terminal (not in Truffle console).\nTo use Testnet or Mainnet, you need to specify this using the parameter `-- network`:\n\n```shell\ntruffle migrate --network testnet\n```\n\nThe migrate process in a real blockchain takes more time, because Truffle creates some transactions which need to be mined on the blockchain.\n\n### Where to go from here\n\nInteract with the token published on an RSK network using Truffle console, doing the same steps which was done before:\n\n- Get your accounts\n- Connect with your token\n- Check the total supply or the token balance\n- Mint tokens\n- Transfer tokens\n\nAt this point, we have installed all requirements and created a token using Truffle framework and Open Zeppelin smart contracts library,\nconnected to an RSK local node (Regtest), the RSK Testnet and the RSK Mainnet.\n\n**Find more documentation**\n\nCheck out the [RSK developers portal](https://developers.rsk.co/).\n\n**Do you have questions?**\n\nAsk in the [RSK chat](https://gitter.im/rsksmart/getting-started).\n'