{"meta":{"version":1,"warehouse":"3.0.1"},"models":{"Asset":[{"_id":"source/CNAME","path":"CNAME","modified":0,"renderable":0},{"_id":"source/browserconfig.xml","path":"browserconfig.xml","modified":0,"renderable":0},{"_id":"source/embark-logo.svg","path":"embark-logo.svg","modified":0,"renderable":0},{"_id":"source/favicon.ico","path":"favicon.ico","modified":0,"renderable":0},{"_id":"source/robots.txt","path":"robots.txt","modified":0,"renderable":0},{"_id":"source/coverage-files.png","path":"coverage-files.png","modified":0,"renderable":0},{"_id":"source/coverage-report.png","path":"coverage-report.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/bamboo.png","path":"plugins/thumbnails/bamboo.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/fortune.jpg","path":"plugins/thumbnails/fortune.jpg","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/haml.png","path":"plugins/thumbnails/haml.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/pug.png","path":"plugins/thumbnails/pug.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/remix copy.png","path":"plugins/thumbnails/remix copy.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/remix.png","path":"plugins/thumbnails/remix.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/solidity.png","path":"plugins/thumbnails/solidity.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/solium.png","path":"plugins/thumbnails/solium.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/status.png","path":"plugins/thumbnails/status.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/angular.png","path":"templates/thumbnails/angular.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/bamboo.png","path":"templates/thumbnails/bamboo.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/react.png","path":"templates/thumbnails/react.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/sggc.png","path":"templates/thumbnails/sggc.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/typescript.png","path":"templates/thumbnails/typescript.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/vortex.png","path":"templates/thumbnails/vortex.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/vuejs.png","path":"templates/thumbnails/vuejs.png","modified":0,"renderable":0},{"_id":"source/templates/thumbnails/vyper.png","path":"templates/thumbnails/vyper.png","modified":0,"renderable":0},{"_id":"source/tutorials/infura_guide/api-keys.png","path":"tutorials/infura_guide/api-keys.png","modified":0,"renderable":0},{"_id":"source/tutorials/infura_guide/lift-off.jpg","path":"tutorials/infura_guide/lift-off.jpg","modified":0,"renderable":0},{"_id":"themes/embark/source/css/embark.scss","path":"css/embark.scss","modified":0,"renderable":1},{"_id":"themes/embark/source/js/index.js","path":"js/index.js","modified":0,"renderable":1},{"_id":"source/assets/images/cockpit_debugger_controls.png","path":"assets/images/cockpit_debugger_controls.png","modified":0,"renderable":0},{"_id":"source/assets/images/crystal-thread-test.png","path":"assets/images/crystal-thread-test.png","modified":0,"renderable":0},{"_id":"source/plugins/thumbnails/mythx.png","path":"plugins/thumbnails/mythx.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/page_1.png","path":"assets/images/token_factory_1/page_1.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/page_2.png","path":"assets/images/token_factory_1/page_2.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/page_3.png","path":"assets/images/token_factory_1/page_3.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/page_4.png","path":"assets/images/token_factory_1/page_4.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/page_5.png","path":"assets/images/token_factory_1/page_5.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_1.png","path":"assets/images/token_factory_2/page_1.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_2.png","path":"assets/images/token_factory_2/page_2.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_3.png","path":"assets/images/token_factory_2/page_3.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_4.png","path":"assets/images/token_factory_2/page_4.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_5.png","path":"assets/images/token_factory_2/page_5.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_6.png","path":"assets/images/token_factory_2/page_6.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/page_7.png","path":"assets/images/token_factory_2/page_7.png","modified":0,"renderable":0},{"_id":"themes/embark/source/assets/icons/app-window-search-text.svg","path":"assets/icons/app-window-search-text.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/arrow-down-1.svg","path":"assets/icons/arrow-down-1.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/arrow-left-1.svg","path":"assets/icons/arrow-left-1.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/arrow-right-1.svg","path":"assets/icons/arrow-right-1.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/arrow-up-1.svg","path":"assets/icons/arrow-up-1.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/browser-gauge.svg","path":"assets/icons/browser-gauge.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/check.svg","path":"assets/icons/check.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/close.svg","path":"assets/icons/close.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/computer-bug-search.svg","path":"assets/icons/computer-bug-search.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/copy-paste.svg","path":"assets/icons/copy-paste.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/crypto-currency-bitcoin-circle.svg","path":"assets/icons/crypto-currency-bitcoin-circle.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/github.svg","path":"assets/icons/github.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/list-to-do.svg","path":"assets/icons/list-to-do.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/module.svg","path":"assets/icons/module.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/navigation-menu.svg","path":"assets/icons/navigation-menu.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/notes-paper-text.svg","path":"assets/icons/notes-paper-text.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/paginate-filter-video-alternate.svg","path":"assets/icons/paginate-filter-video-alternate.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/pen-write-paper.svg","path":"assets/icons/pen-write-paper.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/pie-line-graph.svg","path":"assets/icons/pie-line-graph.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/rating-star.svg","path":"assets/icons/rating-star.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/search-bar.svg","path":"assets/icons/search-bar.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/symbols.html","path":"assets/icons/symbols.html","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/symbols.svg","path":"assets/icons/symbols.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/tag-new-circle.svg","path":"assets/icons/tag-new-circle.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/icons/twitter.svg","path":"assets/icons/twitter.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/Nimbus.svg","path":"assets/images/Nimbus.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/apple-touch-icon-120x120-precomposed.png","path":"assets/images/apple-touch-icon-120x120-precomposed.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/apple-touch-icon-152x152-precomposed.png","path":"assets/images/apple-touch-icon-152x152-precomposed.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/apple-touch-icon-180x180-precomposed.png","path":"assets/images/apple-touch-icon-180x180-precomposed.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/apple-touch-icon-60x60-precomposed.png","path":"assets/images/apple-touch-icon-60x60-precomposed.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/apple-touch-icon-76x76-precomposed.png","path":"assets/images/apple-touch-icon-76x76-precomposed.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/apple-touch-icon-precomposed.png","path":"assets/images/apple-touch-icon-precomposed.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/company-flexdapps.svg","path":"assets/images/company-flexdapps.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/company-giveth.svg","path":"assets/images/company-giveth.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/company-status.svg","path":"assets/images/company-status.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/dots.png","path":"assets/images/dots.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/favicon-16.png","path":"assets/images/favicon-16.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/favicon-32.png","path":"assets/images/favicon-32.png","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/keycard-logo-negative.svg","path":"assets/images/keycard-logo-negative.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/logo-negative.svg","path":"assets/images/logo-negative.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/logo.svg","path":"assets/images/logo.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/rocket-start.svg","path":"assets/images/rocket-start.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/status-logo.svg","path":"assets/images/status-logo.svg","modified":0,"renderable":1},{"_id":"themes/embark/source/js/linkjuice/README.md","path":"js/linkjuice/README.md","modified":0,"renderable":1},{"_id":"themes/embark/source/js/linkjuice/gulpfile.js","path":"js/linkjuice/gulpfile.js","modified":0,"renderable":1},{"_id":"themes/embark/source/js/linkjuice/package.json","path":"js/linkjuice/package.json","modified":0,"renderable":1},{"_id":"source/assets/images/cockpit_dashboard_release.png","path":"assets/images/cockpit_dashboard_release.png","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_editor_release.png","path":"assets/images/cockpit_editor_release.png","modified":0,"renderable":0},{"_id":"source/assets/images/nimble-creating-app.png","path":"assets/images/nimble-creating-app.png","modified":0,"renderable":0},{"_id":"themes/embark/source/assets/images/bg-hexagons.png","path":"assets/images/bg-hexagons.png","modified":0,"renderable":1},{"_id":"source/assets/images/cockpit_contracts_view.gif","path":"assets/images/cockpit_contracts_view.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_selective_deployment.gif","path":"assets/images/cockpit_selective_deployment.gif","modified":0,"renderable":0},{"_id":"source/assets/images/nim-crystal-header_blank.jpg","path":"assets/images/nim-crystal-header_blank.jpg","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/console_2.png","path":"assets/images/token_factory_1/console_2.png","modified":0,"renderable":0},{"_id":"themes/embark/source/assets/images/tool-screenshot.png","path":"assets/images/tool-screenshot.png","modified":0,"renderable":1},{"_id":"themes/embark/source/js/linkjuice/src/linkjuice.js","path":"js/linkjuice/src/linkjuice.js","modified":0,"renderable":1},{"_id":"source/assets/images/nim-crystal-header-img_NEW.jpg","path":"assets/images/nim-crystal-header-img_NEW.jpg","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/console_2.png","path":"assets/images/token_factory_2/console_2.png","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_dashboard.png","path":"assets/images/cockpit_dashboard.png","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_dashboard_dark.png","path":"assets/images/cockpit_dashboard_dark.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/console_1.png","path":"assets/images/token_factory_1/console_1.png","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_explorer_block.png","path":"assets/images/cockpit_explorer_block.png","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_2/console_1.png","path":"assets/images/token_factory_2/console_1.png","modified":0,"renderable":0},{"_id":"themes/embark/source/assets/images/EMBARK_HEADER_ALT_OPTIMIZED.jpg","path":"assets/images/EMBARK_HEADER_ALT_OPTIMIZED.jpg","modified":0,"renderable":1},{"_id":"themes/embark/source/assets/images/cli-tool.png","path":"assets/images/cli-tool.png","modified":0,"renderable":1},{"_id":"source/assets/images/cockpit_explorer_overview.png","path":"assets/images/cockpit_explorer_overview.png","modified":0,"renderable":0},{"_id":"themes/embark/source/assets/images/EMBARK_MODULAR.png","path":"assets/images/EMBARK_MODULAR.png","modified":0,"renderable":1},{"_id":"source/assets/images/cockpit_explorer_contracts_detail.gif","path":"assets/images/cockpit_explorer_contracts_detail.gif","modified":0,"renderable":0},{"_id":"themes/embark/source/assets/images/EMBARK_FRAMEWORK.png","path":"assets/images/EMBARK_FRAMEWORK.png","modified":0,"renderable":1},{"_id":"source/assets/images/embark-dashboard.png","path":"assets/images/embark-dashboard.png","modified":0,"renderable":0},{"_id":"source/assets/images/website_release.png","path":"assets/images/website_release.png","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_explorer_transactions.gif","path":"assets/images/cockpit_explorer_transactions.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_suggestions.gif","path":"assets/images/cockpit_suggestions.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_using_debugger.gif","path":"assets/images/cockpit_using_debugger.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_search.gif","path":"assets/images/cockpit_search.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_explorer_account.gif","path":"assets/images/cockpit_explorer_account.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_editor.gif","path":"assets/images/cockpit_editor.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_enter_debugger.gif","path":"assets/images/cockpit_enter_debugger.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_navigation.gif","path":"assets/images/cockpit_navigation.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_change_theme.gif","path":"assets/images/cockpit_change_theme.gif","modified":0,"renderable":0},{"_id":"source/assets/images/cockpit_dashboard_contracts.gif","path":"assets/images/cockpit_dashboard_contracts.gif","modified":0,"renderable":0},{"_id":"source/assets/images/token_factory_1/dashboard.png","path":"assets/images/token_factory_1/dashboard.png","modified":0,"renderable":0}],"Cache":[{"_id":"source/CNAME","hash":"fbac6d19ee04b9b7f4b3085544d024ec900c633c","modified":1579288027510},{"_id":"source/browserconfig.xml","hash":"f54412705ab9eb69b544f438c9a1e15ae57f27c0","modified":1579287603896},{"_id":"source/embark-logo.svg","hash":"af5b81d96dd4f7e4e65851e53866da7883daf52e","modified":1579287603900},{"_id":"source/favicon.ico","hash":"96b9a549337c2bec483c2879eeafa4d1f8748fed","modified":1579287603900},{"_id":"source/index.md","hash":"0a8e37f1549e24d127e9b65773ae00826d0b53c6","modified":1579287603900},{"_id":"source/robots.txt","hash":"7e49dfd97319f5dd7cdaea8518cf43e0e8d01e5a","modified":1579287603900},{"_id":"themes/embark/package.json","hash":"e0fd017f645e29e5a28e9e449340e16d882606a9","modified":1579287603904},{"_id":"source/coverage-files.png","hash":"e9b0f9b1f09dc16409266dfbc1223f274dd63cbc","modified":1579287603896},{"_id":"source/_data/authors.yml","hash":"3250f13e4e2b6659b36e0932fe5b247fb8f4a4de","modified":1579287603592},{"_id":"source/_data/categories.yml","hash":"3c7131ed69c491243da443abca694a5c33d281b6","modified":1579287603592},{"_id":"source/_data/languages.yml","hash":"74e55635eb66bb12833e42f0d1057b03beb65bcf","modified":1579287603592},{"_id":"source/_data/menu.yml","hash":"bf3d8f131b64deb519c503acad1d98c260c7bef8","modified":1579288101159},{"_id":"source/_data/plugins.yml","hash":"250b7281973f7c96b773150c5215edffcabc8297","modified":1579287603592},{"_id":"source/_data/sidebar.yml","hash":"0ea60cee0c8cfd15952164e2c4f0f7ac5baff74b","modified":1579287603592},{"_id":"source/_data/templates.yml","hash":"b3788ddea48d674814d43d5839c803973b5048dc","modified":1579287603592},{"_id":"source/_data/tutorials.yml","hash":"6546e52f28f25f5eed82a13390ff7dc1e40d8f9b","modified":1579287603592},{"_id":"source/_data/versions.yml","hash":"cd2fa4daacd76674ce649c14546969a97d3345dc","modified":1579287603592},{"_id":"source/_posts/2017-06-28-embark-2-5-released.md","hash":"5d149e9a2abea4c7ab621dfc846e8e15e67d0e54","modified":1579287936382},{"_id":"source/_posts/2017-10-25-embark-2-6-released.md","hash":"960e06e89708a2c7efb4e2833f3330e50df4ca5c","modified":1579287936382},{"_id":"source/_posts/2018-05-04-embark-3-0-released.md","hash":"4cf8bb333f592852b0ad914c41a39f885d92bcd6","modified":1579287936386},{"_id":"source/_posts/2018-06-20-embark-3-1-released.md","hash":"cbfe0ade135b7adcfe7d8ccb44b9651f5ac9571d","modified":1579287936386},{"_id":"source/_posts/2018-09-27-how-to-create-a-token-factory-with-embark-part-1.md","hash":"8ea53fd35fc3d70303cbc0bc8ae727cd53d1b23c","modified":1579287936386},{"_id":"source/_posts/2018-10-27-how-to-create-a-token-factory-with-embark-part-2.md","hash":"ce159ff1451a5b7eee2524f9d405f74f0538073f","modified":1579287936386},{"_id":"source/_posts/2019-01-23-building-smart-contract-only-dapps.md","hash":"07ee6e18303761d241359b84d5ca49a895ae3f54","modified":1579287936386},{"_id":"source/_posts/2019-01-28-running-embark-tests-on-a-continuous-integration-server.md","hash":"b9b5affc2764a4b92fee15c6bd12201ee4d6c7c4","modified":1579287936386},{"_id":"source/_posts/2019-02-04-building-a-decentralized-reddit-with-embark-part-1.md","hash":"57de8cfef3e845f2bd86d01c01efc1fcc8bf23fe","modified":1579287936386},{"_id":"source/_posts/2019-02-11-building-a-decentralized-reddit-with-embark-part-2.md","hash":"3aa3e6ef8fbb7c57f07ee3b0738ccf3791e792c5","modified":1579287936386},{"_id":"source/_posts/2019-02-18-building-a-decentralized-reddit-with-embark-part-3.md","hash":"f985d4e255f1b4794ae75dbf6cecc6375b2b8a52","modified":1579287936394},{"_id":"source/_posts/2019-03-18-upgrading-to-embark-4.md","hash":"7210608db644fcd5bfdeb10a04d9f46ac04161f7","modified":1579287936394},{"_id":"source/_posts/2019-03-19-introducing-embark-4.md","hash":"50072eac21af7cd032c33cd410fbb743010caa34","modified":1579287936394},{"_id":"source/_posts/2019-07-23-whats-new-in-embark-4.1.md","hash":"a94ea4f4be86a38487e256589d81e6aa5a442563","modified":1579287936394},{"_id":"source/_posts/2019-11-18-nim-vs-crystal-part-1-performance-interoperability.md","hash":"22c1e00430cf3e46211ee0b77dd9217ffcea6dff","modified":1579287936394},{"_id":"source/_posts/2019-11-21-nim-vs-crystal-part-2-threading-tooling.md","hash":"307509171f13c6fa9e47627d1f79bd8dde494e4d","modified":1579287936402},{"_id":"source/_posts/2019-11-28-nim-vs-crystal-part-3-cryto-dapps-p2p.md","hash":"3aded116db278f1fd187152731ef786b5ca3b216","modified":1579287936402},{"_id":"source/_posts/2019-12-09-web3-what-are-your-options.md","hash":"dfdb600fe049af860315423d51f1ec5a184dfce6","modified":1579287936402},{"_id":"source/_posts/2020-01-09-take-back-the-web-hackathon.md","hash":"b40dfd06e176be35860fe7679b059773f94c8e63","modified":1579287936418},{"_id":"source/_posts/2020-01-13-announcing-embark-5.md","hash":"8a0c697a5716fabb90fd1a3f04cf48d80bdaa485","modified":1579287936422},{"_id":"source/chat/index.md","hash":"f4e76f80e3bcf796e5c06080b745129f389de4b6","modified":1579287603896},{"_id":"source/community/index.md","hash":"abc586bb9afa334aefcc6da5f995be6fced6fced","modified":1579287603896},{"_id":"source/coverage-report.png","hash":"4f2e52ad838258e4e7ee03f2cfd4bdd9be2c4046","modified":1579287603896},{"_id":"source/docs/bamboo.md","hash":"1de26c6b54eac46a3b701eb842637b0dd6f8668b","modified":1579287603896},{"_id":"source/docs/blockchain_accounts_configuration.md","hash":"2418ac7cdbb8e02d7f3dcbba489de45ad54b4824","modified":1579287603896},{"_id":"source/docs/blockchain_configuration.md","hash":"b81dde0f72f185a016537287dbc2d3d375a26a23","modified":1579287603896},{"_id":"source/docs/cockpit_dashboard.md","hash":"53e5bc1ffdf3e247d4cc7e97e9f56af96f6e8d56","modified":1579287603896},{"_id":"source/docs/cockpit_deployment.md","hash":"b9c0a1e9bdb4ae6e3ee192d3b8ab90d42a302264","modified":1579287603896},{"_id":"source/docs/cockpit_editor.md","hash":"099d331e041671790bbc212d752d37b832868504","modified":1579287603896},{"_id":"source/docs/cockpit_explorer.md","hash":"b887c079e3442c4e48ea518de30c282186983c45","modified":1579287603896},{"_id":"source/docs/cockpit_introduction.md","hash":"e6c36e3bb3fae88eed1d17860a85ba0366b50009","modified":1579287603896},{"_id":"source/docs/cockpit_utils.md","hash":"9ed2f52f1a0b15fed6fc61e685558e1ed242cd1e","modified":1579287603896},{"_id":"source/docs/configuration.md","hash":"906896808f07737b17f5d8afd3aa713c22952349","modified":1579287603896},{"_id":"source/docs/console_commands.md","hash":"2855fb1b8ee0429e402450ed4d9f38dd2e145cb5","modified":1579287603896},{"_id":"source/docs/contracts_configuration.md","hash":"574ac3d6d2ac48282a8c60ea86d5f2a445426fb1","modified":1579287603896},{"_id":"source/docs/contracts_deployment.md","hash":"87cba365f821abd91399fd773048a02a0c897607","modified":1579287603896},{"_id":"source/docs/contracts_imports.md","hash":"a4d6267182dff8c7dc2a096bbda08bc9c45cbd96","modified":1579287603896},{"_id":"source/docs/contracts_javascript.md","hash":"336454607755a5580e0c36f3d9c60ddcf20318d4","modified":1579287603896},{"_id":"source/docs/contracts_testing.md","hash":"ccaa64628ab2ce6b42013a461a65c07668f4bb5f","modified":1579287603896},{"_id":"source/docs/contributing.md","hash":"1f65122d3bf2b882f23aa804379566fefde33085","modified":1579287603900},{"_id":"source/docs/create_project.md","hash":"33fced887917a55266180ac0e031e13f5403a562","modified":1579287603900},{"_id":"source/docs/creating_plugins.md","hash":"2be705b9646c4041eb7d50a6b1641131f79bd497","modified":1579287603900},{"_id":"source/docs/dashboard.md","hash":"d24645009374a2a4dff4ddbb72bb85ff885d80a2","modified":1579287603900},{"_id":"source/docs/embark_commands.md","hash":"39cd9d4622035b3f2b82dc8fee5eab25cabe82a2","modified":1579287603900},{"_id":"source/docs/environments.md","hash":"c71903c0fd3349b905c8d6c659211fde5c6732e8","modified":1579287603900},{"_id":"source/docs/faq.md","hash":"8154c0047d7de4d63f6337769e7ead2542ffd9aa","modified":1579287603900},{"_id":"source/docs/index.md","hash":"f1870f73da1edb4a5b7a8aacb508e183ea88f7e5","modified":1579287603900},{"_id":"source/docs/installation.md","hash":"c0dcad13661012e0f307b78cc83ef6d16f12f069","modified":1579287603900},{"_id":"source/docs/installing_embarkjs.md","hash":"cf7a19d5f0262f9da14ca33a45a32303c8874694","modified":1579287603900},{"_id":"source/docs/installing_plugins.md","hash":"4575e3c53d3a55d184d10ffb4900b59cf718390e","modified":1579287603900},{"_id":"source/docs/javascript_usage.md","hash":"70a188d16a66e2a1e2b524f04b140bbc3b397367","modified":1579287603900},{"_id":"source/docs/messages_configuration.md","hash":"bb298e851d786cbcb8431bb12bc24f81f9cb3de5","modified":1579287603900},{"_id":"source/docs/messages_javascript.md","hash":"57884a9cc96813469d1c097f08e95e56e62af2aa","modified":1579287603900},{"_id":"source/docs/migrating_from_3.x.md","hash":"707aa9b83492393615b16eb9bde367a0f99f1bf2","modified":1579287603900},{"_id":"source/docs/naming_configuration.md","hash":"a80f6e0dd9f3bb25ead13dc2cb2ab79799f38766","modified":1579287603900},{"_id":"source/docs/naming_javascript.md","hash":"5118e7571f0721579981f68c9ea9c8d127126a08","modified":1579287603900},{"_id":"source/docs/overview.md","hash":"81730977a793a0f4cd2243a5dddf3347736303eb","modified":1579287603900},{"_id":"source/docs/pipeline_and_webpack.md","hash":"2d4168eb25766e4558546043538283e87ec916ce","modified":1579287603900},{"_id":"source/docs/plugin_reference.md","hash":"ffc8755b9fee5db7123b120ca0430edb0129bb22","modified":1579287603900},{"_id":"source/docs/quick_start.md","hash":"c7944c6c0344696dc9a47f11a83f98b892ae2f87","modified":1579287603900},{"_id":"source/docs/running_apps.md","hash":"0519272706734c5f9e2184a9680e192e56a2ca47","modified":1579287603900},{"_id":"source/docs/sending_and_receiving_messages.md","hash":"3fe8e66233492f4fb312dcb90cc7ba74ba689ce4","modified":1579287603900},{"_id":"source/docs/smart_contract_objects.md","hash":"7e72a5d62e915d680ad7ed0adbd7c758eafa5a6b","modified":1579287603900},{"_id":"source/docs/solidity.md","hash":"2a8c16ac8c2d049b9d7d91f530b0dddd0f9d73b2","modified":1579287603900},{"_id":"source/docs/storage_configuration.md","hash":"bd275b61fe3b7cc3577f9d30e25d3e7ad7a76795","modified":1579287603900},{"_id":"source/docs/storage_deployment.md","hash":"2f31438f49648a497ffbae160e509bde0c9609ec","modified":1579287603900},{"_id":"source/docs/storage_javascript.md","hash":"f3996b2415cf4a277681f1708b06fe186a54ab2f","modified":1579287603900},{"_id":"source/docs/structure.md","hash":"507a4a506daa32ec5a49fd19f15b6100cf673c13","modified":1579287603900},{"_id":"source/docs/cockpit_debugger.md","hash":"f38a1789e23c0bfad66c116c38aaf6448365adb1","modified":1579287603896},{"_id":"source/docs/troubleshooting.md","hash":"763bb0eeedf73d23c21230cd25ad948d1f5d1218","modified":1579287603900},{"_id":"source/docs/using_storages.md","hash":"fcaa4c3846c063bc7f46afdf9f8c780f96125ede","modified":1579287603900},{"_id":"source/docs/using_the_console.md","hash":"1281c1d98732e0f173a865428b06a30da4dc9d76","modified":1579287603900},{"_id":"source/docs/vyper.md","hash":"987e6ad8e86fe7470c4db19a633179aa5b0a2acb","modified":1579287603900},{"_id":"source/docs/web3js.md","hash":"9ad98e255c60ba532b992fae75e903cdff981d60","modified":1579287603900},{"_id":"source/docs/webpack.md","hash":"012cdad1030fb7c45f47d0433ae56c963f635717","modified":1579287603900},{"_id":"source/docs/what_dapp.md","hash":"79502dafd6e70b81e69c6b0aee073f0dac5b1623","modified":1579287603900},{"_id":"source/docs/working_with_name_systems.md","hash":"c972b4ce78f98bb46bf7a245fb811be06d31e4c4","modified":1579287603900},{"_id":"source/news/index.md","hash":"0a8e37f1549e24d127e9b65773ae00826d0b53c6","modified":1579287603900},{"_id":"source/plugins/index.md","hash":"c500bda064f243bfb33b4dffbdf1cb4349bf0bd4","modified":1579287603900},{"_id":"source/templates/index.md","hash":"180f034b05fe0a621c3ccb05f87bf9ab6fde2978","modified":1579287603900},{"_id":"source/tutorials/infura_guide.md","hash":"4e9497c9737522860adc286e126e0f3d1d92cdf0","modified":1579287603904},{"_id":"themes/embark/languages/en.yml","hash":"aa8783506c3f4a09fd4d33bca0bc923fe09f4538","modified":1579287603904},{"_id":"themes/embark/layout/archive.swig","hash":"bbfbbbd37bd047ba20c9b68b036bdbeacbd47482","modified":1579287603904},{"_id":"themes/embark/layout/blog-post.swig","hash":"90595b22104a46c2fc32c25ff484855131df321e","modified":1579287603904},{"_id":"themes/embark/layout/blog.swig","hash":"96bfe880cf8e35c83f66281322ee1d0075161121","modified":1579287603904},{"_id":"themes/embark/layout/community.swig","hash":"47d94e81aac63c3b533047cf2ef88069417262c4","modified":1579287603904},{"_id":"themes/embark/layout/docs-landing.swig","hash":"9b3cc62579713f7b4211010d66ad17f8f0c99d79","modified":1579287603904},{"_id":"themes/embark/layout/docs.swig","hash":"d3a1e8fc6bc3b9c7362ff2a9e7df1576f22036e5","modified":1579287603904},{"_id":"themes/embark/layout/index.swig","hash":"41aef7f9bffbc8ffe1b3419e596d69169c45692d","modified":1579287603904},{"_id":"themes/embark/layout/layout.swig","hash":"08350d3a2af1bfe186a93bb3d781c024e2ac451d","modified":1579287603904},{"_id":"themes/embark/layout/page.swig","hash":"21801a7f37e340e45a30bfa5ccf122182d2adc5d","modified":1579287603904},{"_id":"themes/embark/layout/plugins.swig","hash":"b848b10690be2a83276026797e1c333a00596f0b","modified":1579287603904},{"_id":"themes/embark/scripts/checklist.js","hash":"9bb1f40b63fc1673655dac1b3205d5e597833536","modified":1579287603904},{"_id":"themes/embark/scripts/code.js","hash":"1ab08ac667d6ba3442305d6f117a5faa3032055d","modified":1579287603904},{"_id":"themes/embark/scripts/docs_paginator.js","hash":"38632311c2623fee67afc0cee307a17125871743","modified":1579287603904},{"_id":"themes/embark/scripts/is_quickstart.js","hash":"24bdbf644884697d7182c558d45b3fa18113176c","modified":1579287603904},{"_id":"themes/embark/scripts/notification.js","hash":"6dbbccb55c1940dac32140001b1afb19e59af819","modified":1579287603904},{"_id":"themes/embark/scripts/toc.js","hash":"0150d62da68310989db7c9cb74711f1031a7e62c","modified":1579287603904},{"_id":"source/plugins/thumbnails/bamboo.png","hash":"b7c9f4d84aa7d6642e4a822a7b66042ab2d33710","modified":1579287603900},{"_id":"source/plugins/thumbnails/fortune.jpg","hash":"f041a2bc22e374dd833e4b56066e7d3bf20d49f6","modified":1579287603900},{"_id":"source/plugins/thumbnails/haml.png","hash":"19c468e7d07eed1ddadc38818b8f9c350ebf8511","modified":1579287603900},{"_id":"source/plugins/thumbnails/pug.png","hash":"774bb436243175c41b9e4c51558a02e2262a7e47","modified":1579287603900},{"_id":"source/plugins/thumbnails/remix copy.png","hash":"0654c1ca096d7336391d50ffc27c64aa30a37b85","modified":1579287603900},{"_id":"source/plugins/thumbnails/remix.png","hash":"c288a89299382837bde8ce248b2d1265dff49083","modified":1579287603900},{"_id":"source/plugins/thumbnails/solidity.png","hash":"860e6c14fe1fc7799de218b11dbdda5cb73123d3","modified":1579287603900},{"_id":"source/plugins/thumbnails/solium.png","hash":"a8e525113fb9dff400e71b9762f537f82cfdb7ac","modified":1579287603900},{"_id":"source/plugins/thumbnails/status.png","hash":"452ce074cb13ffa9be473c7001c675b6b35f3780","modified":1579287603900},{"_id":"source/templates/thumbnails/angular.png","hash":"e50350df2526f0abf0a8d2e808085c24f2273662","modified":1579287603900},{"_id":"source/templates/thumbnails/bamboo.png","hash":"b7c9f4d84aa7d6642e4a822a7b66042ab2d33710","modified":1579287603900},{"_id":"source/templates/thumbnails/react.png","hash":"a6d33dab3a85a4d7004246e39a704869a6319306","modified":1579287603904},{"_id":"source/templates/thumbnails/sggc.png","hash":"f2742e7865280a840ccb8de8a466e7571947ec9a","modified":1579287603904},{"_id":"source/templates/thumbnails/typescript.png","hash":"bc3c71f25fc966f00c23df3222cde74c6e70c06d","modified":1579287603904},{"_id":"source/templates/thumbnails/vortex.png","hash":"ca5675313297535b416158e7a6b775bbe59f3a56","modified":1579287603904},{"_id":"source/templates/thumbnails/vuejs.png","hash":"85cb9bd3cf15f02dc2b44fbc9dffc2737c6a985b","modified":1579287603904},{"_id":"source/templates/thumbnails/vyper.png","hash":"ecbc1f9ce334685b0a1d9ec6da3ad98a69758f6e","modified":1579287603904},{"_id":"source/tutorials/infura_guide/api-keys.png","hash":"9ef67096142c2cd4dff7e391f2664e335d347517","modified":1579287603904},{"_id":"source/tutorials/infura_guide/lift-off.jpg","hash":"90d8d7604930e30d01aff8c1513412a75e8f4a58","modified":1579287603904},{"_id":"themes/embark/layout/partial/checklist.swig","hash":"a038b0b62e56710637ab3c67d180a27c08e5d18b","modified":1579287603904},{"_id":"themes/embark/layout/partial/checklist_item.swig","hash":"215f6e6f1d7e280990e86abdd56a98cc3c68a95a","modified":1579287603904},{"_id":"themes/embark/layout/partial/code.swig","hash":"7e2fba9a0ef75f26e19c5542ab61d5a951eeb2f5","modified":1579287603904},{"_id":"themes/embark/layout/partial/contributor-box.swig","hash":"5efb1e4b5584b26d37281c11282580ca46e9d879","modified":1579287603904},{"_id":"themes/embark/layout/partial/coverbox.swig","hash":"4346c1cec4aa2ac3455553266b9fc79a1f892c8f","modified":1579287603904},{"_id":"themes/embark/layout/partial/event-box.swig","hash":"b9cf7362d527eba61484ab709c01e4a612237e73","modified":1579287603904},{"_id":"themes/embark/layout/partial/footer.swig","hash":"8d924636809ea7dda1e5d1eacf963685ba5e2e4a","modified":1579292406793},{"_id":"themes/embark/layout/partial/head.swig","hash":"18fa0064c87fa85d6f12289204a76dbb2e12fa50","modified":1579287603904},{"_id":"themes/embark/layout/partial/header-blog.swig","hash":"c739cbdfc22621682ea54d920cbb3112d7fc2456","modified":1579292435969},{"_id":"themes/embark/layout/partial/header.swig","hash":"acaa081bcc677657455931f1dda842c49c93203b","modified":1579292423737},{"_id":"themes/embark/layout/partial/heading.swig","hash":"3a3a0760c31be524ba0208ed24cb0894481a2597","modified":1579287603904},{"_id":"themes/embark/layout/partial/notification.swig","hash":"bb1fdae3eb87feb344571a3d8636ea7daf166cd6","modified":1579287603904},{"_id":"themes/embark/layout/partial/paginator.swig","hash":"6f862b18625d7c824fbc32a6228e34686acf4fc7","modified":1579287603904},{"_id":"themes/embark/layout/partial/spotbox.swig","hash":"6f321dab798da2ca02623fa6dcc54cce7a30d13d","modified":1579287603904},{"_id":"themes/embark/layout/partial/universebox.swig","hash":"66bb32ae4f6821b449ddff58a790fc918cb21b29","modified":1579287603904},{"_id":"themes/embark/layout/partial/whisperbox-alternative.swig","hash":"7cb78c69cb4b058de3de13ef5485258f0e1f63fd","modified":1579287603904},{"_id":"themes/embark/layout/partial/whisperbox.swig","hash":"3c6e94cc8774d72cfb30218003f4a266772d238d","modified":1579287603904},{"_id":"themes/embark/source/css/_shame.scss","hash":"3558db6b81dd7b76e71c49d3260edddd57fa8dc7","modified":1579287603916},{"_id":"themes/embark/source/css/embark.scss","hash":"7ffcd12e49bffde3b86a34e8c4f6dff463741717","modified":1579287603916},{"_id":"themes/embark/source/js/index.js","hash":"cb46b90689c0ac59988a81d4d231ae2d4b9d3806","modified":1579287603916},{"_id":"source/assets/images/cockpit_debugger_controls.png","hash":"ba68f8b39e0d745e39a26d0bd8c9c3bfea5ad8c5","modified":1579287603664},{"_id":"source/assets/images/crystal-thread-test.png","hash":"4e8aa7ac613a332960de0117141ed1e33b14d9f1","modified":1579287603792},{"_id":"source/plugins/thumbnails/mythx.png","hash":"7d1972d98ddd2bc13afbb0049d45f157d8cdf675","modified":1579287603900},{"_id":"source/assets/images/token_factory_1/page_1.png","hash":"6babcba0bca8fc8a48a0eed7045396f9c3fb55af","modified":1579287603876},{"_id":"source/assets/images/token_factory_1/page_2.png","hash":"4fa5a22eb63587f424a2742e7f14f39e6e6e4c9d","modified":1579287603880},{"_id":"source/assets/images/token_factory_1/page_3.png","hash":"08a8a87009da0594ac5c763e269082ed489c9b31","modified":1579287603880},{"_id":"source/assets/images/token_factory_1/page_4.png","hash":"78a3cbea0a3a686847fa7024a634bc28b38e7c08","modified":1579287603880},{"_id":"source/assets/images/token_factory_1/page_5.png","hash":"1938ae333249ead32842d39f36dc7d7742e97a95","modified":1579287603880},{"_id":"source/assets/images/token_factory_2/page_1.png","hash":"d0c1bdc7478dcc4878239b2924107df50608d97a","modified":1579287603880},{"_id":"source/assets/images/token_factory_2/page_2.png","hash":"238f769f8834d36a088f6352d5e8b056d339fa7d","modified":1579287603880},{"_id":"source/assets/images/token_factory_2/page_3.png","hash":"8eca458e6e78457f268142f45542c2a919ab07af","modified":1579287603880},{"_id":"source/assets/images/token_factory_2/page_4.png","hash":"92dd82374e8ccd6f258481fc69ebdc2aa16c0532","modified":1579287603880},{"_id":"source/assets/images/token_factory_2/page_5.png","hash":"ea35b940330be24051ac278a8ad6d239a93c3fd5","modified":1579287603884},{"_id":"source/assets/images/token_factory_2/page_6.png","hash":"b672160f850fcd590050dfbc268ec03c1027072f","modified":1579287603884},{"_id":"source/assets/images/token_factory_2/page_7.png","hash":"da58b3365e3b6841ffdcfbf6c5b8a6152daa9a49","modified":1579287603884},{"_id":"themes/embark/source/assets/icons/app-window-search-text.svg","hash":"a7658278c51714beb9a4aa378074b0f1a2a3811a","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/arrow-down-1.svg","hash":"cf919e204adc66907e541c5a32a6cdb8bd86e9d7","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/arrow-left-1.svg","hash":"6a5b3fe7927e03320be668170011aba2d461d1af","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/arrow-right-1.svg","hash":"5948e9eda884b948d0c668ae51f99509d2cfa631","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/arrow-up-1.svg","hash":"e4e31a2af62c2838e1871dfd72203b9a94ae8ae9","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/browser-gauge.svg","hash":"4ab8c84f8c5cc2ece1a2847ef8d9f2c9b842609f","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/check.svg","hash":"94cb2741b66a54d22bbacdf65c5bbf1f4de59c4a","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/close.svg","hash":"07c332a892c2b2a107bf53a055425064006b7161","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/computer-bug-search.svg","hash":"720717cc34ce43565de8ab4a360603c2c55092a7","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/copy-paste.svg","hash":"6a11ff19bd04cf7774d7155a535eb68be3dbb592","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/crypto-currency-bitcoin-circle.svg","hash":"6feceaadc9ee12a3e457d94a3d548a3d82213b92","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/github.svg","hash":"6b9fba84ce16f0f8278ca4eb00ced1c5b13109f4","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/list-to-do.svg","hash":"6954c1ea40469c5548ff8c3daba91ea3e883dab4","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/module.svg","hash":"cf1284f20a532fc451ba6cd443ff1534e63b6779","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/navigation-menu.svg","hash":"d6b4d9e2da8849ac362bcb8d634725b921ebf46c","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/notes-paper-text.svg","hash":"fc8a3304cfc24437597a565290c6b1095fa365f7","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/paginate-filter-video-alternate.svg","hash":"a2953dbbdcd49ce07a7aa90be9803d5e44a77688","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/pen-write-paper.svg","hash":"a2828e87d8ea6f6d965a1aae8ab450c3bba19564","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/pie-line-graph.svg","hash":"d8a9dad5f7377b12b3130d964f7fe3d03de80d1a","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/rating-star.svg","hash":"961c6f9cf48e662267cdfb609e89f3234e1c84c0","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/search-bar.svg","hash":"6e3dfc910fda432935eaf7a6170bf1f6be8c7a21","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/symbols.html","hash":"d13ca80e28788a3fffb404dd5dff6225139b38a9","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/symbols.svg","hash":"d34c6846fa16190a9e264d9f1cbf40e12ae8f410","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/tag-new-circle.svg","hash":"3a155bcde805c6101d431c08a093a5ffed37dfeb","modified":1579287603904},{"_id":"themes/embark/source/assets/icons/twitter.svg","hash":"90e4959062ea5bc14eb10f182c1c9859dcc0b168","modified":1579287603904},{"_id":"themes/embark/source/assets/images/Nimbus.svg","hash":"f0ea3f6a1804fc951901bdf3c3ec84ebcbcfb1b3","modified":1579287603912},{"_id":"themes/embark/source/assets/images/apple-touch-icon-120x120-precomposed.png","hash":"2b599bbb36131a537d0a2db417eefd8cb2a348f7","modified":1579287603912},{"_id":"themes/embark/source/assets/images/apple-touch-icon-152x152-precomposed.png","hash":"8f2800d891c5e1374cef4f3fcd26575f46748e5c","modified":1579287603912},{"_id":"themes/embark/source/assets/images/apple-touch-icon-180x180-precomposed.png","hash":"451e3cfad6ebe9dad9eb35af1d7c113b2f76f143","modified":1579287603912},{"_id":"themes/embark/source/assets/images/apple-touch-icon-60x60-precomposed.png","hash":"aa89e00d7671bfa8add7afc2ee25e84cf93319b3","modified":1579287603912},{"_id":"themes/embark/source/assets/images/apple-touch-icon-76x76-precomposed.png","hash":"99cd68afb86ecab681c217b0eeffed8163f228e6","modified":1579287603912},{"_id":"themes/embark/source/assets/images/apple-touch-icon-precomposed.png","hash":"451e3cfad6ebe9dad9eb35af1d7c113b2f76f143","modified":1579287603912},{"_id":"themes/embark/source/assets/images/company-flexdapps.svg","hash":"ae7686cb0c918a69b497774fba8829cb3df89858","modified":1579287603916},{"_id":"themes/embark/source/assets/images/company-giveth.svg","hash":"8d611a8a4c94e2bb13da7661195cb44d3ee163f4","modified":1579287603916},{"_id":"themes/embark/source/assets/images/company-status.svg","hash":"5729e8db16b262cb6c3ca91113500b1895f24768","modified":1579287603916},{"_id":"themes/embark/source/assets/images/dots.png","hash":"2f22dcbbe2b643819e263bc292732d0875e9f24e","modified":1579287603916},{"_id":"themes/embark/source/assets/images/favicon-16.png","hash":"db9d7be08c2096635e4acd9f00fb56c04aafa7a5","modified":1579287603916},{"_id":"themes/embark/source/assets/images/favicon-32.png","hash":"b841b7f468325cab45486b1a25343e0f0654ef0d","modified":1579287603916},{"_id":"themes/embark/source/assets/images/keycard-logo-negative.svg","hash":"b93278634ae78c759a0439a7d8c275889ae90e8f","modified":1579287603916},{"_id":"themes/embark/source/assets/images/logo-negative.svg","hash":"2eb5bdd4eb9aac594e7fcbb7ff0fb7456d6c1fd1","modified":1579287603916},{"_id":"themes/embark/source/assets/images/logo.svg","hash":"0bc239291c9f4732df92ed67b5f80d7392d9920a","modified":1579287603916},{"_id":"themes/embark/source/assets/images/rocket-start.svg","hash":"1c2121ac58f2ea3916de10a4667518b653ce83a7","modified":1579287603916},{"_id":"themes/embark/source/assets/images/status-logo.svg","hash":"80e9ac5ea6f37880927c680f66d41f2acd751873","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-color-brand.scss","hash":"1fb90cf4cd3da1241355f85a5185e0aa31dc5263","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-color-layout.scss","hash":"4ec42cab6f2b425240cb7254bdb7c81d13dc7198","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-color-semantic.scss","hash":"434b52490937e1471d95a143b70381a2f4bb619c","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-color.scss","hash":"c9ff601899d050f74893a8eb7d5d2df42cb5a217","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-spacing-inset.scss","hash":"6fe46f2345b2420307f4d67eff32036055795272","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-spacing-squish.scss","hash":"940d65a07b14673ffd3da63a75937c3125981e91","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-spacing-stack.scss","hash":"a8a2c86786d30bfd8bd2c8d3ac180ea7003cc725","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-spacing-stretch-inset.scss","hash":"eecce95964b8897de6054fb5fc5eab3a676094b6","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.border.scss","hash":"b15fd59a3abba1a570659792270550c6f3cbeb88","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.color-brand.scss","hash":"bf20393b0cce0cf2847cc897fa559fce66d42d2b","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.color-layout.scss","hash":"a8b5170ae33e09a75f6f845a4873ca63f408adb0","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.color-palette.scss","hash":"903b152e109e80753a4051b1d19ba0726d19da8b","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.forms.scss","hash":"b1dde72a9cdba6355472369155b38dea4f1bef77","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.indecies.scss","hash":"3c394d06e65163811e8d884286235d202d0f3403","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.color-semantic.scss","hash":"262bcab015c3f323b375e6dee538a212a60426ad","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.layout.scss","hash":"3e67200fb9444187aab60a1282549b0075437877","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.links.scss","hash":"65637c528bfd48c7b023fc94e28358fc58c0a8f6","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.misc.scss","hash":"e7bf80f32564301cc1e41ccfdba1ee1749ae525c","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.spacing.scss","hash":"8cf54f8146fad87f59d45ec053df7f1ff8345cbe","modified":1579287603916},{"_id":"themes/embark/source/css/00-settings/_settings.typography.scss","hash":"3e3b83e8fe1d28c9ad156fa33555ae8674c746cc","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.border.scss","hash":"a9b21ea9d1cf2bf5877c1c9c50c4fe4996b69ff0","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.box-shadow.scss","hash":"ec0081d8b10eeb945eebf744742ea6417c384b8c","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.breakpoint.scss","hash":"7b261864e28b0ec16781bc24065450caf2b70abe","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.clearfix.scss","hash":"266582ce0ffe5eb0622868370dc9ac8e6acea737","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.column.scss","hash":"c588b90cb648c979a391658ed337e00daecdb271","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.list-reset.scss","hash":"406d4d60d370decc9d7f3d5a8eb3308bb8fae6c8","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.overlay.scss","hash":"b1cf5a920ba83db93aa649f2ddf98ef858bb1bce","modified":1579287603916},{"_id":"themes/embark/source/css/01-tools/_tools.placeholder.scss","hash":"baf73d8af13039931a6f0b8b22279c3f1bfdf267","modified":1579287603916},{"_id":"themes/embark/source/css/02-generic/_generic.box-sizing.scss","hash":"26b7b6efad6435f49a808080ca987f123bf2ab8e","modified":1579287603916},{"_id":"themes/embark/source/css/02-generic/_generic.reset.scss","hash":"8a50750b05184887d7290f2360ce72a94e84ca64","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.buttons.scss","hash":"4842d392957b128f686eea568d896efb45f9f834","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.forms.scss","hash":"f45be318ebb22533e8e266b2eebe43ddb0937bf4","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.headings.scss","hash":"de758429ddb890d33564356af3ca61debc2ef155","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.images.scss","hash":"0a52090c19650caf47b7f848b28786e8eddb89d5","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.links.scss","hash":"f2e98137d2d3ca5092c73f70cc4e28ad393b039f","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.lists.scss","hash":"a388a10af8a7ca3f0b6ec74fe0efdb9e2296aacb","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.tables.scss","hash":"81d33b10eecfb74e8ddbeb150c8f497dbfcff11f","modified":1579287603916},{"_id":"themes/embark/source/css/03-elements/_elements.typography.scss","hash":"44d0622de4f290e6d2c8ed34cfd750e056bf6711","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.buttonbar.scss","hash":"8f6bc88ec9125075b147f1477b439e6e9413b42b","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.distances.scss","hash":"c21f0844a596e8410fb594c0d97eb2e12b22f8f4","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.footer.scss","hash":"366eafaf766cd95a5b195b914cee0c4d227b104d","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.grid.scss","hash":"da7c0ebf630f220f858044f4edceadea9abbfd12","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.guided-content.scss","hash":"3a6d8159ce5c47e2a72d00184aa28719285303e3","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.head-up.scss","hash":"b50eaa3fab38d2e9f1230a12f8542917cdc172e5","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.header.scss","hash":"471289d74d223952cb5eab924854aa79df0622e6","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.heading.scss","hash":"7579f117e65d258c46aaa437f07f9f092b2db596","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.list-bare.scss","hash":"767f64a9bd40b16cf72efefe731fecebc2565fa8","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.list-inline.scss","hash":"1b36ae3bb253a87edb4db15f9b875e10ba146906","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.media.scss","hash":"332888a05a775f5b7f550f2d58c9ff329cfaaef1","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.overlap.scss","hash":"4a0ae3a2032bc450d3d4693d92b49965ecbc6620","modified":1579287603916},{"_id":"themes/embark/source/css/04-objects/_objects.standard-page.scss","hash":"ab662003b9c21f5da3fdde6f66d70e8aa82dd8d8","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.avatars.scss","hash":"c2dbff38e210486f01e9fcd8703329f773129545","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.boxes.scss","hash":"5d3fcd7009b24671f56fbb3c6c1884157b056a3e","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.button.scss","hash":"c43f5627dd9a80e64f024b9f484d9a7a833febc8","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.checklist.scss","hash":"29f16754036ca4fcec731597a416c98787a744d2","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.guide.scss","hash":"cdafd26c3ee6c739f9bbfce0125645a0b7b3bd0a","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.headings.scss","hash":"5f583822f762f99d00187935d933770972294413","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.highlight.scss","hash":"69476a68de00e2e290fa84fffdec9b99f7459acf","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.icons.scss","hash":"4ddbc047a971df8f6878e173bdbc79db8d67f8d4","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.links.scss","hash":"59ad321a05677c8716fbace182288551ea04530b","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.logos.scss","hash":"afa93ec0d91281c5bb3e4b0f3685b65217a07514","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.meta.scss","hash":"e0edb9b8a27121f70302608a4ae3ef51d7a809c1","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.navigations.scss","hash":"2a03188aac7dc518f519139ec44566bcebf6c51e","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.notifications.scss","hash":"c43dcef42e77778a863ebf39835814b363703ba7","modified":1579287603916},{"_id":"themes/embark/source/css/05-components/_components.tags.scss","hash":"0296364650db159da3659e9c8659d1ba46d3f455","modified":1579287603916},{"_id":"themes/embark/source/css/06-utilities/_utilities.links.scss","hash":"0876483cf965935ddf3264de0cc947a9b5240093","modified":1579287603916},{"_id":"themes/embark/source/css/06-utilities/_utilities.list-reset.scss","hash":"621869acabfcf504dad7983ef7770919d9aa39e4","modified":1579287603916},{"_id":"themes/embark/source/css/06-utilities/_utilities.text.scss","hash":"451861b375641c6efbfa22e1e0b398feed1aa7b8","modified":1579287603916},{"_id":"themes/embark/source/css/06-utilities/_utilities.visibility.scss","hash":"83eff52a70c64c2c2c6da20765ad9f2c94bca71f","modified":1579287603916},{"_id":"themes/embark/source/js/linkjuice/.babelrc","hash":"7224f35c4916aa40abdd0f9597b7997015d83533","modified":1579287603916},{"_id":"themes/embark/source/js/linkjuice/.editorconfig","hash":"62e8da92cc4bedb619b57f573fe8b931cce190a6","modified":1579287603920},{"_id":"themes/embark/source/js/linkjuice/.gitignore","hash":"3f33fc2aefbc0b8c9650ad620d14aa5e3c8e4604","modified":1579287603920},{"_id":"themes/embark/source/js/linkjuice/.jshintrc","hash":"1725359358cfcb1a42b09c8441cea8322803a2a2","modified":1579287603920},{"_id":"themes/embark/source/js/linkjuice/README.md","hash":"f15e54a42ccce6a7830526e4c70504c0d604daaa","modified":1579287603920},{"_id":"themes/embark/source/js/linkjuice/gulpfile.js","hash":"c160dfead280a588086115a45a895549b99ed458","modified":1579287603920},{"_id":"themes/embark/source/js/linkjuice/package.json","hash":"28edd71a4c5ef266af83c60d68a85883755c1a3e","modified":1579287603920},{"_id":"source/assets/images/cockpit_dashboard_release.png","hash":"096b0b893f3d467919edd968ce827985e1f233f0","modified":1579287603664},{"_id":"source/assets/images/cockpit_editor_release.png","hash":"c912dcedf5db89e08e491d1b49f7b07795bdcf21","modified":1579287603680},{"_id":"source/assets/images/nimble-creating-app.png","hash":"30bdcea82d2a7e7b063dfeca277438ae9a9a44f4","modified":1579287603808},{"_id":"themes/embark/source/assets/images/bg-hexagons.png","hash":"d2a3d73d939c8d6a34f04741231739d25d81c1a8","modified":1579287603912},{"_id":"themes/embark/source/css/00-functions/_functions.get-spacing-inline.scss","hash":"fc62e3c3e377d2db64a809986900e99e79fd10ba","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-index.scss","hash":"2f2f39faafa8d4b216be83c6fd4b25a030e39fc8","modified":1579287603916},{"_id":"themes/embark/source/css/00-functions/_functions.get-font-size.scss","hash":"006929f9ec36f9253467851dce1b3de5479c6b9e","modified":1579287603916},{"_id":"source/assets/images/cockpit_contracts_view.gif","hash":"999f406795198c3d8651e61d7e0b251f7320d98c","modified":1579287603632},{"_id":"source/assets/images/cockpit_selective_deployment.gif","hash":"1d9e6e6a5d1c98da71e316c7cfb4ac7aff6c5708","modified":1579287603768},{"_id":"source/assets/images/nim-crystal-header_blank.jpg","hash":"9da5d1642a4ad2ba3af71504589a5ced42a4ab8f","modified":1579287603808},{"_id":"source/assets/images/token_factory_1/console_2.png","hash":"82a4f8163e92edc66a14726a97e6f3d586fc5ec9","modified":1579287603808},{"_id":"themes/embark/source/assets/images/tool-screenshot.png","hash":"9cfaabed43e1453cdf1edb60238f2aeaa3b7ad07","modified":1579287603916},{"_id":"themes/embark/source/js/linkjuice/src/linkjuice.js","hash":"c9145e827c4a9c35575911407b9a7e65c48ae858","modified":1579287603920},{"_id":"source/assets/images/nim-crystal-header-img_NEW.jpg","hash":"f0716491dd88db1d137c915879e66694844ea334","modified":1579287603804},{"_id":"source/assets/images/token_factory_2/console_2.png","hash":"4efdab7b54dacafc83854b6dc7d73addf9fe8ade","modified":1579287603880},{"_id":"source/assets/images/cockpit_dashboard.png","hash":"aa995f3517e692402819dc004010c9f45960a7a5","modified":1579287603636},{"_id":"source/assets/images/cockpit_dashboard_dark.png","hash":"69148b6547065adcd5583118286f74aff9a29889","modified":1579287603660},{"_id":"source/assets/images/token_factory_1/console_1.png","hash":"fd0c379505c036ad151b01a5a28b610df190d3d6","modified":1579287603808},{"_id":"source/assets/images/cockpit_explorer_block.png","hash":"e9f398fc9eacf99b3e64997c3724ec541875e144","modified":1579287603724},{"_id":"source/assets/images/token_factory_2/console_1.png","hash":"9d35e99618f0ff90911672eaf7765a48ab84f94e","modified":1579287603880},{"_id":"themes/embark/source/assets/images/EMBARK_HEADER_ALT_OPTIMIZED.jpg","hash":"9d767c14d82980b184cb6d9a1746f986c21cec8e","modified":1579287603908},{"_id":"themes/embark/source/assets/images/cli-tool.png","hash":"21fa930acb0a5259f9f35b37d14bc4b11fd9120d","modified":1579287603916},{"_id":"source/assets/images/cockpit_explorer_overview.png","hash":"86a94110f1ae3fe956a5efb1b165902c63fa35d8","modified":1579287603736},{"_id":"themes/embark/source/assets/images/EMBARK_MODULAR.png","hash":"38677401713a7583c44d97e59eb5bcc3c8fb8386","modified":1579287603912},{"_id":"source/assets/images/cockpit_explorer_contracts_detail.gif","hash":"2464c474ba42193ca58df7288c2afc81608657c0","modified":1579287603732},{"_id":"themes/embark/source/assets/images/EMBARK_FRAMEWORK.png","hash":"6113f59cb45baf50f78c13684f366b3b2ba11239","modified":1579287603908},{"_id":"source/assets/images/embark-dashboard.png","hash":"fbfa1764086f3c436172bc8c812452a99c8d8f79","modified":1579287603800},{"_id":"source/assets/images/website_release.png","hash":"4625f3ee3f58fae5d2c2dc7b10fc8d2547c6a448","modified":1579287603896},{"_id":"source/assets/images/cockpit_explorer_transactions.gif","hash":"fd74abafca81d5a2986f57d72147b228b06f075d","modified":1579287603744},{"_id":"source/assets/images/cockpit_suggestions.gif","hash":"2e004a561dda70e22effa1af96315bb9d2314758","modified":1579287603784},{"_id":"source/assets/images/cockpit_using_debugger.gif","hash":"72acc4d2ab4f9b342749519b69455e30fd4e24c0","modified":1579287603792},{"_id":"source/assets/images/cockpit_search.gif","hash":"c797eb599b822ca56f57cfa882967f23b27d62f9","modified":1579287603768},{"_id":"source/assets/images/cockpit_explorer_account.gif","hash":"a9c557a12ff36090c6a41c265bbd8eb9285de657","modified":1579287603716},{"_id":"source/assets/images/cockpit_editor.gif","hash":"3ce64fcf60098d6954d4a021ef4d2f2c20e1dc46","modified":1579287603676},{"_id":"source/assets/images/cockpit_enter_debugger.gif","hash":"f3374c1898aba97acb7d53779d4e8fc9643d2dff","modified":1579287603696},{"_id":"source/assets/images/cockpit_navigation.gif","hash":"7ed00581b8752de847a7e7e2d2c6e47bc961614a","modified":1579287603756},{"_id":"source/assets/images/cockpit_change_theme.gif","hash":"fe6c1c931e3db5c069a158bf7da7fd732d0f39bc","modified":1579287603632},{"_id":"source/assets/images/cockpit_dashboard_contracts.gif","hash":"1792d363902a2ec8f26f7596bffc4431461f2fee","modified":1579287603660},{"_id":"source/assets/images/token_factory_1/dashboard.png","hash":"bfb37f6fe22c28ac3cfa10b100e2db47acf5f6ca","modified":1579287603876}],"Category":[{"name":"announcements","_id":"ck5ijm3qp00057heg5kpz32j7"},{"name":"tutorials","_id":"ck5ijm3r7000n7heg18or2163"}],"Data":[{"_id":"authors","data":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}}},{"_id":"categories","data":{"tutorials":"Tutorials","announcements":"Announcements"}},{"_id":"languages","data":{"en":"English"}},{"_id":"plugins","data":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}]},{"_id":"menu","data":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"}},{"_id":"sidebar","data":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}}},{"_id":"templates","data":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}]},{"_id":"tutorials","data":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}]},{"_id":"versions","data":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}],"Page":[{"title":"blog.header.title","tagline":"blog.header.tagline","layout":"blog","_content":"","source":"index.md","raw":"title: blog.header.title\ntagline: blog.header.tagline\nlayout: blog\n---\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"index.html","comments":1,"_id":"ck5ijm3ml00007heg4oeo64fj","content":"","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":""},{"title":"Chat","layout":"chat","_content":"\n
\n Join us at gitter.im/embark-framework/Lobby\n
\n\n\n","source":"chat/index.md","raw":"title: Chat\nlayout: chat\n---\n\n\n Join us at gitter.im/embark-framework/Lobby\n
\n\n\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"chat/index.html","comments":1,"_id":"ck5ijm3qm00027hegfm15h31m","content":"\n Join us at gitter.im/embark-framework/Lobby\n
\n\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"\n Join us at gitter.im/embark-framework/Lobby\n
\n\n\n"},{"title":"community_page.header.title","tagline":"community_page.header.tagline","link":{"text":"community_page.header.link","href":"https://gitter.im/embark-framework/Lobby"},"layout":"community","_content":"","source":"community/index.md","raw":"title: community_page.header.title\ntagline: community_page.header.tagline\nlink:\n text: community_page.header.link\n href: https://gitter.im/embark-framework/Lobby\nlayout: community\n---\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"community/index.html","comments":1,"_id":"ck5ijm3qo00047heg1ev79kfc","content":"","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":""},{"title":"Bamboo Documentation","_content":"\nThe documentation for Bamboo can be found [here](https://github.com/pirapira/bamboo)\n\nTo use Bamboo with Embark you will need to first install the [embark-bamboo](https://github.com/embarklabs/embark-bamboo) plugin\n\n","source":"docs/bamboo.md","raw":"title: Bamboo Documentation\n---\n\nThe documentation for Bamboo can be found [here](https://github.com/pirapira/bamboo)\n\nTo use Bamboo with Embark you will need to first install the [embark-bamboo](https://github.com/embarklabs/embark-bamboo) plugin\n\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/bamboo.html","comments":1,"layout":"page","_id":"ck5ijm3qs00077heg6vu1ep31","content":"The documentation for Bamboo can be found here
\nTo use Bamboo with Embark you will need to first install the embark-bamboo plugin
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"The documentation for Bamboo can be found here
\nTo use Bamboo with Embark you will need to first install the embark-bamboo plugin
\n"},{"title":"Accounts Blockchain configuration","layout":"docs","_content":"\nIn our [guide on configuring a blockchain client](/docs/blockchain_configuration.html), we've configured accounts in several places.\n\nThis parameter let's us customize what the `accounts` will be for our deployment, as well as the accounts that will be created and unlocked by our blockchain client.\n\n## Accounts parameters\n\n```\naccounts: [\n {\n nodeAccounts: true,\n numAddresses: \"1\",\n password: \"config/development/devpassword\"\n },\n {\n privateKey: process.env.MyPrivateKey\n },\n {\n privateKeyFile: \"path/to/file\",\n password: process.env.MyKeyStorePassword\n },\n {\n mnemonic: process.env.My12WordsMnemonic,\n addressIndex: \"0\",\n numAddresses: \"1\",\n hdpath: \"m/44'/60'/0'/0/\"\n }\n]\n```\n\nThe `accounts` configuration is an array of objects, where each object represents one or more account.\n\nEmbark offers you multiple ways to include your account. You can use the one you prefer and ignore the others or mix and match.\n\n{% notification danger 'Using production keys' %}\nBe careful when using production keys and mnemonics (ie the account where you have real money).\n\nWe recommend using [environment variables](https://www.schrodinger.com/kb/1842) for plain text values like `privateKey` and `mnemonic` and to put the files for `privateKeyFile` and key stores either out of your working directory or ignored by versioning (eg: add the file in gitignore)\n{% endnotification %}\n\n### Parameter descriptions\n\n- **nodeAccounts**: The actual node accounts, that get created and unlocked by the client\n - Can be enabled by setting it to `true`\n - **numAddresses**: Number of addresses you want from the node. Defaults to `1`\n - **password**: Password file where the password to create and unlock the accounts is. This is required\n- **privateKey**: Private key string\n- **privateKeyFile**: Either a file containing comma separated private keys or a keystore (password needed for the latter). This can also be set to `random` to generate a random account (useful when testing)\n - **password**: Password string for the keystore\n- **mnemonic**: 12 word mnemonic\n - **addressIndex**: Index where to start getting the addresses. Defaults to `0`\n - **numAddresses**: Number of addresses to get. Defaults to `1`\n - **hdpath**: HD derivation path. Defaults to `\"m/44'/60'/0'/0/\"`\n\n{% notification info 'Accounts order' %}\nThe order in the accounts array is important. This means that using `nodeAccounts` first, as above, will set the node's account as the `defaultAccount` for deployment.\n{% endnotification %}\n\n### Configuring account balance for development\n\nWhen in development, we can specify the balance of each account using the `balance` option:\n\n```\nmodule.exports = {\n development: {\n deployment: {\n accounts: [\n {\n mnemonic: \"12 word mnemonic\",\n balance: \"5 ether\"\n }\n ]\n }\n }\n}\n```\n\nBalances can be specified using [human readable units](/docs/contracts_configuration.html#Human-readable-Ether-units) such as \"5 ether\" or \"200 finney\". If no unit is specified the value will be in Wei.\n","source":"docs/blockchain_accounts_configuration.md","raw":"title: Accounts Blockchain configuration\nlayout: docs\n---\n\nIn our [guide on configuring a blockchain client](/docs/blockchain_configuration.html), we've configured accounts in several places.\n\nThis parameter let's us customize what the `accounts` will be for our deployment, as well as the accounts that will be created and unlocked by our blockchain client.\n\n## Accounts parameters\n\n```\naccounts: [\n {\n nodeAccounts: true,\n numAddresses: \"1\",\n password: \"config/development/devpassword\"\n },\n {\n privateKey: process.env.MyPrivateKey\n },\n {\n privateKeyFile: \"path/to/file\",\n password: process.env.MyKeyStorePassword\n },\n {\n mnemonic: process.env.My12WordsMnemonic,\n addressIndex: \"0\",\n numAddresses: \"1\",\n hdpath: \"m/44'/60'/0'/0/\"\n }\n]\n```\n\nThe `accounts` configuration is an array of objects, where each object represents one or more account.\n\nEmbark offers you multiple ways to include your account. You can use the one you prefer and ignore the others or mix and match.\n\n{% notification danger 'Using production keys' %}\nBe careful when using production keys and mnemonics (ie the account where you have real money).\n\nWe recommend using [environment variables](https://www.schrodinger.com/kb/1842) for plain text values like `privateKey` and `mnemonic` and to put the files for `privateKeyFile` and key stores either out of your working directory or ignored by versioning (eg: add the file in gitignore)\n{% endnotification %}\n\n### Parameter descriptions\n\n- **nodeAccounts**: The actual node accounts, that get created and unlocked by the client\n - Can be enabled by setting it to `true`\n - **numAddresses**: Number of addresses you want from the node. Defaults to `1`\n - **password**: Password file where the password to create and unlock the accounts is. This is required\n- **privateKey**: Private key string\n- **privateKeyFile**: Either a file containing comma separated private keys or a keystore (password needed for the latter). This can also be set to `random` to generate a random account (useful when testing)\n - **password**: Password string for the keystore\n- **mnemonic**: 12 word mnemonic\n - **addressIndex**: Index where to start getting the addresses. Defaults to `0`\n - **numAddresses**: Number of addresses to get. Defaults to `1`\n - **hdpath**: HD derivation path. Defaults to `\"m/44'/60'/0'/0/\"`\n\n{% notification info 'Accounts order' %}\nThe order in the accounts array is important. This means that using `nodeAccounts` first, as above, will set the node's account as the `defaultAccount` for deployment.\n{% endnotification %}\n\n### Configuring account balance for development\n\nWhen in development, we can specify the balance of each account using the `balance` option:\n\n```\nmodule.exports = {\n development: {\n deployment: {\n accounts: [\n {\n mnemonic: \"12 word mnemonic\",\n balance: \"5 ether\"\n }\n ]\n }\n }\n}\n```\n\nBalances can be specified using [human readable units](/docs/contracts_configuration.html#Human-readable-Ether-units) such as \"5 ether\" or \"200 finney\". If no unit is specified the value will be in Wei.\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/blockchain_accounts_configuration.html","comments":1,"_id":"ck5ijm3qu00097hegey92ab6f","content":"In our guide on configuring a blockchain client, we’ve configured accounts in several places.
\nThis parameter let’s us customize what the accounts
will be for our deployment, as well as the accounts that will be created and unlocked by our blockchain client.
accounts: [ |
The accounts
configuration is an array of objects, where each object represents one or more account.
Embark offers you multiple ways to include your account. You can use the one you prefer and ignore the others or mix and match.
\nUsing production keys
\nBe careful when using production keys and mnemonics (ie the account where you have real money).
\nWe recommend using environment variables for plain text values like privateKey
and mnemonic
and to put the files for privateKeyFile
and key stores either out of your working directory or ignored by versioning (eg: add the file in gitignore)
true
1
random
to generate a random account (useful when testing)0
1
"m/44'/60'/0'/0/"
Accounts order
\nThe order in the accounts array is important. This means that using nodeAccounts
first, as above, will set the node’s account as the defaultAccount
for deployment.
When in development, we can specify the balance of each account using the balance
option:
module.exports = { |
Balances can be specified using human readable units such as “5 ether” or “200 finney”. If no unit is specified the value will be in Wei.
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"In our guide on configuring a blockchain client, we’ve configured accounts in several places.
\nThis parameter let’s us customize what the accounts
will be for our deployment, as well as the accounts that will be created and unlocked by our blockchain client.
accounts: [ |
The accounts
configuration is an array of objects, where each object represents one or more account.
Embark offers you multiple ways to include your account. You can use the one you prefer and ignore the others or mix and match.
\nUsing production keys
\nBe careful when using production keys and mnemonics (ie the account where you have real money).
\nWe recommend using environment variables for plain text values like privateKey
and mnemonic
and to put the files for privateKeyFile
and key stores either out of your working directory or ignored by versioning (eg: add the file in gitignore)
true
1
random
to generate a random account (useful when testing)0
1
"m/44'/60'/0'/0/"
Accounts order
\nThe order in the accounts array is important. This means that using nodeAccounts
first, as above, will set the node’s account as the defaultAccount
for deployment.
When in development, we can specify the balance of each account using the balance
option:
module.exports = { |
Balances can be specified using human readable units such as “5 ether” or “200 finney”. If no unit is specified the value will be in Wei.
\n"},{"title":"Cockpit Dashboard","layout":"docs","_content":"\nThe first view we're getting when entering Cockpit is its Dashboard view. Consider this your central station when developing, deploying and debugging your application. It has a lot of things to offer, so let's get right to it and take a look!\n\n## Overview\n\n![Cockpit Dashboard](/assets/images/cockpit_dashboard.png)\n\nThe dashboard is separated into different sections, which each of them having a certain responsibility. Here's a brief overview of what these are.\n\n- **Navigation & Search** - At the very top we have the navigation and search. Those are self explanatory, but we'll talk a bit more about search features in a few moments.\n- **Available Services** - Right below we see boxes for services monitoring. These boxes tell us what services are up and running and will respond accordingly when turned off.\n- **Interactive Console** - This is the Cockpit equivalent of Embark's [Interactive Console](/docs/using_the_console.html).\n- **Deployed Smart Contracts** - The current status of deployed Smart Contracts. Again, very similar to Embark's [Dashboard](/docs/dashboard.html).\n\n## Navigation & Search\n\nWe can navigate through different sections and parts of Cockpit by using the links in the navigation bar as shown below. Notice that the active view is also visually reflected in the navigation as well.\n\n![Cockpit Navigation](/assets/images/cockpit_navigation.gif)\n\nCockpit's search is very powerful and lets us easily search for transactions, Smart Contracts, blocks etc. from a single search bar. All we have to do is entering a valid hash, or, in case we're searching for a deployed Smart Contract, entering the name of the Smart Contract works too:\n\n![Cockpit Search](/assets/images/cockpit_search.gif)\n\n## Available Services\n\nAs mentioned above, the available services tell us which processes and services are running and available within our current Embark session. This is simply for monitoring purposes but can be very useful in case any of the processes is crashing or will be turned off. \n\nThe components will reflect their active state in the UI. We can test this easily disabling any of the services using their dedicated configuration files.\n\n## Interactive Console\n\nThis is an equivalent to Embark's [Interactive Console](/docs/using_the_console.html) just in a more rich and interactive fashion. We can use the same commands, however in addition we also get something called **Smart Suggestions**. \n\nWhen typing a command, Embark will provide decent suggestions, making it very easy to explore what command options are available!\n\n![Cockpit Smart Suggestions](/assets/images/cockpit_suggestions.gif)\n\n## Deployed Smart Contracts\n\nAs the name suggests, this sections lists all of our application's deployed Smart Contracts. Not only that, we can click on any of them and get a nice detail view of the Smart Contract within Cockpit's [Explorer](/docs/cockpit_explorer.html).\n\n![Cockpit Dashboard Contracts](/assets/images/cockpit_dashboard_contracts.gif)\n\n## Changing Dark and Light theme\n\nAnother thing that web-based user interfaces enable easily as opposed to others, is changing the appearance of an application. Cockpit implements two different themes to choose from - light and dark. The light theme is the default.\n\nToggling between light and dark theme is as easy as clicking on the cog wheel in the navigation bar and selecting the theme respectively:\n\n![Cockpit change theme](/assets/images/cockpit_change_theme.gif)\n\n","source":"docs/cockpit_dashboard.md","raw":"title: Cockpit Dashboard\nlayout: docs\n---\n\nThe first view we're getting when entering Cockpit is its Dashboard view. Consider this your central station when developing, deploying and debugging your application. It has a lot of things to offer, so let's get right to it and take a look!\n\n## Overview\n\n![Cockpit Dashboard](/assets/images/cockpit_dashboard.png)\n\nThe dashboard is separated into different sections, which each of them having a certain responsibility. Here's a brief overview of what these are.\n\n- **Navigation & Search** - At the very top we have the navigation and search. Those are self explanatory, but we'll talk a bit more about search features in a few moments.\n- **Available Services** - Right below we see boxes for services monitoring. These boxes tell us what services are up and running and will respond accordingly when turned off.\n- **Interactive Console** - This is the Cockpit equivalent of Embark's [Interactive Console](/docs/using_the_console.html).\n- **Deployed Smart Contracts** - The current status of deployed Smart Contracts. Again, very similar to Embark's [Dashboard](/docs/dashboard.html).\n\n## Navigation & Search\n\nWe can navigate through different sections and parts of Cockpit by using the links in the navigation bar as shown below. Notice that the active view is also visually reflected in the navigation as well.\n\n![Cockpit Navigation](/assets/images/cockpit_navigation.gif)\n\nCockpit's search is very powerful and lets us easily search for transactions, Smart Contracts, blocks etc. from a single search bar. All we have to do is entering a valid hash, or, in case we're searching for a deployed Smart Contract, entering the name of the Smart Contract works too:\n\n![Cockpit Search](/assets/images/cockpit_search.gif)\n\n## Available Services\n\nAs mentioned above, the available services tell us which processes and services are running and available within our current Embark session. This is simply for monitoring purposes but can be very useful in case any of the processes is crashing or will be turned off. \n\nThe components will reflect their active state in the UI. We can test this easily disabling any of the services using their dedicated configuration files.\n\n## Interactive Console\n\nThis is an equivalent to Embark's [Interactive Console](/docs/using_the_console.html) just in a more rich and interactive fashion. We can use the same commands, however in addition we also get something called **Smart Suggestions**. \n\nWhen typing a command, Embark will provide decent suggestions, making it very easy to explore what command options are available!\n\n![Cockpit Smart Suggestions](/assets/images/cockpit_suggestions.gif)\n\n## Deployed Smart Contracts\n\nAs the name suggests, this sections lists all of our application's deployed Smart Contracts. Not only that, we can click on any of them and get a nice detail view of the Smart Contract within Cockpit's [Explorer](/docs/cockpit_explorer.html).\n\n![Cockpit Dashboard Contracts](/assets/images/cockpit_dashboard_contracts.gif)\n\n## Changing Dark and Light theme\n\nAnother thing that web-based user interfaces enable easily as opposed to others, is changing the appearance of an application. Cockpit implements two different themes to choose from - light and dark. The light theme is the default.\n\nToggling between light and dark theme is as easy as clicking on the cog wheel in the navigation bar and selecting the theme respectively:\n\n![Cockpit change theme](/assets/images/cockpit_change_theme.gif)\n\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/cockpit_dashboard.html","comments":1,"_id":"ck5ijm3qw000c7hegdljfdyw4","content":"The first view we’re getting when entering Cockpit is its Dashboard view. Consider this your central station when developing, deploying and debugging your application. It has a lot of things to offer, so let’s get right to it and take a look!
\nThe dashboard is separated into different sections, which each of them having a certain responsibility. Here’s a brief overview of what these are.
\nWe can navigate through different sections and parts of Cockpit by using the links in the navigation bar as shown below. Notice that the active view is also visually reflected in the navigation as well.
\n\nCockpit’s search is very powerful and lets us easily search for transactions, Smart Contracts, blocks etc. from a single search bar. All we have to do is entering a valid hash, or, in case we’re searching for a deployed Smart Contract, entering the name of the Smart Contract works too:
\n\nAs mentioned above, the available services tell us which processes and services are running and available within our current Embark session. This is simply for monitoring purposes but can be very useful in case any of the processes is crashing or will be turned off.
\nThe components will reflect their active state in the UI. We can test this easily disabling any of the services using their dedicated configuration files.
\nThis is an equivalent to Embark’s Interactive Console just in a more rich and interactive fashion. We can use the same commands, however in addition we also get something called Smart Suggestions.
\nWhen typing a command, Embark will provide decent suggestions, making it very easy to explore what command options are available!
\n\nAs the name suggests, this sections lists all of our application’s deployed Smart Contracts. Not only that, we can click on any of them and get a nice detail view of the Smart Contract within Cockpit’s Explorer.
\n\nAnother thing that web-based user interfaces enable easily as opposed to others, is changing the appearance of an application. Cockpit implements two different themes to choose from - light and dark. The light theme is the default.
\nToggling between light and dark theme is as easy as clicking on the cog wheel in the navigation bar and selecting the theme respectively:
\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"The first view we’re getting when entering Cockpit is its Dashboard view. Consider this your central station when developing, deploying and debugging your application. It has a lot of things to offer, so let’s get right to it and take a look!
\nThe dashboard is separated into different sections, which each of them having a certain responsibility. Here’s a brief overview of what these are.
\nWe can navigate through different sections and parts of Cockpit by using the links in the navigation bar as shown below. Notice that the active view is also visually reflected in the navigation as well.
\n\nCockpit’s search is very powerful and lets us easily search for transactions, Smart Contracts, blocks etc. from a single search bar. All we have to do is entering a valid hash, or, in case we’re searching for a deployed Smart Contract, entering the name of the Smart Contract works too:
\n\nAs mentioned above, the available services tell us which processes and services are running and available within our current Embark session. This is simply for monitoring purposes but can be very useful in case any of the processes is crashing or will be turned off.
\nThe components will reflect their active state in the UI. We can test this easily disabling any of the services using their dedicated configuration files.
\nThis is an equivalent to Embark’s Interactive Console just in a more rich and interactive fashion. We can use the same commands, however in addition we also get something called Smart Suggestions.
\nWhen typing a command, Embark will provide decent suggestions, making it very easy to explore what command options are available!
\n\nAs the name suggests, this sections lists all of our application’s deployed Smart Contracts. Not only that, we can click on any of them and get a nice detail view of the Smart Contract within Cockpit’s Explorer.
\n\nAnother thing that web-based user interfaces enable easily as opposed to others, is changing the appearance of an application. Cockpit implements two different themes to choose from - light and dark. The light theme is the default.
\nToggling between light and dark theme is as easy as clicking on the cog wheel in the navigation bar and selecting the theme respectively:
\n\n"},{"title":"Deploying with Cockpit","layout":"docs","_content":"\nCockpit offers an additional deployment experience that enables developers to deploy their application's Smart Contracts in an **iterative** and **selective** fashion. In this guide we'll take a closer look at how this works.\n\n## Viewing Smart Contracts\n\nWhen entering the deployment view, the first thing we see is the status of all our application's deployed contracts, similar to [Embark's dashboard](/docs/dashboard.html).\n\nNext to their addresses, we see the arguments that have been used to initialized each and every Smart Contract. \n\nClicking on any of the Smart Contracts opens up a detail view through which we even can call methods associated to that Smart Contract.\n\n![Cockpit Contract View](/assets/images/cockpit_contracts_view.gif)\n\n## Selective deployment\n\nWith the deployment view, it's possible to selectively deploy any of our application's Smart Contracts. By default, Embark will take care of deploying our Smart Contracts based on configurations discussed in our guide on [managing accounts](/docs/blockchain_accounts_configuration.html).\n\nHowever, we can use an injected Web3 instance, for example provided by extensions like Metamask, and select individual Smart Contracts for deployment.\n\nTo make this work, we need to have Metamask setup, and activate the \"Injected Web3\" switch as shown below. Once activated, we can specify values used for initializing our Smart Contracts, as well as performing a gas estimation: \n\n![Cockpit Selective Deployment](/assets/images/cockpit_selective_deployment.gif)\n","source":"docs/cockpit_deployment.md","raw":"title: Deploying with Cockpit\nlayout: docs\n---\n\nCockpit offers an additional deployment experience that enables developers to deploy their application's Smart Contracts in an **iterative** and **selective** fashion. In this guide we'll take a closer look at how this works.\n\n## Viewing Smart Contracts\n\nWhen entering the deployment view, the first thing we see is the status of all our application's deployed contracts, similar to [Embark's dashboard](/docs/dashboard.html).\n\nNext to their addresses, we see the arguments that have been used to initialized each and every Smart Contract. \n\nClicking on any of the Smart Contracts opens up a detail view through which we even can call methods associated to that Smart Contract.\n\n![Cockpit Contract View](/assets/images/cockpit_contracts_view.gif)\n\n## Selective deployment\n\nWith the deployment view, it's possible to selectively deploy any of our application's Smart Contracts. By default, Embark will take care of deploying our Smart Contracts based on configurations discussed in our guide on [managing accounts](/docs/blockchain_accounts_configuration.html).\n\nHowever, we can use an injected Web3 instance, for example provided by extensions like Metamask, and select individual Smart Contracts for deployment.\n\nTo make this work, we need to have Metamask setup, and activate the \"Injected Web3\" switch as shown below. Once activated, we can specify values used for initializing our Smart Contracts, as well as performing a gas estimation: \n\n![Cockpit Selective Deployment](/assets/images/cockpit_selective_deployment.gif)\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/cockpit_deployment.html","comments":1,"_id":"ck5ijm3qz000e7heg6asods5b","content":"Cockpit offers an additional deployment experience that enables developers to deploy their application’s Smart Contracts in an iterative and selective fashion. In this guide we’ll take a closer look at how this works.
\nWhen entering the deployment view, the first thing we see is the status of all our application’s deployed contracts, similar to Embark’s dashboard.
\nNext to their addresses, we see the arguments that have been used to initialized each and every Smart Contract.
\nClicking on any of the Smart Contracts opens up a detail view through which we even can call methods associated to that Smart Contract.
\n\nWith the deployment view, it’s possible to selectively deploy any of our application’s Smart Contracts. By default, Embark will take care of deploying our Smart Contracts based on configurations discussed in our guide on managing accounts.
\nHowever, we can use an injected Web3 instance, for example provided by extensions like Metamask, and select individual Smart Contracts for deployment.
\nTo make this work, we need to have Metamask setup, and activate the “Injected Web3” switch as shown below. Once activated, we can specify values used for initializing our Smart Contracts, as well as performing a gas estimation:
\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Cockpit offers an additional deployment experience that enables developers to deploy their application’s Smart Contracts in an iterative and selective fashion. In this guide we’ll take a closer look at how this works.
\nWhen entering the deployment view, the first thing we see is the status of all our application’s deployed contracts, similar to Embark’s dashboard.
\nNext to their addresses, we see the arguments that have been used to initialized each and every Smart Contract.
\nClicking on any of the Smart Contracts opens up a detail view through which we even can call methods associated to that Smart Contract.
\n\nWith the deployment view, it’s possible to selectively deploy any of our application’s Smart Contracts. By default, Embark will take care of deploying our Smart Contracts based on configurations discussed in our guide on managing accounts.
\nHowever, we can use an injected Web3 instance, for example provided by extensions like Metamask, and select individual Smart Contracts for deployment.
\nTo make this work, we need to have Metamask setup, and activate the “Injected Web3” switch as shown below. Once activated, we can specify values used for initializing our Smart Contracts, as well as performing a gas estimation:
\n\n"},{"title":"Cockpit Editor","layout":"docs","_content":"\nCockpit comes with a web-based code editor that enables us to change our application's source code on the fly. Just like any other typical editor, it has a file tree, can open multiple source files and lets us add and delete files.\n\n## Additional features for Smart Contract files\n\nWhen opening a Smart Contract source file in Cockpit's editor, we'll get additional features and options to work with. These features are **Interact**, **Details** and **Transactions**, very similar to the ones we've discussed in [Exploring Smart Contracts](/docs/cockpit_explorer.html#Exploring-Smart-Contracts).\n\nCockpit will open up dedicated view for each of these in another in-pane window as shown below:\n\n\n![Cockpit Navigation](/assets/images/cockpit_editor.gif)\n\n","source":"docs/cockpit_editor.md","raw":"title: Cockpit Editor\nlayout: docs\n---\n\nCockpit comes with a web-based code editor that enables us to change our application's source code on the fly. Just like any other typical editor, it has a file tree, can open multiple source files and lets us add and delete files.\n\n## Additional features for Smart Contract files\n\nWhen opening a Smart Contract source file in Cockpit's editor, we'll get additional features and options to work with. These features are **Interact**, **Details** and **Transactions**, very similar to the ones we've discussed in [Exploring Smart Contracts](/docs/cockpit_explorer.html#Exploring-Smart-Contracts).\n\nCockpit will open up dedicated view for each of these in another in-pane window as shown below:\n\n\n![Cockpit Navigation](/assets/images/cockpit_editor.gif)\n\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/cockpit_editor.html","comments":1,"_id":"ck5ijm3r2000i7heg6nkq7sik","content":"Cockpit comes with a web-based code editor that enables us to change our application’s source code on the fly. Just like any other typical editor, it has a file tree, can open multiple source files and lets us add and delete files.
\nWhen opening a Smart Contract source file in Cockpit’s editor, we’ll get additional features and options to work with. These features are Interact, Details and Transactions, very similar to the ones we’ve discussed in Exploring Smart Contracts.
\nCockpit will open up dedicated view for each of these in another in-pane window as shown below:
\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Cockpit comes with a web-based code editor that enables us to change our application’s source code on the fly. Just like any other typical editor, it has a file tree, can open multiple source files and lets us add and delete files.
\nWhen opening a Smart Contract source file in Cockpit’s editor, we’ll get additional features and options to work with. These features are Interact, Details and Transactions, very similar to the ones we’ve discussed in Exploring Smart Contracts.
\nCockpit will open up dedicated view for each of these in another in-pane window as shown below:
\n\n"},{"title":"Cockpit Explorer","layout":"docs","_content":"\nThe Explorer view in Cockpit provides an easy and accessible way to browse your way through Smart Contracts, accounts, blocks and transactions. \n\n## Overview\n\nIn the overview of the Explorer we see a aggregation of available accounts, mind blocks and performed transactions. Each of these are paginated, making it easy to navigate through them:\n\n![Cockpit Explorer Overview](/assets/images/cockpit_explorer_overview.png)\n\n## Viewing Accounts\n\nAccount detail view can be accessed by clicking on an account address or hash. The account detail view then not only displays data about the account, but also all transactions associated with the account.\n\nThis makes it very convenient to find transactions, if we're aiming to find any that belong to a certain account.\n![Cockpit Contract View](/assets/images/cockpit_explorer_account.gif)\n\n## Viewing Blocks\n\nBlocks can be inspected as well, just by clicking on their hash. This will open up a block detail view that contains all the data attached to the block in question, including transactions that ended up in there.\n\n![Cockpit Explorer Block](/assets/images/cockpit_explorer_block.png)\n\n## Viewing Transactions\n\nIt's no surprise that Cockpit's Explorer offers a view for inspecting transactions as well. Clicking on a transaction hash takes us to the detail view, rendering all relevant transaction data.\n\n![Cockpit Contract View](/assets/images/cockpit_explorer_transactions.gif)\n\n## Exploring Smart Contracts\n\nWe can extract a lot of information about our deploy Smart Contract instances in the Explorer. When entering a Smart Contract view, we can choose to open any of the available tabs:\n\n- **Interact** - Call methods on your Smart Contract instance\n- **Details** - View the ABI and byte code of your Smart Contract\n- **Transactions** - List and explore all transactions and events associated with that Smart Contract instnace\n\n\n![Cockpit Contract View](/assets/images/cockpit_explorer_contracts_detail.gif)\n\n","source":"docs/cockpit_explorer.md","raw":"title: Cockpit Explorer\nlayout: docs\n---\n\nThe Explorer view in Cockpit provides an easy and accessible way to browse your way through Smart Contracts, accounts, blocks and transactions. \n\n## Overview\n\nIn the overview of the Explorer we see a aggregation of available accounts, mind blocks and performed transactions. Each of these are paginated, making it easy to navigate through them:\n\n![Cockpit Explorer Overview](/assets/images/cockpit_explorer_overview.png)\n\n## Viewing Accounts\n\nAccount detail view can be accessed by clicking on an account address or hash. The account detail view then not only displays data about the account, but also all transactions associated with the account.\n\nThis makes it very convenient to find transactions, if we're aiming to find any that belong to a certain account.\n![Cockpit Contract View](/assets/images/cockpit_explorer_account.gif)\n\n## Viewing Blocks\n\nBlocks can be inspected as well, just by clicking on their hash. This will open up a block detail view that contains all the data attached to the block in question, including transactions that ended up in there.\n\n![Cockpit Explorer Block](/assets/images/cockpit_explorer_block.png)\n\n## Viewing Transactions\n\nIt's no surprise that Cockpit's Explorer offers a view for inspecting transactions as well. Clicking on a transaction hash takes us to the detail view, rendering all relevant transaction data.\n\n![Cockpit Contract View](/assets/images/cockpit_explorer_transactions.gif)\n\n## Exploring Smart Contracts\n\nWe can extract a lot of information about our deploy Smart Contract instances in the Explorer. When entering a Smart Contract view, we can choose to open any of the available tabs:\n\n- **Interact** - Call methods on your Smart Contract instance\n- **Details** - View the ABI and byte code of your Smart Contract\n- **Transactions** - List and explore all transactions and events associated with that Smart Contract instnace\n\n\n![Cockpit Contract View](/assets/images/cockpit_explorer_contracts_detail.gif)\n\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/cockpit_explorer.html","comments":1,"_id":"ck5ijm3r5000l7hegcvmc7q55","content":"The Explorer view in Cockpit provides an easy and accessible way to browse your way through Smart Contracts, accounts, blocks and transactions.
\nIn the overview of the Explorer we see a aggregation of available accounts, mind blocks and performed transactions. Each of these are paginated, making it easy to navigate through them:
\n\nAccount detail view can be accessed by clicking on an account address or hash. The account detail view then not only displays data about the account, but also all transactions associated with the account.
\nThis makes it very convenient to find transactions, if we’re aiming to find any that belong to a certain account.
Blocks can be inspected as well, just by clicking on their hash. This will open up a block detail view that contains all the data attached to the block in question, including transactions that ended up in there.
\n\nIt’s no surprise that Cockpit’s Explorer offers a view for inspecting transactions as well. Clicking on a transaction hash takes us to the detail view, rendering all relevant transaction data.
\n\nWe can extract a lot of information about our deploy Smart Contract instances in the Explorer. When entering a Smart Contract view, we can choose to open any of the available tabs:
\nThe Explorer view in Cockpit provides an easy and accessible way to browse your way through Smart Contracts, accounts, blocks and transactions.
\nIn the overview of the Explorer we see a aggregation of available accounts, mind blocks and performed transactions. Each of these are paginated, making it easy to navigate through them:
\n\nAccount detail view can be accessed by clicking on an account address or hash. The account detail view then not only displays data about the account, but also all transactions associated with the account.
\nThis makes it very convenient to find transactions, if we’re aiming to find any that belong to a certain account.
Blocks can be inspected as well, just by clicking on their hash. This will open up a block detail view that contains all the data attached to the block in question, including transactions that ended up in there.
\n\nIt’s no surprise that Cockpit’s Explorer offers a view for inspecting transactions as well. Clicking on a transaction hash takes us to the detail view, rendering all relevant transaction data.
\n\nWe can extract a lot of information about our deploy Smart Contract instances in the Explorer. When entering a Smart Contract view, we can choose to open any of the available tabs:
\nProbably one of Embark’s most exciting features is its companion web interface Cockpit. With Cockpit, we’re aiming for offering an alternative and more powerful interface to make developing and debugging decentralized applications even easier.
\nThroughout the following sections we’ll take a closer look at Cockpit’s features and how we can use it to improve our developer experience when working with Embark!
\nA note on Cockpit availability
\nPlease note that Cockpit is a feature that ships since Embark version 4.0 and is not available in or for previous versions of Embark.
\n\nCockpit is a web application that ships with Embark since version 4.0. It’s an alternative and sometimes more powerful interface in comparison to Embark’s dashboard, that connects to any existing Embark process. Since it’s web-based, Cockpit offers a much richer and more interactive user interface, with additional tools and features that can’t be found in Embark otherwise.
\nSome of Cockpit’s features are:
\nCockpit is actively developed and implements new features on a regular basis.
\nCockpit can be used as soon as Embark has been spinned up in any of our applications. As mentioned in our guide on running apps, Embark will start Cockpit as part of the run process. In fact, Embark even outputs a message, telling us how to open Cockpit:
\nAccess the web backend with the following url: http://localhost:55555?token=xxxxx-xxxxx-xxxxx-xxxxx |
Notice that token
is a security measurement so nobody else can access your Embark processes through Cockpit (unless they have the token). To make it a little more secure, tokens are one-time use only. If we’re trying to access the same session through different browser instances, one instance won’t be able to connect.
We can always generate a new token inside Embark’s interactive console using the token
command.
Once Embark is running, entering the Cockpit is really just a matter of opening the URL shown by Embark. Let’s explore what Cockpit has to offer in the following guides.
\nBon Voyage!
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Probably one of Embark’s most exciting features is its companion web interface Cockpit. With Cockpit, we’re aiming for offering an alternative and more powerful interface to make developing and debugging decentralized applications even easier.
\nThroughout the following sections we’ll take a closer look at Cockpit’s features and how we can use it to improve our developer experience when working with Embark!
\nA note on Cockpit availability
\nPlease note that Cockpit is a feature that ships since Embark version 4.0 and is not available in or for previous versions of Embark.
\n\nCockpit is a web application that ships with Embark since version 4.0. It’s an alternative and sometimes more powerful interface in comparison to Embark’s dashboard, that connects to any existing Embark process. Since it’s web-based, Cockpit offers a much richer and more interactive user interface, with additional tools and features that can’t be found in Embark otherwise.
\nSome of Cockpit’s features are:
\nCockpit is actively developed and implements new features on a regular basis.
\nCockpit can be used as soon as Embark has been spinned up in any of our applications. As mentioned in our guide on running apps, Embark will start Cockpit as part of the run process. In fact, Embark even outputs a message, telling us how to open Cockpit:
\nAccess the web backend with the following url: http://localhost:55555?token=xxxxx-xxxxx-xxxxx-xxxxx |
Notice that token
is a security measurement so nobody else can access your Embark processes through Cockpit (unless they have the token). To make it a little more secure, tokens are one-time use only. If we’re trying to access the same session through different browser instances, one instance won’t be able to connect.
We can always generate a new token inside Embark’s interactive console using the token
command.
Once Embark is running, entering the Cockpit is really just a matter of opening the URL shown by Embark. Let’s explore what Cockpit has to offer in the following guides.
\nBon Voyage!
\n"},{"title":"Cockpit Utilities","layout":"docs","_content":"\n","source":"docs/cockpit_utils.md","raw":"title: Cockpit Utilities\nlayout: docs\n---\n\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/cockpit_utils.html","comments":1,"_id":"ck5ijm3r9000q7heghpi5a61h","content":"","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":""},{"title":"Configuring Embark","layout":"docs","_content":"\nEmbark offers a lot of fine control when it comes to configuring the different parts of our decentralized application. In this guide we'll take a closer look at the basic configuration options provided by our application's `embark.json` file, which are mainly relevant for, but not restricted to, our application structure.\n\nFor configuration options related to connecting to a blockchain client, [deploying your Smart Contracts](contracts_configuration.html), [decentralized storage](storage_configuration.html), [Whisper](messages_configuration) or [ENS](naming_configuration.html), please head over to the dedicated configuration guides respectively.\n\n## Overview\n\nEvery application [created with Embark](create_project.html) comes with an `embark.json` file. This file configures where Embark has to look for Smart Contract files and assets, as well as plugins options. Here's what a freshly scaffolded `embark.json` file could look like:\n\n```\n{\n \"contracts\": [\"contracts/**\"],\n \"app\": {\n \"js/dapp.js\": [\"app/dapp.js\"],\n \"index.html\": \"app/index.html\",\n \"images/\": [\"app/images/**\"]\n },\n \"buildDir\": \"dist/\",\n \"generationDir\": \"embarkArtifacts\",\n \"config\": \"config/\",\n \"versions\": {\n \"solc\": \"0.4.25\"\n },\n \"plugins\": {\n },\n \"options\": {\n \"solc\": {\n \"optimize\": true,\n \"optimize-runs\": 200\n }\n }\n}\n```\n\nLet's look at the different options and learn what they do and mean.\n\n### contracts\n\nThis is a list of directories in which Embark should look for Smart Contract files. These typically are globbing patterns (e.g `[\"contracts/**/*.sol\"]` will match all sol files inside any folders inside `contracts/`).\n\n### app\n\nEverything inside `app` configures the assets of our application, which could be anything from HTML, JavaScript to CSS and other assets. JavaScript source files are compiled using webpack to create a bundle, all other file types are simply copied to the specified destination.\n\nIn the key/value pairs of `app`, every key describes the destination, while the value describes a list of glob patterns for files to be transformed and copied.\n\n - **js/dapp.js** - This is the JavaScript bundle that contains our application. Specifically, all files that are defined in this option (`app/dapp.js`).\n - **index.html** - The entry point of our application (`app/index.html`)\n - **images** - All image assets of our application that we can find in `app/images/`.\n\nChange these configurations as you need.\n\n### buildDir\n\nThe directory to which the build artifacts are being moved to. Everything inside this configured folder can be considered a production ready build (default is `dist/`).\n\n{% notification info 'Important note:' %}\nWhen using Embark with any other complementary CLI tool for building a DApp, such as Create-React-App or Angular CLI, `buildDir` should point at the same location as the complementary tool writes its distribution files to.\n\nThis is important so that Embark picks up the right files when doing things like [deploying your app](/docs/storage_deployment.html) on IPFS or Swarm.\n{% endnotification %}\n\n### generationDir\n\nA directory in which Embark is going to generate artifacts that can be used for DApp development. This include Smart Contract ABIs as well Embark specific configuration data extracted from the project's configuration. The default name of this directory is `embarkArtifacts`. To learn more about Embark Artifacts, head over to our guide on [Using EmbarkJS](/docs/javascript_usage.html).\n\n### config\n\nThis is the location of the configuration files. There are different options to configure those:\n\n* **A string** (e.g `\"config/\"`) - Will assume the directory in which the configuration files are located (`blockchain.js`, `contracts.js`, etc).\n* **An object**:\n * Each property would configure the path of each configuration file\n * Configuration properties can be set to false to disable the component/service in question\n\n```\n...\n\"config\": {\n \"contracts\": \"contracts.js\",\n \"blockchain\": false,\n \"storage\": false,\n \"communication\": false,\n \"webserver\": false\n},\n...\n```\n\n### versions (3rd-party libraries)\n\nHere you can optionally specify the versions of the library to be used by Embark. Embark will automatically download the specific library version if necessary.\n\nCurrently, `solc` is the only library that can be specified in this way. It's possible to override the `solc` version in other configuration files such as `contracts.json` on a per environment basis.\n\n### plugins\n\nThis is a list of installed plugins. For more information on Plugins, head over to our [Plugins guide](/docs/installing_plugins.html).\n\n### options\n\nThe `options` property enable us to configure options for specific components and services of Embark and our application. Currently supported are options for the `solc` compiler, as well as options related to Embark's `reset` command:\n```\n...\n \"options\": {\n \"solc\": {\n \"optimize\": true,\n \"optimize-runs\": 200\n },\n }\n...\n```\n\n## Configuring Embark's reset command\n\nAs mentioned in the section above, it's possible to configure how Embark behaves when [resetting projects](/docs/running_apps.html#Resetting-apps). Most of the time, the default configuration should do the trick, however, if we need more control over what files should be removed as part of the reset, we can do that using the `reset` option.\n\nIt comes with two properties:\n\n- **defaults** - Tells Embark whether it should reset the default files it usually resets or not\n- **files** - A list of files Embark should remove as well when resetting the project\n\nWith these two options we have full control over what files `reset` will remove.\n\n```\n...\n \"options\": {\n \"reset\": {\n \"defaults\": true,\n \"files\": [\"some/other/file\"]\n }\n }\n...\n```\n","source":"docs/configuration.md","raw":"title: Configuring Embark\nlayout: docs\n---\n\nEmbark offers a lot of fine control when it comes to configuring the different parts of our decentralized application. In this guide we'll take a closer look at the basic configuration options provided by our application's `embark.json` file, which are mainly relevant for, but not restricted to, our application structure.\n\nFor configuration options related to connecting to a blockchain client, [deploying your Smart Contracts](contracts_configuration.html), [decentralized storage](storage_configuration.html), [Whisper](messages_configuration) or [ENS](naming_configuration.html), please head over to the dedicated configuration guides respectively.\n\n## Overview\n\nEvery application [created with Embark](create_project.html) comes with an `embark.json` file. This file configures where Embark has to look for Smart Contract files and assets, as well as plugins options. Here's what a freshly scaffolded `embark.json` file could look like:\n\n```\n{\n \"contracts\": [\"contracts/**\"],\n \"app\": {\n \"js/dapp.js\": [\"app/dapp.js\"],\n \"index.html\": \"app/index.html\",\n \"images/\": [\"app/images/**\"]\n },\n \"buildDir\": \"dist/\",\n \"generationDir\": \"embarkArtifacts\",\n \"config\": \"config/\",\n \"versions\": {\n \"solc\": \"0.4.25\"\n },\n \"plugins\": {\n },\n \"options\": {\n \"solc\": {\n \"optimize\": true,\n \"optimize-runs\": 200\n }\n }\n}\n```\n\nLet's look at the different options and learn what they do and mean.\n\n### contracts\n\nThis is a list of directories in which Embark should look for Smart Contract files. These typically are globbing patterns (e.g `[\"contracts/**/*.sol\"]` will match all sol files inside any folders inside `contracts/`).\n\n### app\n\nEverything inside `app` configures the assets of our application, which could be anything from HTML, JavaScript to CSS and other assets. JavaScript source files are compiled using webpack to create a bundle, all other file types are simply copied to the specified destination.\n\nIn the key/value pairs of `app`, every key describes the destination, while the value describes a list of glob patterns for files to be transformed and copied.\n\n - **js/dapp.js** - This is the JavaScript bundle that contains our application. Specifically, all files that are defined in this option (`app/dapp.js`).\n - **index.html** - The entry point of our application (`app/index.html`)\n - **images** - All image assets of our application that we can find in `app/images/`.\n\nChange these configurations as you need.\n\n### buildDir\n\nThe directory to which the build artifacts are being moved to. Everything inside this configured folder can be considered a production ready build (default is `dist/`).\n\n{% notification info 'Important note:' %}\nWhen using Embark with any other complementary CLI tool for building a DApp, such as Create-React-App or Angular CLI, `buildDir` should point at the same location as the complementary tool writes its distribution files to.\n\nThis is important so that Embark picks up the right files when doing things like [deploying your app](/docs/storage_deployment.html) on IPFS or Swarm.\n{% endnotification %}\n\n### generationDir\n\nA directory in which Embark is going to generate artifacts that can be used for DApp development. This include Smart Contract ABIs as well Embark specific configuration data extracted from the project's configuration. The default name of this directory is `embarkArtifacts`. To learn more about Embark Artifacts, head over to our guide on [Using EmbarkJS](/docs/javascript_usage.html).\n\n### config\n\nThis is the location of the configuration files. There are different options to configure those:\n\n* **A string** (e.g `\"config/\"`) - Will assume the directory in which the configuration files are located (`blockchain.js`, `contracts.js`, etc).\n* **An object**:\n * Each property would configure the path of each configuration file\n * Configuration properties can be set to false to disable the component/service in question\n\n```\n...\n\"config\": {\n \"contracts\": \"contracts.js\",\n \"blockchain\": false,\n \"storage\": false,\n \"communication\": false,\n \"webserver\": false\n},\n...\n```\n\n### versions (3rd-party libraries)\n\nHere you can optionally specify the versions of the library to be used by Embark. Embark will automatically download the specific library version if necessary.\n\nCurrently, `solc` is the only library that can be specified in this way. It's possible to override the `solc` version in other configuration files such as `contracts.json` on a per environment basis.\n\n### plugins\n\nThis is a list of installed plugins. For more information on Plugins, head over to our [Plugins guide](/docs/installing_plugins.html).\n\n### options\n\nThe `options` property enable us to configure options for specific components and services of Embark and our application. Currently supported are options for the `solc` compiler, as well as options related to Embark's `reset` command:\n```\n...\n \"options\": {\n \"solc\": {\n \"optimize\": true,\n \"optimize-runs\": 200\n },\n }\n...\n```\n\n## Configuring Embark's reset command\n\nAs mentioned in the section above, it's possible to configure how Embark behaves when [resetting projects](/docs/running_apps.html#Resetting-apps). Most of the time, the default configuration should do the trick, however, if we need more control over what files should be removed as part of the reset, we can do that using the `reset` option.\n\nIt comes with two properties:\n\n- **defaults** - Tells Embark whether it should reset the default files it usually resets or not\n- **files** - A list of files Embark should remove as well when resetting the project\n\nWith these two options we have full control over what files `reset` will remove.\n\n```\n...\n \"options\": {\n \"reset\": {\n \"defaults\": true,\n \"files\": [\"some/other/file\"]\n }\n }\n...\n```\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/configuration.html","comments":1,"_id":"ck5ijm3ra000s7heg60xe14sp","content":"Embark offers a lot of fine control when it comes to configuring the different parts of our decentralized application. In this guide we’ll take a closer look at the basic configuration options provided by our application’s embark.json
file, which are mainly relevant for, but not restricted to, our application structure.
For configuration options related to connecting to a blockchain client, deploying your Smart Contracts, decentralized storage, Whisper or ENS, please head over to the dedicated configuration guides respectively.
\nEvery application created with Embark comes with an embark.json
file. This file configures where Embark has to look for Smart Contract files and assets, as well as plugins options. Here’s what a freshly scaffolded embark.json
file could look like:
{ |
Let’s look at the different options and learn what they do and mean.
\nThis is a list of directories in which Embark should look for Smart Contract files. These typically are globbing patterns (e.g ["contracts/**/*.sol"]
will match all sol files inside any folders inside contracts/
).
Everything inside app
configures the assets of our application, which could be anything from HTML, JavaScript to CSS and other assets. JavaScript source files are compiled using webpack to create a bundle, all other file types are simply copied to the specified destination.
In the key/value pairs of app
, every key describes the destination, while the value describes a list of glob patterns for files to be transformed and copied.
app/dapp.js
).app/index.html
)app/images/
.Change these configurations as you need.
\nThe directory to which the build artifacts are being moved to. Everything inside this configured folder can be considered a production ready build (default is dist/
).
Important note:
\nWhen using Embark with any other complementary CLI tool for building a DApp, such as Create-React-App or Angular CLI, buildDir
should point at the same location as the complementary tool writes its distribution files to.
This is important so that Embark picks up the right files when doing things like deploying your app on IPFS or Swarm.
\n\nA directory in which Embark is going to generate artifacts that can be used for DApp development. This include Smart Contract ABIs as well Embark specific configuration data extracted from the project’s configuration. The default name of this directory is embarkArtifacts
. To learn more about Embark Artifacts, head over to our guide on Using EmbarkJS.
This is the location of the configuration files. There are different options to configure those:
\n"config/"
) - Will assume the directory in which the configuration files are located (blockchain.js
, contracts.js
, etc).... |
Here you can optionally specify the versions of the library to be used by Embark. Embark will automatically download the specific library version if necessary.
\nCurrently, solc
is the only library that can be specified in this way. It’s possible to override the solc
version in other configuration files such as contracts.json
on a per environment basis.
This is a list of installed plugins. For more information on Plugins, head over to our Plugins guide.
\nThe options
property enable us to configure options for specific components and services of Embark and our application. Currently supported are options for the solc
compiler, as well as options related to Embark’s reset
command:
... |
As mentioned in the section above, it’s possible to configure how Embark behaves when resetting projects. Most of the time, the default configuration should do the trick, however, if we need more control over what files should be removed as part of the reset, we can do that using the reset
option.
It comes with two properties:
\nWith these two options we have full control over what files reset
will remove.
... |
Embark offers a lot of fine control when it comes to configuring the different parts of our decentralized application. In this guide we’ll take a closer look at the basic configuration options provided by our application’s embark.json
file, which are mainly relevant for, but not restricted to, our application structure.
For configuration options related to connecting to a blockchain client, deploying your Smart Contracts, decentralized storage, Whisper or ENS, please head over to the dedicated configuration guides respectively.
\nEvery application created with Embark comes with an embark.json
file. This file configures where Embark has to look for Smart Contract files and assets, as well as plugins options. Here’s what a freshly scaffolded embark.json
file could look like:
{ |
Let’s look at the different options and learn what they do and mean.
\nThis is a list of directories in which Embark should look for Smart Contract files. These typically are globbing patterns (e.g ["contracts/**/*.sol"]
will match all sol files inside any folders inside contracts/
).
Everything inside app
configures the assets of our application, which could be anything from HTML, JavaScript to CSS and other assets. JavaScript source files are compiled using webpack to create a bundle, all other file types are simply copied to the specified destination.
In the key/value pairs of app
, every key describes the destination, while the value describes a list of glob patterns for files to be transformed and copied.
app/dapp.js
).app/index.html
)app/images/
.Change these configurations as you need.
\nThe directory to which the build artifacts are being moved to. Everything inside this configured folder can be considered a production ready build (default is dist/
).
Important note:
\nWhen using Embark with any other complementary CLI tool for building a DApp, such as Create-React-App or Angular CLI, buildDir
should point at the same location as the complementary tool writes its distribution files to.
This is important so that Embark picks up the right files when doing things like deploying your app on IPFS or Swarm.
\n\nA directory in which Embark is going to generate artifacts that can be used for DApp development. This include Smart Contract ABIs as well Embark specific configuration data extracted from the project’s configuration. The default name of this directory is embarkArtifacts
. To learn more about Embark Artifacts, head over to our guide on Using EmbarkJS.
This is the location of the configuration files. There are different options to configure those:
\n"config/"
) - Will assume the directory in which the configuration files are located (blockchain.js
, contracts.js
, etc).... |
Here you can optionally specify the versions of the library to be used by Embark. Embark will automatically download the specific library version if necessary.
\nCurrently, solc
is the only library that can be specified in this way. It’s possible to override the solc
version in other configuration files such as contracts.json
on a per environment basis.
This is a list of installed plugins. For more information on Plugins, head over to our Plugins guide.
\nThe options
property enable us to configure options for specific components and services of Embark and our application. Currently supported are options for the solc
compiler, as well as options related to Embark’s reset
command:
... |
As mentioned in the section above, it’s possible to configure how Embark behaves when resetting projects. Most of the time, the default configuration should do the trick, however, if we need more control over what files should be removed as part of the reset, we can do that using the reset
option.
It comes with two properties:
\nWith these two options we have full control over what files reset
will remove.
... |
module.exports = function(embark) {\n embark.registerConsoleCommand(function(cmd, options) {\n if (cmd === \"hello\") {\n return \"hello there!\";\n }\n // continue to embark or next plugin;\n return false;\n });\n }\n
\n","source":"docs/console_commands.md","raw":"title: Console Commands\nlayout: docs\n---\n\nWith ``embark run`` there is a console at the bottom which can be used to interact with contracts or with embark itself. type ``help`` to see a list of available commands, more commands will be added with each version of Embark.\n\n### Interacting with contracts\nAfter contract deployment, you should be able to interact with the web3 object and the deployed contracts.\n\n### Other Available Commands\nSome commands available include:\n\n* ``version`` - see list of software & libraries and their respective versions\n* ``quit`` or ``exit`` - to immediatly exit (you can also use ctrl + c)\n* ``webserver start`` - start the dev webserver\n* ``webserver stop`` - stop the dev webserver\n* ``browser open`` - open a web browser and load your DApp from the dev webserver\n\n### Custom Commands\n\nIt's possible to extend Embark to include custom commands. See [how to create\na plugin](creating_plugins.html)\n\nmodule.exports = function(embark) {\n embark.registerConsoleCommand(function(cmd, options) {\n if (cmd === \"hello\") {\n return \"hello there!\";\n }\n // continue to embark or next plugin;\n return false;\n });\n }\n
\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/console_commands.html","comments":1,"_id":"ck5ijm3ra000u7heg555m76d6","content":"With embark run
there is a console at the bottom which can be used to interact with contracts or with embark itself. type help
to see a list of available commands, more commands will be added with each version of Embark.
After contract deployment, you should be able to interact with the web3 object and the deployed contracts.
\nSome commands available include:
\nversion
- see list of software & libraries and their respective versionsquit
or exit
- to immediatly exit (you can also use ctrl + c)webserver start
- start the dev webserverwebserver stop
- stop the dev webserverbrowser open
- open a web browser and load your DApp from the dev webserverIt’s possible to extend Embark to include custom commands. See how to create
a plugin
module.exports = function(embark) {\n embark.registerConsoleCommand(function(cmd, options) {\n if (cmd === \"hello\") {\n return \"hello there!\";\n }\n // continue to embark or next plugin;\n return false;\n });\n }\n
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"With embark run
there is a console at the bottom which can be used to interact with contracts or with embark itself. type help
to see a list of available commands, more commands will be added with each version of Embark.
After contract deployment, you should be able to interact with the web3 object and the deployed contracts.
\nSome commands available include:
\nversion
- see list of software & libraries and their respective versionsquit
or exit
- to immediatly exit (you can also use ctrl + c)webserver start
- start the dev webserverwebserver stop
- stop the dev webserverbrowser open
- open a web browser and load your DApp from the dev webserverIt’s possible to extend Embark to include custom commands. See how to create
a plugin
module.exports = function(embark) {\n embark.registerConsoleCommand(function(cmd, options) {\n if (cmd === \"hello\") {\n return \"hello there!\";\n }\n // continue to embark or next plugin;\n return false;\n });\n }\n
\n"},{"title":"Accounts & Deployment","layout":"docs","_content":"\nAccounts configuration has moved to the blockchain config. You can learn more [here](/docs/blockchain_accounts_configuration.html).\n\n## Deploying to Infura\n\nTo deploy to Infura or another endpoint, just use the blockchain `endpoint`. More details [here](/docs/blockchain_configuration.html)\n","source":"docs/contracts_deployment.md","raw":"title: Accounts & Deployment\nlayout: docs\n---\n\nAccounts configuration has moved to the blockchain config. You can learn more [here](/docs/blockchain_accounts_configuration.html).\n\n## Deploying to Infura\n\nTo deploy to Infura or another endpoint, just use the blockchain `endpoint`. More details [here](/docs/blockchain_configuration.html)\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/contracts_deployment.html","comments":1,"_id":"ck5ijm3rb000w7heg1uvb25hr","content":"Accounts configuration has moved to the blockchain config. You can learn more here.
\nTo deploy to Infura or another endpoint, just use the blockchain endpoint
. More details here
Accounts configuration has moved to the blockchain config. You can learn more here.
\nTo deploy to Infura or another endpoint, just use the blockchain endpoint
. More details here
Depending on which language for developing Smart Contracts is used, Embark supports special import paths. In this guide we’ll discuss the various ways of importing Smart Contract source code in other Smart Contract files.
\nScope of this guide
\nThe following features are currently only supported for Smart Contracts written in the Solidity programming language. If you’re using another language, such as Vyper, these features may not be available.
\n\nIf using Solidity it’s possible to import other Smart Contract files inside a source file from the application’s folders that are not explicitly defined in the deploy
property of embark.json
.
import "another_folder/another_test.sol"; |
node_modules
Embark also supports convenient imports from installed node_modules
. Just specify the package name including the path to the Solidity file you wish to import.
import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; |
Source files can even be imported straight from Git, Github, IPFS, Swarm or via HTTP(S):
\nimport "git://github.com/status/contracts/contracts/identity/ERC725.sol#develop"; |
Depending on which language for developing Smart Contracts is used, Embark supports special import paths. In this guide we’ll discuss the various ways of importing Smart Contract source code in other Smart Contract files.
\nScope of this guide
\nThe following features are currently only supported for Smart Contracts written in the Solidity programming language. If you’re using another language, such as Vyper, these features may not be available.
\n\nIf using Solidity it’s possible to import other Smart Contract files inside a source file from the application’s folders that are not explicitly defined in the deploy
property of embark.json
.
import "another_folder/another_test.sol"; |
node_modules
Embark also supports convenient imports from installed node_modules
. Just specify the package name including the path to the Solidity file you wish to import.
import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; |
Source files can even be imported straight from Git, Github, IPFS, Swarm or via HTTP(S):
\nimport "git://github.com/status/contracts/contracts/identity/ERC725.sol#develop"; |
In order to talk to our deployed Smart Contracts through a web application, we typically need a JavaScript equivalent that offers APIs to make this possible. Embark generates JavaScript artifacts for all Smart Contracts used by our application.
\nIn this guide we’ll take a quick look how to make use of them!
\nEmbark will automatically generate artifacts for all configured Smart Contracts in our application, making them available to an application’s front-end. Allwe have to do is importing them accordingly. For example, the Smart Contract below:
\ncontract SimpleStorage { |
Will available as JavaScript object, after artifact generation and can be imported as:
\nimport { SimpleStorage } from './embarkArtifacts/contracts'; |
Notice that the exact path to the Smart Contract source is configured using the generationDir
property in Embark’s configuration.
Once imported, Smart Contract APIs can be used as needed. The code below uses Web.js syntax and might differ from your APIs, depending on what web3 connector you’ve installed.
\nSimpleStorage.methods.set(100).send(); |
In order to talk to our deployed Smart Contracts through a web application, we typically need a JavaScript equivalent that offers APIs to make this possible. Embark generates JavaScript artifacts for all Smart Contracts used by our application.
\nIn this guide we’ll take a quick look how to make use of them!
\nEmbark will automatically generate artifacts for all configured Smart Contracts in our application, making them available to an application’s front-end. Allwe have to do is importing them accordingly. For example, the Smart Contract below:
\ncontract SimpleStorage { |
Will available as JavaScript object, after artifact generation and can be imported as:
\nimport { SimpleStorage } from './embarkArtifacts/contracts'; |
Notice that the exact path to the Smart Contract source is configured using the generationDir
property in Embark’s configuration.
Once imported, Smart Contract APIs can be used as needed. The code below uses Web.js syntax and might differ from your APIs, depending on what web3 connector you’ve installed.
\nSimpleStorage.methods.set(100).send(); |
Once Embark is installed, there are different ways to create a new decentralized application. Whether we intent to create an application that uses only Smart Contracts, or we want to take advantage of other decentralized features like storages and messaging, Embark provides options and templates for various scenarios. Let’s take a look!
\ndemo
commandAs discussed in our quickstart guide, the fastest way to get up and running with Embark is using its demo
command. This will scaffold a new demo application and its needed environment in a folder called embark_demo
. The demo application lets you play with Embark’s APIs through a pre-built web interface.
$ embark demo |
If you prefer starting entirely from scratch, while still getting a ready to use environment, Embark’s new
command has got you covered. Similar to the demo
command, it will scaffold a new project folder. However, it will not include the demo application. The green field is all yours.
Quick tip: Smart Contract only apps
\nSmart Contract developers that mainly want to focus on building and deploying Smart Contracts can take advantage of new
command’s --contracts-only
option, as described here.
$ embark new <YourDappName> |
Another possible scenario to start from is taking advantage of a template. Embark comes with templates for various environments and frameworks, but you can also use any template created by the community. In order to create a new app from a template, use the --template
option and either specify a supported template name, or a Git host URL.
The following example creates a new application from Embark’s TypeScript template:
\n$ embark new <YourDAppName> --template typescript |
To learn more about supported templates, head over to our templates or look out for embark-[template_name]-template
repositories.
Templates can also be fetched from external resources as long as they can be referred to via Git host URLs. The following example fetches a template from a GitHub repository and uses that to create that app:
\n$ embark new <YourDAppName> --template https://github.com/embark-framework/embark-vue-template |
In fact, in case of GitHub, the same can be done with the username/repository shortcut:
\n$ embark new <YourDAppName> --template embark-framework/embark-vue-template |
It is even possible to specify the branch by appending a #
and the branch name you’re interested in:
$ embark new <YourDAppName> --template status-im/dappcon-workshop-dapp#start-here |
Sometimes, all we really want to do is creating, developing, compiling and deploying Smart Contracts without introducing an actual front-end that talks to them. Embark lets us scaffold apps that come with the most minimal setup needed to build and deploy our Smart Contracts, using the --contracts-only
option.
The following command will create a project with all Embark services disabled except the blockchain service.
\n$ embark new <YourDAppName> --contracts-only |
This will also affect the generated application structure, as Smart Contract only apps are less complex. Learn more about the application structure of Smart Contract only apps here.
\nA note on --simple
\nIn earlier versions of Embark the same could be achieved using the --simple
option. This option is still supported but will be deprecated and likely be removed in future versions of Embark.
Once Embark is installed, there are different ways to create a new decentralized application. Whether we intent to create an application that uses only Smart Contracts, or we want to take advantage of other decentralized features like storages and messaging, Embark provides options and templates for various scenarios. Let’s take a look!
\ndemo
commandAs discussed in our quickstart guide, the fastest way to get up and running with Embark is using its demo
command. This will scaffold a new demo application and its needed environment in a folder called embark_demo
. The demo application lets you play with Embark’s APIs through a pre-built web interface.
$ embark demo |
If you prefer starting entirely from scratch, while still getting a ready to use environment, Embark’s new
command has got you covered. Similar to the demo
command, it will scaffold a new project folder. However, it will not include the demo application. The green field is all yours.
Quick tip: Smart Contract only apps
\nSmart Contract developers that mainly want to focus on building and deploying Smart Contracts can take advantage of new
command’s --contracts-only
option, as described here.
$ embark new <YourDappName> |
Another possible scenario to start from is taking advantage of a template. Embark comes with templates for various environments and frameworks, but you can also use any template created by the community. In order to create a new app from a template, use the --template
option and either specify a supported template name, or a Git host URL.
The following example creates a new application from Embark’s TypeScript template:
\n$ embark new <YourDAppName> --template typescript |
To learn more about supported templates, head over to our templates or look out for embark-[template_name]-template
repositories.
Templates can also be fetched from external resources as long as they can be referred to via Git host URLs. The following example fetches a template from a GitHub repository and uses that to create that app:
\n$ embark new <YourDAppName> --template https://github.com/embark-framework/embark-vue-template |
In fact, in case of GitHub, the same can be done with the username/repository shortcut:
\n$ embark new <YourDAppName> --template embark-framework/embark-vue-template |
It is even possible to specify the branch by appending a #
and the branch name you’re interested in:
$ embark new <YourDAppName> --template status-im/dappcon-workshop-dapp#start-here |
Sometimes, all we really want to do is creating, developing, compiling and deploying Smart Contracts without introducing an actual front-end that talks to them. Embark lets us scaffold apps that come with the most minimal setup needed to build and deploy our Smart Contracts, using the --contracts-only
option.
The following command will create a project with all Embark services disabled except the blockchain service.
\n$ embark new <YourDAppName> --contracts-only |
This will also affect the generated application structure, as Smart Contract only apps are less complex. Learn more about the application structure of Smart Contract only apps here.
\nA note on --simple
\nIn earlier versions of Embark the same could be achieved using the --simple
option. This option is still supported but will be deprecated and likely be removed in future versions of Embark.
If you can’t find a plugin that fulfills your needs, it’s probably a good time to think about creating your own. In this guide we’ll discuss how to set up a custom plugin and briefly talk about various use cases. Later on we’ll dive into the available Plugin APIs.
\nA plugin is really just another NodeJS project that takes a plugin API object and make use of it. To get started, all we have to do is creating a new directory and initializing it as an npm module:
\n$ mkdir yourpluginname |
Once that is done we can create an index.js
file that contains the following code:
module.exports = function(embark) { |
The embark
object provides plenty of APIs to extend different functionalities of Embark, which can be found in the Plugin Api Reference.
Since the Plugin API surface is rather big, here are some usecase examples to sparkle some inspiration:
\naddContractFile()
registerContractConfiguration()
(goes well with addContractFile()
)beforeDeploy()
registerClientWeb3Provider()
registerContractsGeneration()
registerConsoleCommand()
embark.registerCompiler()
embark.events.on()
registerServiceCheck()
If you can’t find a plugin that fulfills your needs, it’s probably a good time to think about creating your own. In this guide we’ll discuss how to set up a custom plugin and briefly talk about various use cases. Later on we’ll dive into the available Plugin APIs.
\nA plugin is really just another NodeJS project that takes a plugin API object and make use of it. To get started, all we have to do is creating a new directory and initializing it as an npm module:
\n$ mkdir yourpluginname |
Once that is done we can create an index.js
file that contains the following code:
module.exports = function(embark) { |
The embark
object provides plenty of APIs to extend different functionalities of Embark, which can be found in the Plugin Api Reference.
Since the Plugin API surface is rather big, here are some usecase examples to sparkle some inspiration:
\naddContractFile()
registerContractConfiguration()
(goes well with addContractFile()
)beforeDeploy()
registerClientWeb3Provider()
registerContractsGeneration()
registerConsoleCommand()
embark.registerCompiler()
embark.events.on()
registerServiceCheck()
Embark provides a very useful dashboard view that aims to make it easier for developers to keep track of things, such as running services, compilation and deployments. In this guide, we’ll take a closer look at the dashboard and its features.
\nEmbark spins up the dashboard view automatically for us, whenever we run embark run
inside an Embark project. Here’s what it looks like:
The dashboard is separated into different sections, each with their own responsibility. The sections are:
\nContracts - This section shows you not only all the Smart Contracts within your project, but also their status on whether they are being deployed at the moment or not. Notice that, as we make changes to our Smart Contracts, the dashboard will reflect the automatic redeployment in this section as well, making it very easy to stay on top of things.
\nEnvironment - This is the name of the environment we’re running Embark in at the moment. If we don’t specify an environment when running embark run
, Embark will default to development
.
Status - As mentioned, Embark watches for changes in our application’s source code and will recompile, rebuild and redeploy components accordingly. The status section tells us what status Embark is currently in. Which could be one of the following:
\nAvailable Services - This section displays all services available to our application. If a service is down or unreachable, it will show up in red.
\nLogs and Console - While the logs section simply prints out all of Embark’s output, the console can be used to either interact with our application’s Smart Contracts or Embark itself. Use the help
command to get a list of all available commands supported by Embark’s console, or head over to our guide on Using the the console to learn more.
Embark can be run without spinning up the dashboard view using the --nodashboard
option. Head over to our guide on running apps for more information.
Embark provides a very useful dashboard view that aims to make it easier for developers to keep track of things, such as running services, compilation and deployments. In this guide, we’ll take a closer look at the dashboard and its features.
\nEmbark spins up the dashboard view automatically for us, whenever we run embark run
inside an Embark project. Here’s what it looks like:
The dashboard is separated into different sections, each with their own responsibility. The sections are:
\nContracts - This section shows you not only all the Smart Contracts within your project, but also their status on whether they are being deployed at the moment or not. Notice that, as we make changes to our Smart Contracts, the dashboard will reflect the automatic redeployment in this section as well, making it very easy to stay on top of things.
\nEnvironment - This is the name of the environment we’re running Embark in at the moment. If we don’t specify an environment when running embark run
, Embark will default to development
.
Status - As mentioned, Embark watches for changes in our application’s source code and will recompile, rebuild and redeploy components accordingly. The status section tells us what status Embark is currently in. Which could be one of the following:
\nAvailable Services - This section displays all services available to our application. If a service is down or unreachable, it will show up in red.
\nLogs and Console - While the logs section simply prints out all of Embark’s output, the console can be used to either interact with our application’s Smart Contracts or Embark itself. Use the help
command to get a list of all available commands supported by Embark’s console, or head over to our guide on Using the the console to learn more.
Embark can be run without spinning up the dashboard view using the --nodashboard
option. Head over to our guide on running apps for more information.
This is the Embark CLI command reference.
\n$ embark new dappName |
Creates a new empty DApp project. If no dappName
is provided, Embark will ask for the dappName.
Option | \nDescription | \n
---|---|
--contracts-only | \ncreate a barebones project meant only for contract development | \n
--simple | \nan alias for --contracts-only | \n
--template | \ndownload a template using a known name or a git host URL | \n
The --template
option supports several URL styles and shortcuts for git hosts:
git@github.com:ghuser/repo_name |
It’s possible to append a branch name to any of the above, for example:
\nhttps://github.com/ghuser/repo_name#branch_name |
Bitbucket and GitLab URLs and shortcuts are also supported, for example:
\nbitbucket:bbuser/repo_name#branch_name |
A short name can be used for templates maintained in the Embark GitHub organization, for example:
\n$ embark new --template typescript |
Please see our list of officially supported templates.
\n$ embark demo |
Generates a demo Embark Project with a working contract and examples of working with contracts, IPFS and Whisper.
\n$ embark build [environment] |
Deploys and Builds the DApp at dist/. If no environment
is provider embark will use development
by default.
$ embark run [environment] |
Deploys and Builds the DApp at dist/
. By default will launch a dashboard and start a dev server at http://localhost:8000/
. If no environment
is provider embark will use development
by default.
Option | \nDescription | \n
---|---|
-p , --port | \nport to run the dev webserver (default: 8000) | \n
-b , --host | \nhost to run the dev webserver (default: localhost) | \n
--noserver | \ndisable the development webserver | \n
--nodashboard | \nsimple mode, disables the dashboard | \n
--nobrowser | \nprevent the development webserver from automatically opening a web browser | \n
--no-color | \nno colors in case it’s needed for compatbility purposes | \n
--logfile | \nfilename to output logs (default: none) | \n
$ embark eject-build-config |
Copies Embark’s default webpack.config.js
file into your DApp so that you can customize it. If a file named webpack.config.js
is present in your top-level DApp directory, Embark will use your webpack config file instead of its own.
$ embark blockchain [environment] |
Takes the config at config/blockchain.json
for the environment
specified and starts a blockchain node. If no environment
is provider embark will use development
by default.
If you want, you can skip the step of running embark blockchain
, as embark run
, build
and upload
now all start a blockchain node in a separate process if there is not one already started using the same configurations.
$ embark simulator [environment] |
Takes the config at config/blockchain.json
for the environment
specified and starts a blockchain simulator. If no environment
is provider embark will use development
by default.
Option | \nDescription | \n
---|---|
-p , --port | \nport to run the rpc simulator (default: 8545) | \n
-h , --host | \nhost to run the rpc simulator (default: localhost) | \n
-a , --accounts | \nnum of accounts to start the simulator (default: 10) | \n
-e , --defaultBalanceEther | \nbalance in ether to assign each test account (default: 100) | \n
-l , --gasLimit | \ncustom gasLimit (default: 8000000) | \n
$ embark test [file] |
Runs Tests. If file
is not specified then it will run all the tests inside the test/
directory.
Option | \nDescription | \n
---|---|
-n , --node | \nnode for running the tests (default: vm) | \n
-d , --gasDetails | \nprint the gas cost for each contract deployment when running the tests | \n
-c , --coverage | \ngenerate a coverage report after running the tests (vm only) | \n
The --node
option supports several values:
Value | \nDescription | \n
---|---|
vm | \nstart and use an Ethereum simulator (ganache) | \n
embark | \nuse the node of a running embark process | \n
<endpoint> | \nconnect to and use the specified node | \n
Example of endpoint usage: embark test --node ws://localhost:8556
$ embark reset |
Resets embarks state on this dapp including clearing cache.
\n$ embark upload [platform] [environment] |
Uploads the DApp to a decentralized storage such as IPFS. platform
can be ipfs
or swarm
or another parameter if supported by a plugin. If no environment
is provider embark will use development
by default.
$ embark graph |
Generates documentation based on the smart contracts configured
\n$ embark version |
Displays version information.
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"This is the Embark CLI command reference.
\n$ embark new dappName |
Creates a new empty DApp project. If no dappName
is provided, Embark will ask for the dappName.
Option | \nDescription | \n
---|---|
--contracts-only | \ncreate a barebones project meant only for contract development | \n
--simple | \nan alias for --contracts-only | \n
--template | \ndownload a template using a known name or a git host URL | \n
The --template
option supports several URL styles and shortcuts for git hosts:
git@github.com:ghuser/repo_name |
It’s possible to append a branch name to any of the above, for example:
\nhttps://github.com/ghuser/repo_name#branch_name |
Bitbucket and GitLab URLs and shortcuts are also supported, for example:
\nbitbucket:bbuser/repo_name#branch_name |
A short name can be used for templates maintained in the Embark GitHub organization, for example:
\n$ embark new --template typescript |
Please see our list of officially supported templates.
\n$ embark demo |
Generates a demo Embark Project with a working contract and examples of working with contracts, IPFS and Whisper.
\n$ embark build [environment] |
Deploys and Builds the DApp at dist/. If no environment
is provider embark will use development
by default.
$ embark run [environment] |
Deploys and Builds the DApp at dist/
. By default will launch a dashboard and start a dev server at http://localhost:8000/
. If no environment
is provider embark will use development
by default.
Option | \nDescription | \n
---|---|
-p , --port | \nport to run the dev webserver (default: 8000) | \n
-b , --host | \nhost to run the dev webserver (default: localhost) | \n
--noserver | \ndisable the development webserver | \n
--nodashboard | \nsimple mode, disables the dashboard | \n
--nobrowser | \nprevent the development webserver from automatically opening a web browser | \n
--no-color | \nno colors in case it’s needed for compatbility purposes | \n
--logfile | \nfilename to output logs (default: none) | \n
$ embark eject-build-config |
Copies Embark’s default webpack.config.js
file into your DApp so that you can customize it. If a file named webpack.config.js
is present in your top-level DApp directory, Embark will use your webpack config file instead of its own.
$ embark blockchain [environment] |
Takes the config at config/blockchain.json
for the environment
specified and starts a blockchain node. If no environment
is provider embark will use development
by default.
If you want, you can skip the step of running embark blockchain
, as embark run
, build
and upload
now all start a blockchain node in a separate process if there is not one already started using the same configurations.
$ embark simulator [environment] |
Takes the config at config/blockchain.json
for the environment
specified and starts a blockchain simulator. If no environment
is provider embark will use development
by default.
Option | \nDescription | \n
---|---|
-p , --port | \nport to run the rpc simulator (default: 8545) | \n
-h , --host | \nhost to run the rpc simulator (default: localhost) | \n
-a , --accounts | \nnum of accounts to start the simulator (default: 10) | \n
-e , --defaultBalanceEther | \nbalance in ether to assign each test account (default: 100) | \n
-l , --gasLimit | \ncustom gasLimit (default: 8000000) | \n
$ embark test [file] |
Runs Tests. If file
is not specified then it will run all the tests inside the test/
directory.
Option | \nDescription | \n
---|---|
-n , --node | \nnode for running the tests (default: vm) | \n
-d , --gasDetails | \nprint the gas cost for each contract deployment when running the tests | \n
-c , --coverage | \ngenerate a coverage report after running the tests (vm only) | \n
The --node
option supports several values:
Value | \nDescription | \n
---|---|
vm | \nstart and use an Ethereum simulator (ganache) | \n
embark | \nuse the node of a running embark process | \n
<endpoint> | \nconnect to and use the specified node | \n
Example of endpoint usage: embark test --node ws://localhost:8556
$ embark reset |
Resets embarks state on this dapp including clearing cache.
\n$ embark upload [platform] [environment] |
Uploads the DApp to a decentralized storage such as IPFS. platform
can be ipfs
or swarm
or another parameter if supported by a plugin. If no environment
is provider embark will use development
by default.
$ embark graph |
Generates documentation based on the smart contracts configured
\n$ embark version |
Displays version information.
\n"},{"title":"Understanding Environments","layout":"docs","_content":"\nEmbark comes with the concept of \"Environments\", which make it easy to switch between different configurations of various parts of our applications that alter how the application is being built and deployed. For example, during development we probably prefer deploying our Smart Contracts on a local blockchain or testnet, until we're sure the code is ready for prime time and can be deployed in a production environment.\n\nIn this guide we'll discuss how to take advantage of environments within various configuration files of our Embark application.\n\n## Default environment\n\nIn our guide covering [application structures](structure.html) in Embark, we've talked about that every component of our decentralized application, such as IPFS as a storage solution and Geth as a blockchain client, can be configured using a dedicated configuration file. We'll dive more into what each configuration looks like in our guides on [configuring Smart Contracts](contracts_configuration.html), [configuring decentralized storages](storage_configuration.html) and [configuring communication channels](messages_configuration.html). For now, we'll focus on the concept of **default environments**.\n\nEnvironments can be defined as part of a configuration file for a dedicated service or component of our application. We can introduce as many environments as we like. It is important to understand that `default` is a special environment that can be **extended** by other environments.\n\nLet's take a look at the `config/contracts.js` file that we've created in the [Quickstart](quick_start.html):\n\n```\nmodule.exports = {\n default: {\n dappConnection: [\n \"$WEB3\",\n \"ws://localhost:8546\",\n \"http://localhost:8545\"\n ],\n gas: \"auto\",\n deploy: {\n SimpleStorage: {\n args: [100]\n }\n }\n }\n}\n```\n\nDon't get too overwhelmed by all the different options and what they mean. We'll discuss those in-depth in [configuring Smart Contracts](contracts_configuration.html) and `dappConneciton` [here](/docs/javascript_usage.html#Using-dappConnection). The important part here is that `contracts.js` exports an object that provides a `default` configuration. This configuration is the default environment and can be overwritten or extended by other environments. \n\nIf we execute `$ embark run`, Embark will use the `default` configuration to deploy our application's Smart Contracts.\n\n## Adding and extending environments\n\nAs mentioned earlier, the `default` environment can be easily extended and overwritten by other configurations. Let's say we had a `custom` environment as well, which should come with the same configuration as `default`, but deploy `SimpleStorage` with a different constructor parameter value. We can do that by simply introducing a configuration for `custom` and specify the options as we need:\n\n```\nmodule.exports = {\n ...\n custom: {\n deploy: {\n SimpleStorage: {\n args: [200]\n }\n }\n }\n}\n```\n\nNow, when running Embark with the `custom` environment as discussed in our guide on [Running applications](/docs/running_apps.html#Switching-environments), Embark will merge the `custom` configuration with `default` and use the resulting configuration object accordingly:\n\n```\n$ embark run custom\n```\n\n{% notification info Quick tip: %}\nNotice that Embark usually already provides an additional `development` configuration. As a matter of fact, when no environment is specified in `embark run`, Embark will use the `development` configuration. \n\nThis means that\n\n$ embark run\n\nis the same as\n\n
$ embark run development\n\n{% endnotification %}\n\nIn the next chapter, we'll take a closer look at how our application can be configured using the `embark.json` configuration file.\n","source":"docs/environments.md","raw":"title: Understanding Environments\nlayout: docs\n---\n\nEmbark comes with the concept of \"Environments\", which make it easy to switch between different configurations of various parts of our applications that alter how the application is being built and deployed. For example, during development we probably prefer deploying our Smart Contracts on a local blockchain or testnet, until we're sure the code is ready for prime time and can be deployed in a production environment.\n\nIn this guide we'll discuss how to take advantage of environments within various configuration files of our Embark application.\n\n## Default environment\n\nIn our guide covering [application structures](structure.html) in Embark, we've talked about that every component of our decentralized application, such as IPFS as a storage solution and Geth as a blockchain client, can be configured using a dedicated configuration file. We'll dive more into what each configuration looks like in our guides on [configuring Smart Contracts](contracts_configuration.html), [configuring decentralized storages](storage_configuration.html) and [configuring communication channels](messages_configuration.html). For now, we'll focus on the concept of **default environments**.\n\nEnvironments can be defined as part of a configuration file for a dedicated service or component of our application. We can introduce as many environments as we like. It is important to understand that `default` is a special environment that can be **extended** by other environments.\n\nLet's take a look at the `config/contracts.js` file that we've created in the [Quickstart](quick_start.html):\n\n```\nmodule.exports = {\n default: {\n dappConnection: [\n \"$WEB3\",\n \"ws://localhost:8546\",\n \"http://localhost:8545\"\n ],\n gas: \"auto\",\n deploy: {\n SimpleStorage: {\n args: [100]\n }\n }\n }\n}\n```\n\nDon't get too overwhelmed by all the different options and what they mean. We'll discuss those in-depth in [configuring Smart Contracts](contracts_configuration.html) and `dappConneciton` [here](/docs/javascript_usage.html#Using-dappConnection). The important part here is that `contracts.js` exports an object that provides a `default` configuration. This configuration is the default environment and can be overwritten or extended by other environments. \n\nIf we execute `$ embark run`, Embark will use the `default` configuration to deploy our application's Smart Contracts.\n\n## Adding and extending environments\n\nAs mentioned earlier, the `default` environment can be easily extended and overwritten by other configurations. Let's say we had a `custom` environment as well, which should come with the same configuration as `default`, but deploy `SimpleStorage` with a different constructor parameter value. We can do that by simply introducing a configuration for `custom` and specify the options as we need:\n\n```\nmodule.exports = {\n ...\n custom: {\n deploy: {\n SimpleStorage: {\n args: [200]\n }\n }\n }\n}\n```\n\nNow, when running Embark with the `custom` environment as discussed in our guide on [Running applications](/docs/running_apps.html#Switching-environments), Embark will merge the `custom` configuration with `default` and use the resulting configuration object accordingly:\n\n```\n$ embark run custom\n```\n\n{% notification info Quick tip: %}\nNotice that Embark usually already provides an additional `development` configuration. As a matter of fact, when no environment is specified in `embark run`, Embark will use the `development` configuration. \n\nThis means that\n\n
$ embark run\n\nis the same as\n\n
$ embark run development\n\n{% endnotification %}\n\nIn the next chapter, we'll take a closer look at how our application can be configured using the `embark.json` configuration file.\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/environments.html","comments":1,"_id":"ck5ijm3rj00147hegebu2ckjy","content":"
Embark comes with the concept of “Environments”, which make it easy to switch between different configurations of various parts of our applications that alter how the application is being built and deployed. For example, during development we probably prefer deploying our Smart Contracts on a local blockchain or testnet, until we’re sure the code is ready for prime time and can be deployed in a production environment.
\nIn this guide we’ll discuss how to take advantage of environments within various configuration files of our Embark application.
\nIn our guide covering application structures in Embark, we’ve talked about that every component of our decentralized application, such as IPFS as a storage solution and Geth as a blockchain client, can be configured using a dedicated configuration file. We’ll dive more into what each configuration looks like in our guides on configuring Smart Contracts, configuring decentralized storages and configuring communication channels. For now, we’ll focus on the concept of default environments.
\nEnvironments can be defined as part of a configuration file for a dedicated service or component of our application. We can introduce as many environments as we like. It is important to understand that default
is a special environment that can be extended by other environments.
Let’s take a look at the config/contracts.js
file that we’ve created in the Quickstart:
module.exports = { |
Don’t get too overwhelmed by all the different options and what they mean. We’ll discuss those in-depth in configuring Smart Contracts and dappConneciton
here. The important part here is that contracts.js
exports an object that provides a default
configuration. This configuration is the default environment and can be overwritten or extended by other environments.
If we execute $ embark run
, Embark will use the default
configuration to deploy our application’s Smart Contracts.
As mentioned earlier, the default
environment can be easily extended and overwritten by other configurations. Let’s say we had a custom
environment as well, which should come with the same configuration as default
, but deploy SimpleStorage
with a different constructor parameter value. We can do that by simply introducing a configuration for custom
and specify the options as we need:
module.exports = { |
Now, when running Embark with the custom
environment as discussed in our guide on Running applications, Embark will merge the custom
configuration with default
and use the resulting configuration object accordingly:
$ embark run custom |
Quick
\nNotice that Embark usually already provides an additional development
configuration. As a matter of fact, when no environment is specified in embark run
, Embark will use the development
configuration.
This means that
\n$ embark run\n\n
is the same as
\n$ embark run development\n\n
In the next chapter, we’ll take a closer look at how our application can be configured using the embark.json
configuration file.
Embark comes with the concept of “Environments”, which make it easy to switch between different configurations of various parts of our applications that alter how the application is being built and deployed. For example, during development we probably prefer deploying our Smart Contracts on a local blockchain or testnet, until we’re sure the code is ready for prime time and can be deployed in a production environment.
\nIn this guide we’ll discuss how to take advantage of environments within various configuration files of our Embark application.
\nIn our guide covering application structures in Embark, we’ve talked about that every component of our decentralized application, such as IPFS as a storage solution and Geth as a blockchain client, can be configured using a dedicated configuration file. We’ll dive more into what each configuration looks like in our guides on configuring Smart Contracts, configuring decentralized storages and configuring communication channels. For now, we’ll focus on the concept of default environments.
\nEnvironments can be defined as part of a configuration file for a dedicated service or component of our application. We can introduce as many environments as we like. It is important to understand that default
is a special environment that can be extended by other environments.
Let’s take a look at the config/contracts.js
file that we’ve created in the Quickstart:
module.exports = { |
Don’t get too overwhelmed by all the different options and what they mean. We’ll discuss those in-depth in configuring Smart Contracts and dappConneciton
here. The important part here is that contracts.js
exports an object that provides a default
configuration. This configuration is the default environment and can be overwritten or extended by other environments.
If we execute $ embark run
, Embark will use the default
configuration to deploy our application’s Smart Contracts.
As mentioned earlier, the default
environment can be easily extended and overwritten by other configurations. Let’s say we had a custom
environment as well, which should come with the same configuration as default
, but deploy SimpleStorage
with a different constructor parameter value. We can do that by simply introducing a configuration for custom
and specify the options as we need:
module.exports = { |
Now, when running Embark with the custom
environment as discussed in our guide on Running applications, Embark will merge the custom
configuration with default
and use the resulting configuration object accordingly:
$ embark run custom |
Quick
\nNotice that Embark usually already provides an additional development
configuration. As a matter of fact, when no environment is specified in embark run
, Embark will use the development
configuration.
This means that
\n$ embark run\n\n
is the same as
\n$ embark run development\n\n
In the next chapter, we’ll take a closer look at how our application can be configured using the embark.json
configuration file.
If you’re new to Embark you probably have a lot questions about what it can do and whether it supports the features you’re looking for. Check out our frequently asked questions and don’t hesitate to let us know if there’s anything missing!
\nEmbark is a developer environment for building, testing, and deploying Smart Contracts, as well as fully decentralized applications — computation (EVM), storage (IPFS, Swarm), and communication (Whisper).
\nWhile Embark does have quite some things in common with tools like Truffle, it goes far beyond managing and deploying Smart Contracts, if you want to. Embark aims to be extensible so you can choose what features make most sense to you when building decentralized apps.
\nWhether you want to purely focus on building and deploying Smart Contracts, or you want to build a static website that should be deployed on IPFS. Or even all of that! The sky is the limit.
\nAbsolutely! Simply create your application using the --contracts-only
option as discussed in our guide on Creating Apps and you’re good to go.
Embark’s configurations make it very easy to switch to a fully featured decentralized application later on, in case you change your mind.
\nYes it can! In fact, Embark comes with ganache-cli and batteries included. Simply run embark simulator
to spin up a simulated blockchain. For more information, check out the dedicated command reference.
Iuri, it is!
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"If you’re new to Embark you probably have a lot questions about what it can do and whether it supports the features you’re looking for. Check out our frequently asked questions and don’t hesitate to let us know if there’s anything missing!
\nEmbark is a developer environment for building, testing, and deploying Smart Contracts, as well as fully decentralized applications — computation (EVM), storage (IPFS, Swarm), and communication (Whisper).
\nWhile Embark does have quite some things in common with tools like Truffle, it goes far beyond managing and deploying Smart Contracts, if you want to. Embark aims to be extensible so you can choose what features make most sense to you when building decentralized apps.
\nWhether you want to purely focus on building and deploying Smart Contracts, or you want to build a static website that should be deployed on IPFS. Or even all of that! The sky is the limit.
\nAbsolutely! Simply create your application using the --contracts-only
option as discussed in our guide on Creating Apps and you’re good to go.
Embark’s configurations make it very easy to switch to a fully featured decentralized application later on, in case you change your mind.
\nYes it can! In fact, Embark comes with ganache-cli and batteries included. Simply run embark simulator
to spin up a simulated blockchain. For more information, check out the dedicated command reference.
Iuri, it is!
\n"},{"title":"docs_landing_page.header.title","layout":"docs-landing","_content":"\n","source":"docs/index.md","raw":"title: docs_landing_page.header.title\nlayout: docs-landing\n---\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/index.html","comments":1,"_id":"ck5ijm3rk00167heg9sji3hx1","content":"","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":""},{"title":"Installation","layout":"docs","_content":"In this guide we'll cover all the different ways of installing Embark on your local machine, starting with prerequisites.\n\n## Prerequisites\n\nIn order to make Embark work on our computer, we need to have some tools installed first. Make sure you have the following ready and in the correct version:\n\n- [Node](#Node)\n- [Ethereum Client](#Ethereum-Client-Optional)\n- [IPFS](#IPFS-Optional)\n\nOnce done, go ahead and [install Embark](#Installing-Embark).\n\n### Node\n\nPlease install [Node.js](http://nodejs.org/) in version 10.17.0 LTS or higher.\n\n{% notification info 'Quick Tip' %}\nWe recommend installing Node using the [Node Version Manager](https://github.com/creationix/nvm/blob/master/README.md). This is because it makes it very easy to install different versions of Node in isolated environments that don't require users to [change their permissions](https://docs.npmjs.com/getting-started/fixing-npm-permissions) when installing packages. Find instructions on how to install NVM [here](https://github.com/creationix/nvm/blob/master/README.md#install-script).\n\nOnce that is done, we can install and select a specific Node version or use the `--lts` option to get the latest version with long term support like this:\n\n$ nvm install --lts\n$ nvm use --lts\n
\n{% endnotification %}\n\n### IPFS (Optional)\n\nIPFS can be used to distribute our application's content on the decentralized IPFS nodes. This can be skipped in case this isn't planned, however we do recommend it. Checkout IPFS' [installation guide](https://docs.ipfs.io/guides/guides/install/) to learn how to install IPFS on our local machine.\n\nTo verify that the installation was successful, simply run the following command:\n\n```\n$ ipfs --version\n```\n\nThis outputs something like\n\n```\n$ ipfs version 0.4.17\n```\n\n### Ethereum Client (Optional)\n\nEmbark can spin up an Ethereum node for us. To make this happen, an Ethereum client has to be installed on our machine as well. Embark already comes with [Ganache CLI](https://truffleframework.com/ganache), a blockchain node emulator, which is accessible via [Embark's simulator](embark_commands.html#simulator) command.\n\nIn case we want to run a real node, [geth](https://geth.ethereum.org/) is a pretty good one. Check out the [installation guide](https://ethereum.github.io/go-ethereum/install/) for our platform and verify our installation with:\n\n```\n$ geth version\n```\n\nWhich should result in an output that looks like this (note that the exact version numbers may be different):\n\n```\nGeth\nVersion: 1.8.15-stable\nGit Commit: 89451f7c382ad2185987ee369f16416f89c28a7d\nArchitecture: amd64\nProtocol Versions: [63 62]\nNetwork Id: 1\nGo Version: go1.10.4\nOperating System: darwin\nGOPATH=\nGOROOT=/Users/travis/.gimme/versions/go1.10.4.darwin.amd64\n```\n\n## Installing Embark\n\nAlright, let's install Embark so we can build our first application. As mentioned earlier, if anything is unclear or you run into problems, make sure to reach out to us on our dedicated channels, [submit an issue on GitHub](https://github.com/embarklabs/embark/issues), or take a look at our [troubleshooting guide](troubleshooting.html).\n\nWe can install Embark using the Node Package Manager (no worries, that one comes with Node), like this:\n\n```\n$ npm -g install embark\n```\n\nAfter that, `embark` should be available as a global command in our terminal of choice. Let's verify this by running the following command:\n\n```\n$ embark --version\n```\n\nAt the time of writing this guide, the output looked like this:\n\n```\n4.0.0\n```\n\nAwesome! We're all set up. If you're brand new to Embark, now would be a good time to take our [Quickstart](/docs/quick_start.html) in which you'll build your first application!\n","source":"docs/installation.md","raw":"title: Installation\nlayout: docs\n---\nIn this guide we'll cover all the different ways of installing Embark on your local machine, starting with prerequisites.\n\n## Prerequisites\n\nIn order to make Embark work on our computer, we need to have some tools installed first. Make sure you have the following ready and in the correct version:\n\n- [Node](#Node)\n- [Ethereum Client](#Ethereum-Client-Optional)\n- [IPFS](#IPFS-Optional)\n\nOnce done, go ahead and [install Embark](#Installing-Embark).\n\n### Node\n\nPlease install [Node.js](http://nodejs.org/) in version 10.17.0 LTS or higher.\n\n{% notification info 'Quick Tip' %}\nWe recommend installing Node using the [Node Version Manager](https://github.com/creationix/nvm/blob/master/README.md). This is because it makes it very easy to install different versions of Node in isolated environments that don't require users to [change their permissions](https://docs.npmjs.com/getting-started/fixing-npm-permissions) when installing packages. Find instructions on how to install NVM [here](https://github.com/creationix/nvm/blob/master/README.md#install-script).\n\nOnce that is done, we can install and select a specific Node version or use the `--lts` option to get the latest version with long term support like this:\n\n$ nvm install --lts\n$ nvm use --lts\n
\n{% endnotification %}\n\n### IPFS (Optional)\n\nIPFS can be used to distribute our application's content on the decentralized IPFS nodes. This can be skipped in case this isn't planned, however we do recommend it. Checkout IPFS' [installation guide](https://docs.ipfs.io/guides/guides/install/) to learn how to install IPFS on our local machine.\n\nTo verify that the installation was successful, simply run the following command:\n\n```\n$ ipfs --version\n```\n\nThis outputs something like\n\n```\n$ ipfs version 0.4.17\n```\n\n### Ethereum Client (Optional)\n\nEmbark can spin up an Ethereum node for us. To make this happen, an Ethereum client has to be installed on our machine as well. Embark already comes with [Ganache CLI](https://truffleframework.com/ganache), a blockchain node emulator, which is accessible via [Embark's simulator](embark_commands.html#simulator) command.\n\nIn case we want to run a real node, [geth](https://geth.ethereum.org/) is a pretty good one. Check out the [installation guide](https://ethereum.github.io/go-ethereum/install/) for our platform and verify our installation with:\n\n```\n$ geth version\n```\n\nWhich should result in an output that looks like this (note that the exact version numbers may be different):\n\n```\nGeth\nVersion: 1.8.15-stable\nGit Commit: 89451f7c382ad2185987ee369f16416f89c28a7d\nArchitecture: amd64\nProtocol Versions: [63 62]\nNetwork Id: 1\nGo Version: go1.10.4\nOperating System: darwin\nGOPATH=\nGOROOT=/Users/travis/.gimme/versions/go1.10.4.darwin.amd64\n```\n\n## Installing Embark\n\nAlright, let's install Embark so we can build our first application. As mentioned earlier, if anything is unclear or you run into problems, make sure to reach out to us on our dedicated channels, [submit an issue on GitHub](https://github.com/embarklabs/embark/issues), or take a look at our [troubleshooting guide](troubleshooting.html).\n\nWe can install Embark using the Node Package Manager (no worries, that one comes with Node), like this:\n\n```\n$ npm -g install embark\n```\n\nAfter that, `embark` should be available as a global command in our terminal of choice. Let's verify this by running the following command:\n\n```\n$ embark --version\n```\n\nAt the time of writing this guide, the output looked like this:\n\n```\n4.0.0\n```\n\nAwesome! We're all set up. If you're brand new to Embark, now would be a good time to take our [Quickstart](/docs/quick_start.html) in which you'll build your first application!\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/installation.html","comments":1,"_id":"ck5ijm3rl00177hegaq8kaid6","content":"In this guide we’ll cover all the different ways of installing Embark on your local machine, starting with prerequisites.
\nIn order to make Embark work on our computer, we need to have some tools installed first. Make sure you have the following ready and in the correct version:
\nOnce done, go ahead and install Embark.
\nPlease install Node.js in version 10.17.0 LTS or higher.
\nQuick Tip
\nWe recommend installing Node using the Node Version Manager. This is because it makes it very easy to install different versions of Node in isolated environments that don’t require users to change their permissions when installing packages. Find instructions on how to install NVM here.
\nOnce that is done, we can install and select a specific Node version or use the --lts
option to get the latest version with long term support like this:
$ nvm install --lts\n$ nvm use --lts\n
\nIPFS can be used to distribute our application’s content on the decentralized IPFS nodes. This can be skipped in case this isn’t planned, however we do recommend it. Checkout IPFS’ installation guide to learn how to install IPFS on our local machine.
\nTo verify that the installation was successful, simply run the following command:
\n$ ipfs --version |
This outputs something like
\n$ ipfs version 0.4.17 |
Embark can spin up an Ethereum node for us. To make this happen, an Ethereum client has to be installed on our machine as well. Embark already comes with Ganache CLI, a blockchain node emulator, which is accessible via Embark’s simulator command.
\nIn case we want to run a real node, geth is a pretty good one. Check out the installation guide for our platform and verify our installation with:
\n$ geth version |
Which should result in an output that looks like this (note that the exact version numbers may be different):
\nGeth |
Alright, let’s install Embark so we can build our first application. As mentioned earlier, if anything is unclear or you run into problems, make sure to reach out to us on our dedicated channels, submit an issue on GitHub, or take a look at our troubleshooting guide.
\nWe can install Embark using the Node Package Manager (no worries, that one comes with Node), like this:
\n$ npm -g install embark |
After that, embark
should be available as a global command in our terminal of choice. Let’s verify this by running the following command:
$ embark --version |
At the time of writing this guide, the output looked like this:
\n4.0.0 |
Awesome! We’re all set up. If you’re brand new to Embark, now would be a good time to take our Quickstart in which you’ll build your first application!
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"In this guide we’ll cover all the different ways of installing Embark on your local machine, starting with prerequisites.
\nIn order to make Embark work on our computer, we need to have some tools installed first. Make sure you have the following ready and in the correct version:
\nOnce done, go ahead and install Embark.
\nPlease install Node.js in version 10.17.0 LTS or higher.
\nQuick Tip
\nWe recommend installing Node using the Node Version Manager. This is because it makes it very easy to install different versions of Node in isolated environments that don’t require users to change their permissions when installing packages. Find instructions on how to install NVM here.
\nOnce that is done, we can install and select a specific Node version or use the --lts
option to get the latest version with long term support like this:
$ nvm install --lts\n$ nvm use --lts\n
\nIPFS can be used to distribute our application’s content on the decentralized IPFS nodes. This can be skipped in case this isn’t planned, however we do recommend it. Checkout IPFS’ installation guide to learn how to install IPFS on our local machine.
\nTo verify that the installation was successful, simply run the following command:
\n$ ipfs --version |
This outputs something like
\n$ ipfs version 0.4.17 |
Embark can spin up an Ethereum node for us. To make this happen, an Ethereum client has to be installed on our machine as well. Embark already comes with Ganache CLI, a blockchain node emulator, which is accessible via Embark’s simulator command.
\nIn case we want to run a real node, geth is a pretty good one. Check out the installation guide for our platform and verify our installation with:
\n$ geth version |
Which should result in an output that looks like this (note that the exact version numbers may be different):
\nGeth |
Alright, let’s install Embark so we can build our first application. As mentioned earlier, if anything is unclear or you run into problems, make sure to reach out to us on our dedicated channels, submit an issue on GitHub, or take a look at our troubleshooting guide.
\nWe can install Embark using the Node Package Manager (no worries, that one comes with Node), like this:
\n$ npm -g install embark |
After that, embark
should be available as a global command in our terminal of choice. Let’s verify this by running the following command:
$ embark --version |
At the time of writing this guide, the output looked like this:
\n4.0.0 |
Awesome! We’re all set up. If you’re brand new to Embark, now would be a good time to take our Quickstart in which you’ll build your first application!
\n"},{"title":"Configuring EmbarkJS","layout":"docs","_content":"\nEmbark includes in your Dapp the EmbarkJS library. This library abstracts different functionalities, so you can easily & quickly build powerful Dapps that leverage different decentralized technologies.\nEmbark will automatically initialize EmbarkJS with the configurations set for your particular environment. You just need to connect it to a blockchain node, like explained [below](#Connecting).\n\n### Connecting\n\nBefore using EmbarkJS and Contract functions, we need to make sure that Embark is connected to a blockchain node.\n\nFor that, EmbarkJS provides the `Blockchain.connect()` function that receives a configuration object.\nLuckily, Embark generates the necessary config by looking at your configuration files and outputs it in its generation folder. The default directory is `embarkArtifacts/`, but you can change that in `embark.json` by changing `generationDir`.\n\nLet's see what that generated config file looks like at `embarkArtifacts/config/blockchain.json`:\n\n```\n{\n \"dappConnection\": [\n \"$WEB3\",\n \"$EMBARK\",\n \"ws://localhost:8546\"\n ],\n \"dappAutoEnable\": true,\n \"warnIfMetamask\": true,\n \"blockchainClient\": \"geth\"\n}\n```\n\n\n#### Connection parameters:\n\n- **dappConnection**: Copied from the contracts config. This is the list of connections Embark will try to connect to in order. For more information, look at [the guide on EmbakJS](/docs/javascript_usage.html#Using-dappConnection).\n- **dappAutoEnable**: Copied from the contracts config. This tells EmbarkJS to either automatically connect to Metamask (or Mist) or wait for the developper (you) to do it.\n - Read more on it [below](#Provider)\n- **warnIfMetamask**: Is true when `isDev` is true in the blockchain config. Will warn you in the console if Metamask is detected, to make sure you connect Metamask correctly to the local node.\n- **blockchainClient**: Copied from the blockchain config. This tells EmbarkJS which blockchain client it is connecting to and it will warn about the different problematic behaviours you could experience.\n\n\n### Utilities\n\nEmbarkJS also includes a `onReady` function. This is very useful to ensure that your Dapp only starts interacting with contracts when the proper connection to web3 has been made and ready to use.\n\n```\nimport EmbarkJS from 'Embark/EmbarkJS';\nimport SimpleStorage from 'Embark/contracts/SimpleStorage';\n\nEmbarkJS.onReady((error) => {\n if (error) {\n console.error('Error while connecting to web3', error);\n return;\n }\n SimpleStorage.methods.set(100).send();\n});\n```\n\n### Provider\n\nAs of [EIP1102](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1102.md), decentralized applications MUST request account access. Embark offers several options on how to implement this.\n\nAn Embark application's Smart Contract configuration file (typically located in `config/contracts.js`) comes with a `dappAutoEnable` property which controls whether or not EmbarkJS should automatically try to request account access:\n```\n...\n // Automatically call `ethereum.enable` if true.\n // If false, the following code must run before sending any transaction: `await EmbarkJS.enableEthereum();`\n // Default value is true.\n // dappAutoEnable: true,\n...\n```\n\n\nBy default, the value of `dappAutoEnable` is true which means that Embark will call `ethereum.enable` for you to request account access when the first page of the dapp is loaded.\n\nIf you want more control, you can set `dappAutoEnable` to false.\nThen, if you want to request account access, you can use the following code:\n\n```\n...\n try {\n const accounts = await EmbarkJS.enableEthereum();\n // access granted\n } catch() {\n // access not granted\n }\n...\n```\n\nThis will request account access and if the user grants access to his accounts, you will be able to make transaction calls.\n\n\n### Components\n\n* [EmbarkJS.Contract](contracts_javascript.html) - To interact with smart contracts. Typically Embark automatically initializes all your deployed contracts with this. uses web3.js 1.2.1\n* [EmbarkJS.Storage](storage_javascript.html) - To interact with the configured decentralized storage. Includes bindings to save & retrieve data, upload & download files, etc..\n* [EmbarkJS.Communication](messages_javascript.html) - To interact with the configured decentralized messages system. Includes bindings to listen to topics and send messages.\n* [EmbarkJS.Names](naming_javascript.html) - To interact with the configured decentralized naming system such as ENS. Includes bindings to look up the address of a domain name as well as retrieve a domain name given an address.\n","source":"docs/installing_embarkjs.md","raw":"title: Configuring EmbarkJS\nlayout: docs\n---\n\nEmbark includes in your Dapp the EmbarkJS library. This library abstracts different functionalities, so you can easily & quickly build powerful Dapps that leverage different decentralized technologies.\nEmbark will automatically initialize EmbarkJS with the configurations set for your particular environment. You just need to connect it to a blockchain node, like explained [below](#Connecting).\n\n### Connecting\n\nBefore using EmbarkJS and Contract functions, we need to make sure that Embark is connected to a blockchain node.\n\nFor that, EmbarkJS provides the `Blockchain.connect()` function that receives a configuration object.\nLuckily, Embark generates the necessary config by looking at your configuration files and outputs it in its generation folder. The default directory is `embarkArtifacts/`, but you can change that in `embark.json` by changing `generationDir`.\n\nLet's see what that generated config file looks like at `embarkArtifacts/config/blockchain.json`:\n\n```\n{\n \"dappConnection\": [\n \"$WEB3\",\n \"$EMBARK\",\n \"ws://localhost:8546\"\n ],\n \"dappAutoEnable\": true,\n \"warnIfMetamask\": true,\n \"blockchainClient\": \"geth\"\n}\n```\n\n\n#### Connection parameters:\n\n- **dappConnection**: Copied from the contracts config. This is the list of connections Embark will try to connect to in order. For more information, look at [the guide on EmbakJS](/docs/javascript_usage.html#Using-dappConnection).\n- **dappAutoEnable**: Copied from the contracts config. This tells EmbarkJS to either automatically connect to Metamask (or Mist) or wait for the developper (you) to do it.\n - Read more on it [below](#Provider)\n- **warnIfMetamask**: Is true when `isDev` is true in the blockchain config. Will warn you in the console if Metamask is detected, to make sure you connect Metamask correctly to the local node.\n- **blockchainClient**: Copied from the blockchain config. This tells EmbarkJS which blockchain client it is connecting to and it will warn about the different problematic behaviours you could experience.\n\n\n### Utilities\n\nEmbarkJS also includes a `onReady` function. This is very useful to ensure that your Dapp only starts interacting with contracts when the proper connection to web3 has been made and ready to use.\n\n```\nimport EmbarkJS from 'Embark/EmbarkJS';\nimport SimpleStorage from 'Embark/contracts/SimpleStorage';\n\nEmbarkJS.onReady((error) => {\n if (error) {\n console.error('Error while connecting to web3', error);\n return;\n }\n SimpleStorage.methods.set(100).send();\n});\n```\n\n### Provider\n\nAs of [EIP1102](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1102.md), decentralized applications MUST request account access. Embark offers several options on how to implement this.\n\nAn Embark application's Smart Contract configuration file (typically located in `config/contracts.js`) comes with a `dappAutoEnable` property which controls whether or not EmbarkJS should automatically try to request account access:\n```\n...\n // Automatically call `ethereum.enable` if true.\n // If false, the following code must run before sending any transaction: `await EmbarkJS.enableEthereum();`\n // Default value is true.\n // dappAutoEnable: true,\n...\n```\n\n\nBy default, the value of `dappAutoEnable` is true which means that Embark will call `ethereum.enable` for you to request account access when the first page of the dapp is loaded.\n\nIf you want more control, you can set `dappAutoEnable` to false.\nThen, if you want to request account access, you can use the following code:\n\n```\n...\n try {\n const accounts = await EmbarkJS.enableEthereum();\n // access granted\n } catch() {\n // access not granted\n }\n...\n```\n\nThis will request account access and if the user grants access to his accounts, you will be able to make transaction calls.\n\n\n### Components\n\n* [EmbarkJS.Contract](contracts_javascript.html) - To interact with smart contracts. Typically Embark automatically initializes all your deployed contracts with this. uses web3.js 1.2.1\n* [EmbarkJS.Storage](storage_javascript.html) - To interact with the configured decentralized storage. Includes bindings to save & retrieve data, upload & download files, etc..\n* [EmbarkJS.Communication](messages_javascript.html) - To interact with the configured decentralized messages system. Includes bindings to listen to topics and send messages.\n* [EmbarkJS.Names](naming_javascript.html) - To interact with the configured decentralized naming system such as ENS. Includes bindings to look up the address of a domain name as well as retrieve a domain name given an address.\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/installing_embarkjs.html","comments":1,"_id":"ck5ijm3rm00187hege76085yd","content":"Embark includes in your Dapp the EmbarkJS library. This library abstracts different functionalities, so you can easily & quickly build powerful Dapps that leverage different decentralized technologies.
Embark will automatically initialize EmbarkJS with the configurations set for your particular environment. You just need to connect it to a blockchain node, like explained below.
Before using EmbarkJS and Contract functions, we need to make sure that Embark is connected to a blockchain node.
\nFor that, EmbarkJS provides the Blockchain.connect()
function that receives a configuration object.
Luckily, Embark generates the necessary config by looking at your configuration files and outputs it in its generation folder. The default directory is embarkArtifacts/
, but you can change that in embark.json
by changing generationDir
.
Let’s see what that generated config file looks like at embarkArtifacts/config/blockchain.json
:
{ |
isDev
is true in the blockchain config. Will warn you in the console if Metamask is detected, to make sure you connect Metamask correctly to the local node.EmbarkJS also includes a onReady
function. This is very useful to ensure that your Dapp only starts interacting with contracts when the proper connection to web3 has been made and ready to use.
import EmbarkJS from 'Embark/EmbarkJS'; |
As of EIP1102, decentralized applications MUST request account access. Embark offers several options on how to implement this.
\nAn Embark application’s Smart Contract configuration file (typically located in config/contracts.js
) comes with a dappAutoEnable
property which controls whether or not EmbarkJS should automatically try to request account access:
... |
By default, the value of dappAutoEnable
is true which means that Embark will call ethereum.enable
for you to request account access when the first page of the dapp is loaded.
If you want more control, you can set dappAutoEnable
to false.
Then, if you want to request account access, you can use the following code:
... |
This will request account access and if the user grants access to his accounts, you will be able to make transaction calls.
\nEmbark includes in your Dapp the EmbarkJS library. This library abstracts different functionalities, so you can easily & quickly build powerful Dapps that leverage different decentralized technologies.
Embark will automatically initialize EmbarkJS with the configurations set for your particular environment. You just need to connect it to a blockchain node, like explained below.
Before using EmbarkJS and Contract functions, we need to make sure that Embark is connected to a blockchain node.
\nFor that, EmbarkJS provides the Blockchain.connect()
function that receives a configuration object.
Luckily, Embark generates the necessary config by looking at your configuration files and outputs it in its generation folder. The default directory is embarkArtifacts/
, but you can change that in embark.json
by changing generationDir
.
Let’s see what that generated config file looks like at embarkArtifacts/config/blockchain.json
:
{ |
isDev
is true in the blockchain config. Will warn you in the console if Metamask is detected, to make sure you connect Metamask correctly to the local node.EmbarkJS also includes a onReady
function. This is very useful to ensure that your Dapp only starts interacting with contracts when the proper connection to web3 has been made and ready to use.
import EmbarkJS from 'Embark/EmbarkJS'; |
As of EIP1102, decentralized applications MUST request account access. Embark offers several options on how to implement this.
\nAn Embark application’s Smart Contract configuration file (typically located in config/contracts.js
) comes with a dappAutoEnable
property which controls whether or not EmbarkJS should automatically try to request account access:
... |
By default, the value of dappAutoEnable
is true which means that Embark will call ethereum.enable
for you to request account access when the first page of the dapp is loaded.
If you want more control, you can set dappAutoEnable
to false.
Then, if you want to request account access, you can use the following code:
... |
This will request account access and if the user grants access to his accounts, you will be able to make transaction calls.
\nEmbark offers a variety of plugins you can choose from and you can even build your own to make Embark work with your tool of choice. Let’s take a look at how to install and configure plugins for Embark.
\nBefore we can install a plugin we need to know which one we want to install first. Finding the right plugin shouldn’t be too hard. Supported Embark plugins are listed on the Plugins page. Sometimes it’s also helpful to search for repositories on GitHub that have an embark-
prefix.
Once we know what plugin we’re interested in, it’s really just a matter of adding them to our existing project. This can be done either by downloading and installing them via a package manager such as npm, or even through simple cloning using Git.
\nThe following command installs a plugin for the solc
compiler:
$ npm install embark-solc --save |
This will also update our projects package.json
as we’re adding the plugin as a project dependency.
After installation, we can configure the plugin. What configuration options exist depends entirely on the plugin but the way how configuration works is always the same.
\nTo configure a plugin, add a dedicated section to your project’s embark.json
file:
... |
Once that is done, check out the available configuration options for your plugin of choice. The embark-solc
plugin allows for configuring whether the plugin should generate binary output or not using the outputBinary
option.
The following code sets activates this feature:
\n... |
Embark offers a variety of plugins you can choose from and you can even build your own to make Embark work with your tool of choice. Let’s take a look at how to install and configure plugins for Embark.
\nBefore we can install a plugin we need to know which one we want to install first. Finding the right plugin shouldn’t be too hard. Supported Embark plugins are listed on the Plugins page. Sometimes it’s also helpful to search for repositories on GitHub that have an embark-
prefix.
Once we know what plugin we’re interested in, it’s really just a matter of adding them to our existing project. This can be done either by downloading and installing them via a package manager such as npm, or even through simple cloning using Git.
\nThe following command installs a plugin for the solc
compiler:
$ npm install embark-solc --save |
This will also update our projects package.json
as we’re adding the plugin as a project dependency.
After installation, we can configure the plugin. What configuration options exist depends entirely on the plugin but the way how configuration works is always the same.
\nTo configure a plugin, add a dedicated section to your project’s embark.json
file:
... |
Once that is done, check out the available configuration options for your plugin of choice. The embark-solc
plugin allows for configuring whether the plugin should generate binary output or not using the outputBinary
option.
The following code sets activates this feature:
\n... |
In order to make decentralized app development as easy as possible, Embark offers a useful companion JavaScript library called EmbarkJS. It comes with many APIs that make your applications connect to decentralized services such as your Smart Contracts or IPFS. This guide gives a brief overview on how to set up EmbarkJS and make it connect to a blockchain node.
\nFirst of all it’s important to understand where EmbarkJS comes from. Whenever embark run
is executed, Embark will generate the EmbarkJS library and put it in the configured generationDir
, as discussed in configuring Embark. This EmbarkJS library is called an artifact and is just one of many other artifacts that Embark generates for later usage.
Other artifacts that Embark generates are:
\nWe’ll discuss these more in this guide.
\nOnce Embark has generated all necessary artifacts, we can start using them when building an application. Artifacts are really just written to disc, so if we want to get hold of any of them, it’s really just a matter of importing them accordingly.
\nThe following code imports EmbarkJS:
\nimport EmbarkJS from './embarkArtifacts/embarkjs'; |
EmbarkJS also includes a onReady
function. This is very useful to ensure that your Dapp only starts interacting with contracts when the proper connection to web3 has been made and ready to use.
import EmbarkJS from 'Embark/EmbarkJS'; |
dappConnection
After reading the section above on EmbarkJS.onReady
, you might be wondering where EmbarkJS establishes a connection.
The answer is: you decide! You can configure it using dappConnection
, a config property you can find in the Smart Contract config (by default at config/contracts.js
).
You will notice that property name reused in some other config files too, like the Storage one, because you can configure where those connect as well.
\nThe expressions used within dappConnection
come with special semantics. Here’s how they work: it is an array of strings where EmbarkJS will try each of those in order (from 0 to N) and as soon as one of the connections work, it will stop.
In the case of the Smart Contract config dappConnection
, the one that is used to connect to the blockchain node and that is indirectly used in EmbarkJS.onReady
, you will see two special entities: $WEB3
and $EMBARK
.
$WEB3
tells EmbarkJS to connect to the browser’s web3 instance. For example, Metamask or Status.$EMBARK
tells EmbarkJS to connect to Embark’s wallet, implemented using a proxy in between the Dapp and the blockchain node.accounts
section$EMBARK
is still useful, because it connects to the node more easily for you and uses the unlocked accounts on the node, like when using the dev
miningMode
If you want, you can also put a valid node URL in the dappConnection
array. In that case, EmbarkJS will connect directly to the node, without using Embark’s proxy.
It is, however, not recommended as you lose some of Embark’s features, like the transaction logger.
If you want to use an external node, like Infura, we instead recommend to set it in the Blockchain config (config/blockchain.js
) using the property endpoint
.
Then, using $EMBARK
will use Embark’s proxy, which in part will be connected to that endpoint.
As of EIP1102, decentralized applications MUST request access to a DApp’s user accounts. Embark offers several options on how to implement this.
\nAn Embark application’s Smart Contract configuration file (typically located in config/contracts.js
) comes with a dappAutoEnable
property which controls whether or not EmbarkJS should automatically try to request account access:
module.exports = { |
By default, the value of dappAutoEnable
is true
which means that Embark will call ethereum.enable
for us to request account access when the first page of the DApp is loaded.
If we want more control over when our application should request account access, we can set dappAutoEnable
to false and make use of EmbarkJS.enableEthereum()
.
This method will essentially cause our application to request account access, giving us full control over when this should happen.
\ntry { |
This guide only touched on getting started with EmbarkJS. There are many more APIs to explore, depending on what we’re achieving to build. Have a look at the dedicated guides to learn more:
\nIn order to make decentralized app development as easy as possible, Embark offers a useful companion JavaScript library called EmbarkJS. It comes with many APIs that make your applications connect to decentralized services such as your Smart Contracts or IPFS. This guide gives a brief overview on how to set up EmbarkJS and make it connect to a blockchain node.
\nFirst of all it’s important to understand where EmbarkJS comes from. Whenever embark run
is executed, Embark will generate the EmbarkJS library and put it in the configured generationDir
, as discussed in configuring Embark. This EmbarkJS library is called an artifact and is just one of many other artifacts that Embark generates for later usage.
Other artifacts that Embark generates are:
\nWe’ll discuss these more in this guide.
\nOnce Embark has generated all necessary artifacts, we can start using them when building an application. Artifacts are really just written to disc, so if we want to get hold of any of them, it’s really just a matter of importing them accordingly.
\nThe following code imports EmbarkJS:
\nimport EmbarkJS from './embarkArtifacts/embarkjs'; |
EmbarkJS also includes a onReady
function. This is very useful to ensure that your Dapp only starts interacting with contracts when the proper connection to web3 has been made and ready to use.
import EmbarkJS from 'Embark/EmbarkJS'; |
dappConnection
After reading the section above on EmbarkJS.onReady
, you might be wondering where EmbarkJS establishes a connection.
The answer is: you decide! You can configure it using dappConnection
, a config property you can find in the Smart Contract config (by default at config/contracts.js
).
You will notice that property name reused in some other config files too, like the Storage one, because you can configure where those connect as well.
\nThe expressions used within dappConnection
come with special semantics. Here’s how they work: it is an array of strings where EmbarkJS will try each of those in order (from 0 to N) and as soon as one of the connections work, it will stop.
In the case of the Smart Contract config dappConnection
, the one that is used to connect to the blockchain node and that is indirectly used in EmbarkJS.onReady
, you will see two special entities: $WEB3
and $EMBARK
.
$WEB3
tells EmbarkJS to connect to the browser’s web3 instance. For example, Metamask or Status.$EMBARK
tells EmbarkJS to connect to Embark’s wallet, implemented using a proxy in between the Dapp and the blockchain node.accounts
section$EMBARK
is still useful, because it connects to the node more easily for you and uses the unlocked accounts on the node, like when using the dev
miningMode
If you want, you can also put a valid node URL in the dappConnection
array. In that case, EmbarkJS will connect directly to the node, without using Embark’s proxy.
It is, however, not recommended as you lose some of Embark’s features, like the transaction logger.
If you want to use an external node, like Infura, we instead recommend to set it in the Blockchain config (config/blockchain.js
) using the property endpoint
.
Then, using $EMBARK
will use Embark’s proxy, which in part will be connected to that endpoint.
As of EIP1102, decentralized applications MUST request access to a DApp’s user accounts. Embark offers several options on how to implement this.
\nAn Embark application’s Smart Contract configuration file (typically located in config/contracts.js
) comes with a dappAutoEnable
property which controls whether or not EmbarkJS should automatically try to request account access:
module.exports = { |
By default, the value of dappAutoEnable
is true
which means that Embark will call ethereum.enable
for us to request account access when the first page of the DApp is loaded.
If we want more control over when our application should request account access, we can set dappAutoEnable
to false and make use of EmbarkJS.enableEthereum()
.
This method will essentially cause our application to request account access, giving us full control over when this should happen.
\ntry { |
This guide only touched on getting started with EmbarkJS. There are many more APIs to explore, depending on what we’re achieving to build. Have a look at the dedicated guides to learn more:
\nWith Embark it’s very easy to connect to messaging channels using Whisper. In this guide we’ll discuss how to set everything up to add messaging support to our applications.
\nBy default, Embark will check our preferred communication configuration in the file config/communication.js
. This file contains the preferred configuration for each environment, with default
being the configuration that applies to every environment (for more information about environments, check out this guide. Each of these options can be individually overridden on a per environment basis.
Here’s an example configuration:
\nmodule.exports = { |
Available options:
\nOption | \nType: default | \nValue | \n
---|---|---|
enabled | \nboolean: true/false | \nTo enable or completely disable communication support | \n
provider | \nstring: whisper | \nDesired provider to automatically connect to in the dapp. | \n
available_providers | \narray: ["whisper"] | \nList of communication platforms to be supported in the dapp. This will affect what’s available with the EmbarkJS library in the dapp so if you don’t need Whisper for example, removing it from this will considerably reduce the file size of the generated JS code. | \n
With Embark it’s very easy to connect to messaging channels using Whisper. In this guide we’ll discuss how to set everything up to add messaging support to our applications.
\nBy default, Embark will check our preferred communication configuration in the file config/communication.js
. This file contains the preferred configuration for each environment, with default
being the configuration that applies to every environment (for more information about environments, check out this guide. Each of these options can be individually overridden on a per environment basis.
Here’s an example configuration:
\nmodule.exports = { |
Available options:
\nOption | \nType: default | \nValue | \n
---|---|---|
enabled | \nboolean: true/false | \nTo enable or completely disable communication support | \n
provider | \nstring: whisper | \nDesired provider to automatically connect to in the dapp. | \n
available_providers | \narray: ["whisper"] | \nList of communication platforms to be supported in the dapp. This will affect what’s available with the EmbarkJS library in the dapp so if you don’t need Whisper for example, removing it from this will considerably reduce the file size of the generated JS code. | \n
Embark’s companion library EmbarkJS comes with some convenient APIs to easily subscribe to and sending messages using messages protocols like Whisper. In this guide we’ll take a closer look how this works.
\nMake sure to read our guide in using EmbarkJS first.
\nBy default Embark will initialize EmbarkJS with the provider configured at config/communication.js
. However if we are using EmbarkJS directly or wish to change the provider configuration at runtime, we can do so using the setProvider()
method:
EmbarkJS.Messages.setProvider('whisper') |
We can subscribe to channels using the listenTo()
method by specifying a list of channel topics like this:
EmbarkJS.Messages.listenTo({ |
listenTo()
returns an Observable that we can subscribe to. Observables work great if multiple values can be emitted over time, which is exactly the case for messages being emitted with Whisper. In other words, this is a long-living Observable, so it’s important to unsubscribe from it once we’re no longer interested in the data. Otherwise we’ll introduce memory leaks.
Sending messages can be done using the sendMessage()
method and it’s entirely up to use whether we want to send plain text messages or even objects.
Here’s how to send a plain text message to the sometopic
topic:
EmbarkJS.Messages.sendMessage({ |
And this code snippet shows how to send an object structure:
\nEmbarkJS.Messages.sendMessage({ |
Notice that a topic/channel name has to be at least 4 characters long. Whisper will otherwise emit an error on the subscription.
\nOn topic arrays:
\nArray of topics are considered an AND. In Whisper you can use another array for OR combinations of several topics e.g ["topic1", ["topic2", "topic3"]]
=> topic1 AND (topic2 OR topic 3)
.
Embark’s companion library EmbarkJS comes with some convenient APIs to easily subscribe to and sending messages using messages protocols like Whisper. In this guide we’ll take a closer look how this works.
\nMake sure to read our guide in using EmbarkJS first.
\nBy default Embark will initialize EmbarkJS with the provider configured at config/communication.js
. However if we are using EmbarkJS directly or wish to change the provider configuration at runtime, we can do so using the setProvider()
method:
EmbarkJS.Messages.setProvider('whisper') |
We can subscribe to channels using the listenTo()
method by specifying a list of channel topics like this:
EmbarkJS.Messages.listenTo({ |
listenTo()
returns an Observable that we can subscribe to. Observables work great if multiple values can be emitted over time, which is exactly the case for messages being emitted with Whisper. In other words, this is a long-living Observable, so it’s important to unsubscribe from it once we’re no longer interested in the data. Otherwise we’ll introduce memory leaks.
Sending messages can be done using the sendMessage()
method and it’s entirely up to use whether we want to send plain text messages or even objects.
Here’s how to send a plain text message to the sometopic
topic:
EmbarkJS.Messages.sendMessage({ |
And this code snippet shows how to send an object structure:
\nEmbarkJS.Messages.sendMessage({ |
Notice that a topic/channel name has to be at least 4 characters long. Whisper will otherwise emit an error on the subscription.
\nOn topic arrays:
\nArray of topics are considered an AND. In Whisper you can use another array for OR combinations of several topics e.g ["topic1", ["topic2", "topic3"]]
=> topic1 AND (topic2 OR topic 3)
.
With the release of version 4, Embark has introduced a few breaking changes that require developers to take action, if they plan to upgrade.
\nIn this guide we’ll discuss the few steps to take a project from Embark 3.2.x to 4.x.
\nIn order to take an existing Embark 3.2.x project to version 4.x, the following steps are required:
\ngenerationDir
to the project’s embark.json
Let’s walk through them step by step!
\ngenerationDir
to embark.json
Since version 4, Embark generates project specific artifacts. We need to tell Embark where to generate those artifacts. For new projects, this is not a problem as Embark will create the necessary configuration. However, for existing projects, we’ll have to add a generationDir
property to our project’s embark.json
file.
... |
The value of generationDir
is the name of the folder in which we want Embark to generate artifacts. For new projects, artifacts
is the default.
Before version 4, EmbarkJS provided a couple of “magic” imports for applications that made it very convenient to get access to EmbarkJS itself, as well as Smart Contract instances.
\nThe EmbarkJS library as well as Smart Contract instances will now be generated artifacts, meaning we’ll have to update our imports to point to the right location.
\nFor EmbarkJS, replace this import:
\nimport EmbarkJS from 'Embark/EmbarkJS'; |
with
\nimport EmbarkJS from './artifacts/embarkjs'; |
Attention!
\nNotice that the import path has to match the path we’ve specified in generationDir
earlier.
For Smart Contract instances, replace:
\nimport CONTRACT_NAME from 'Embark/contracts/CONTRACT_NAME'; |
with
\nimport CONTRACT_NAME from './artifacts/contracts/CONTRACT_NAME'; |
Prior to version 4, EmbarkJS exported a Web3 instance as well. This is no longer the case as it caused a lot of compatibility issues with different Web3 versions. Please rely on the globally available Web3 instance instead.
\nRemove the following import from your application:
\nimport web3 from 'Embark/web3'; |
Embark 4 adds some new blockchain account configurations. To try to keep things as simple as possible, these additions are really similar to the ones in the Smart Contract configuration. For more information, please read the Accounts Blockchain configuration guide in our docs.
\nHowever, we did introduce some small breaking changes. We removed:
\nnodeAccounts
account type as described in the docsSummary:
\ncontracts
renamed deploy
to match beforeDeploy
and afterDeploy
and for testsminingMode: 'dev'
miningMode: 'auto'
client
endpoint
parameter that let’s you connect to an external endpoint or configure more easily which local endpoint to start Sourcetest
environmenttest
and default
so no need to rewrite all the provider configsdeployement
section removedblockchain
sectioncontracts
renamed deploy
and put inside the contracts
sectionWith the release of version 4, Embark has introduced a few breaking changes that require developers to take action, if they plan to upgrade.
\nIn this guide we’ll discuss the few steps to take a project from Embark 3.2.x to 4.x.
\nIn order to take an existing Embark 3.2.x project to version 4.x, the following steps are required:
\ngenerationDir
to the project’s embark.json
Let’s walk through them step by step!
\ngenerationDir
to embark.json
Since version 4, Embark generates project specific artifacts. We need to tell Embark where to generate those artifacts. For new projects, this is not a problem as Embark will create the necessary configuration. However, for existing projects, we’ll have to add a generationDir
property to our project’s embark.json
file.
... |
The value of generationDir
is the name of the folder in which we want Embark to generate artifacts. For new projects, artifacts
is the default.
Before version 4, EmbarkJS provided a couple of “magic” imports for applications that made it very convenient to get access to EmbarkJS itself, as well as Smart Contract instances.
\nThe EmbarkJS library as well as Smart Contract instances will now be generated artifacts, meaning we’ll have to update our imports to point to the right location.
\nFor EmbarkJS, replace this import:
\nimport EmbarkJS from 'Embark/EmbarkJS'; |
with
\nimport EmbarkJS from './artifacts/embarkjs'; |
Attention!
\nNotice that the import path has to match the path we’ve specified in generationDir
earlier.
For Smart Contract instances, replace:
\nimport CONTRACT_NAME from 'Embark/contracts/CONTRACT_NAME'; |
with
\nimport CONTRACT_NAME from './artifacts/contracts/CONTRACT_NAME'; |
Prior to version 4, EmbarkJS exported a Web3 instance as well. This is no longer the case as it caused a lot of compatibility issues with different Web3 versions. Please rely on the globally available Web3 instance instead.
\nRemove the following import from your application:
\nimport web3 from 'Embark/web3'; |
Embark 4 adds some new blockchain account configurations. To try to keep things as simple as possible, these additions are really similar to the ones in the Smart Contract configuration. For more information, please read the Accounts Blockchain configuration guide in our docs.
\nHowever, we did introduce some small breaking changes. We removed:
\nnodeAccounts
account type as described in the docsSummary:
\ncontracts
renamed deploy
to match beforeDeploy
and afterDeploy
and for testsminingMode: 'dev'
miningMode: 'auto'
client
endpoint
parameter that let’s you connect to an external endpoint or configure more easily which local endpoint to start Sourcetest
environmenttest
and default
so no need to rewrite all the provider configsdeployement
section removedblockchain
sectioncontracts
renamed deploy
and put inside the contracts
sectionWe can configure different naming systems in Embark. In this guide we’ll explore how this is done using the Ethereum Name Service.
\nEmbark checks our configuration in config/namesystem.js
by default. A naming system configuration isn’t crucial to run Embark, so this only needs to be enabled when planing to use a naming system.
When using ENS as our provider, we can set the register
section to pre-register sub-domains. This feature is only available in the development environment:
module.exports = { |
We can configure different naming systems in Embark. In this guide we’ll explore how this is done using the Ethereum Name Service.
\nEmbark checks our configuration in config/namesystem.js
by default. A naming system configuration isn’t crucial to run Embark, so this only needs to be enabled when planing to use a naming system.
When using ENS as our provider, we can set the register
section to pre-register sub-domains. This feature is only available in the development environment:
module.exports = { |
In order to improve the user experience of decentralized applications that deal with smart contracts or Ethereum addresses in general, it’s a good practice to take advantage of the Ethereum Name Service and its registered, human-readable names. Embark provides APIs to either resolve a given domain to its corresponding address, or lookup a registered name by a given address.
\nLet’s take a look at how this is done.
\nResolving a domain to its corresponding address is done by calling EmbarkJS.Names.resolve()
, which takes the domain in question as first argument and a callback function that has access to the resolved address as a second argument:
EmbarkJS.Names.resolve('ethereum.eth', (err, result) => { |
If you prefer using Promises, Embark has got you covered! EmbarkJS.Names.resolve()
returns a promise that resolves with the corresponding address, or an error message in case the given domain doesn’t resolve to an address:
EmbarkJS.Names.resolve("ethereum.eth").then(address => { |
Similar to resolving addresses, looking up domains is really just a matter of calling EmbarkJS.Names.lookup
, which takes an address as argument. Just like EmbarkJS.Names.resolve
, a callback can be used to get notified whether the lookup was successful or not:
EmbarkJS.Names.lookup("0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359", (err, name) => { |
Guess what, EmbarkJS.Names.lookup()
also returns a Promise in case you prefer using those over callbacks:
EmbarkJS.Names.lookup("0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359").then(name => { |
This enables you to register some others sub-domains. This is mostly for demo purposes as it is only available in development.
\nEmbarkJS.Names.registerSubDomain('newsubdomain', '0x4a17f35f0a9927fb4141aa91cbbc72c1b31598de', (err, transaction) => { |
In order to improve the user experience of decentralized applications that deal with smart contracts or Ethereum addresses in general, it’s a good practice to take advantage of the Ethereum Name Service and its registered, human-readable names. Embark provides APIs to either resolve a given domain to its corresponding address, or lookup a registered name by a given address.
\nLet’s take a look at how this is done.
\nResolving a domain to its corresponding address is done by calling EmbarkJS.Names.resolve()
, which takes the domain in question as first argument and a callback function that has access to the resolved address as a second argument:
EmbarkJS.Names.resolve('ethereum.eth', (err, result) => { |
If you prefer using Promises, Embark has got you covered! EmbarkJS.Names.resolve()
returns a promise that resolves with the corresponding address, or an error message in case the given domain doesn’t resolve to an address:
EmbarkJS.Names.resolve("ethereum.eth").then(address => { |
Similar to resolving addresses, looking up domains is really just a matter of calling EmbarkJS.Names.lookup
, which takes an address as argument. Just like EmbarkJS.Names.resolve
, a callback can be used to get notified whether the lookup was successful or not:
EmbarkJS.Names.lookup("0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359", (err, name) => { |
Guess what, EmbarkJS.Names.lookup()
also returns a Promise in case you prefer using those over callbacks:
EmbarkJS.Names.lookup("0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359").then(name => { |
This enables you to register some others sub-domains. This is mostly for demo purposes as it is only available in development.
\nEmbarkJS.Names.registerSubDomain('newsubdomain', '0x4a17f35f0a9927fb4141aa91cbbc72c1b31598de', (err, transaction) => { |
Welcome to the Embark documentation! The following guides will help you guiding your way through your journey of building decentralized applications. If you encounter any problems when using Embark, or find anything unclear described here, please have a look at the troubleshooting guide, raise an issue on GitHub or ask in the Gitter Chatroom respectively.
\nMigrating from 3.2.x
\nIf you’re planning to upgrade your Embark 3.2.x application to 4.x, head over to our Migration Guide.
\n\nEmbark is a fast, easy to use, and powerful developer environment to build and deploy decentralized applications, also known as “DApps”. It integrates with Ethereum blockchains, decentralized storages like IPFS and Swarm, and decentralized communication platforms like Whisper.
\nEmbark’s goal is to make building decentralized applications as easy as possible, by providing all the tools needed and staying extensible at the same time.
\nSome of Embark’s features, but not all of them, are:
\nThere’s so much more, but let’s take it one step at a time. Make sure to check out our other guides in case you’re looking for a particular feature.
\nIf you haven’t yet, this is a good time to install Embark on your machine. Read on for more information!
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Welcome to the Embark documentation! The following guides will help you guiding your way through your journey of building decentralized applications. If you encounter any problems when using Embark, or find anything unclear described here, please have a look at the troubleshooting guide, raise an issue on GitHub or ask in the Gitter Chatroom respectively.
\nMigrating from 3.2.x
\nIf you’re planning to upgrade your Embark 3.2.x application to 4.x, head over to our Migration Guide.
\n\nEmbark is a fast, easy to use, and powerful developer environment to build and deploy decentralized applications, also known as “DApps”. It integrates with Ethereum blockchains, decentralized storages like IPFS and Swarm, and decentralized communication platforms like Whisper.
\nEmbark’s goal is to make building decentralized applications as easy as possible, by providing all the tools needed and staying extensible at the same time.
\nSome of Embark’s features, but not all of them, are:
\nThere’s so much more, but let’s take it one step at a time. Make sure to check out our other guides in case you’re looking for a particular feature.
\nIf you haven’t yet, this is a good time to install Embark on your machine. Read on for more information!
\n"},{"title":"Building & Asset Pipeline","layout":"docs","_content":"\nAs discussed in [Running Apps](running_apps.html#Using-the-run-command), Embark takes care of quite a few things developing applications, including compiling Smart Contracts, JavaScript and other assets. In this guide we'll learn how to take full advantage of Embark's flexibility to build our Smart Contracts or even replace the entire build pipeline for our application's assets.\n\n## Building your app\n\nEmbark's `build` command enables us to build our decentralized application and deploy it accordingly. Similar to `embark run`, it compiles our Smart Contracts, deploys them to a blockchain network that our app is connected to, processes our app's assets and uploads them to the configured decentralized storage (e.g. IPFS).\n\nBy default, `embark build` will use the `production` mode to build our application.\n\n```\n$ embark build\n```\n### Specifying a mode using `--pipeline`\n\n\nEmbark comes with two modes for building our application:\n\n* **development** - This mode is for development purposes and produces sourcemaps as well as unoptimized client-side code. Whenever we use `embark run` or `embark console`, this mode is used by default. Since this mode skips code optimizations, it's also the faster mode.\n* **production** - Unsurprisingly, this mode is used to create production artifacts of our application. It produces optimized code and therefore, takes longer to build. However, client-side code will be highly optimized, thus smaller in file size. This mode is the default for `embark build` and `embark upload` commands.\n\nWe can specify a mode using the `--pipeline` option. This is available for both, `embark run` and `embark build` commands:\n\n```\n$ embark build --pipeline development\n```\n\n## Compiling Smart Contracts only\n\nIf we're building a [Smart Contract only application](http://localhost:4000/docs/create_project.html#Creating-%E2%80%9Ccontracts-only%E2%80%9D-apps), or we're simply not interested in building the entire application and deploying it, but just want to compile our Smart Contracts, we can use the `build` command's `--contracts` option:\n\n```\n$ embark build --contracts\n```\n\n## Understanding the build pipeline\n\nEmbark uses [webpack](https://webpack.js.org/) to bundle and postprocess all kinds of assets of our decentralized application. This also includes things like:\n\n* ES2015+ syntax using Babel\n* Importing of CSS, SCSS, PNG, SVG & Fonts in JavaScript\n* Support for React & JSX\n* Automatic support for older browsers via Babel's preset-env (by default, Embark uses a browser list setting of `['last 1 version', 'not dead', '> 0.2%']`\n* Sourcemaps generation (when in development mode)\n* Minification and tree shaking (when in production mode)\n\n{% notification danger 'Deprecation warning:' %}\nSince Embark version 4.0.0 it's possible (and recommended) to use Embark in combination with other front-end tooling, such as Angular CLI, Vue CLI or Create React App, making Embark's own build pipeline obsolete.\n\nWhen using Embark with any other existing front-end tooling, please turn off Embark's internal build pipeline by setting the following configuration option in `config/pipeline.js`:\n\n\nenabled: false\n\n{% endnotification %}\n\n\n\n### Customizing the build process\n\nSometimes we run into scenarios where our setup is so specific that the build process for our application needs further customization. For those cases, where Embark's built-in build pipeline isn't enough, it enables us to \"eject\" the internally used `webpack.config.js` file, so we can change it to our needs and fully bypass Embark's internal build process.\n\nEjecting the internally used config file is as simple as using Embark's `eject-build-config` command like this:\n\n```\n$ embark eject-build-config\n```\n\n{% notification info 'On --eject-webpack option' %}\nIn older versions of Embark, the same could be achieved using the `--eject-webpack` option. This option still works, but is now considered deprecated and will be removed in future versions of Embark.\n{% endnotification %}\n\n{% notification danger 'Deprecation warning:' %}\nAs mentioned earlier in this guide, we recommend using existing front-end tooling for building and optimizing your application's front-end code. This command will be deprecated in future versions of Embark.\n{% endnotification %}\n\n","source":"docs/pipeline_and_webpack.md","raw":"title: Building & Asset Pipeline\nlayout: docs\n---\n\nAs discussed in [Running Apps](running_apps.html#Using-the-run-command), Embark takes care of quite a few things developing applications, including compiling Smart Contracts, JavaScript and other assets. In this guide we'll learn how to take full advantage of Embark's flexibility to build our Smart Contracts or even replace the entire build pipeline for our application's assets.\n\n## Building your app\n\nEmbark's `build` command enables us to build our decentralized application and deploy it accordingly. Similar to `embark run`, it compiles our Smart Contracts, deploys them to a blockchain network that our app is connected to, processes our app's assets and uploads them to the configured decentralized storage (e.g. IPFS).\n\nBy default, `embark build` will use the `production` mode to build our application.\n\n```\n$ embark build\n```\n### Specifying a mode using `--pipeline`\n\n\nEmbark comes with two modes for building our application:\n\n* **development** - This mode is for development purposes and produces sourcemaps as well as unoptimized client-side code. Whenever we use `embark run` or `embark console`, this mode is used by default. Since this mode skips code optimizations, it's also the faster mode.\n* **production** - Unsurprisingly, this mode is used to create production artifacts of our application. It produces optimized code and therefore, takes longer to build. However, client-side code will be highly optimized, thus smaller in file size. This mode is the default for `embark build` and `embark upload` commands.\n\nWe can specify a mode using the `--pipeline` option. This is available for both, `embark run` and `embark build` commands:\n\n```\n$ embark build --pipeline development\n```\n\n## Compiling Smart Contracts only\n\nIf we're building a [Smart Contract only application](http://localhost:4000/docs/create_project.html#Creating-%E2%80%9Ccontracts-only%E2%80%9D-apps), or we're simply not interested in building the entire application and deploying it, but just want to compile our Smart Contracts, we can use the `build` command's `--contracts` option:\n\n```\n$ embark build --contracts\n```\n\n## Understanding the build pipeline\n\nEmbark uses [webpack](https://webpack.js.org/) to bundle and postprocess all kinds of assets of our decentralized application. This also includes things like:\n\n* ES2015+ syntax using Babel\n* Importing of CSS, SCSS, PNG, SVG & Fonts in JavaScript\n* Support for React & JSX\n* Automatic support for older browsers via Babel's preset-env (by default, Embark uses a browser list setting of `['last 1 version', 'not dead', '> 0.2%']`\n* Sourcemaps generation (when in development mode)\n* Minification and tree shaking (when in production mode)\n\n{% notification danger 'Deprecation warning:' %}\nSince Embark version 4.0.0 it's possible (and recommended) to use Embark in combination with other front-end tooling, such as Angular CLI, Vue CLI or Create React App, making Embark's own build pipeline obsolete.\n\nWhen using Embark with any other existing front-end tooling, please turn off Embark's internal build pipeline by setting the following configuration option in `config/pipeline.js`:\n\n
\nenabled: false\n\n{% endnotification %}\n\n\n\n### Customizing the build process\n\nSometimes we run into scenarios where our setup is so specific that the build process for our application needs further customization. For those cases, where Embark's built-in build pipeline isn't enough, it enables us to \"eject\" the internally used `webpack.config.js` file, so we can change it to our needs and fully bypass Embark's internal build process.\n\nEjecting the internally used config file is as simple as using Embark's `eject-build-config` command like this:\n\n```\n$ embark eject-build-config\n```\n\n{% notification info 'On --eject-webpack option' %}\nIn older versions of Embark, the same could be achieved using the `--eject-webpack` option. This option still works, but is now considered deprecated and will be removed in future versions of Embark.\n{% endnotification %}\n\n{% notification danger 'Deprecation warning:' %}\nAs mentioned earlier in this guide, we recommend using existing front-end tooling for building and optimizing your application's front-end code. This command will be deprecated in future versions of Embark.\n{% endnotification %}\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/pipeline_and_webpack.html","comments":1,"_id":"ck5ijm3rs001h7heg90dngw8a","content":"
As discussed in Running Apps, Embark takes care of quite a few things developing applications, including compiling Smart Contracts, JavaScript and other assets. In this guide we’ll learn how to take full advantage of Embark’s flexibility to build our Smart Contracts or even replace the entire build pipeline for our application’s assets.
\nEmbark’s build
command enables us to build our decentralized application and deploy it accordingly. Similar to embark run
, it compiles our Smart Contracts, deploys them to a blockchain network that our app is connected to, processes our app’s assets and uploads them to the configured decentralized storage (e.g. IPFS).
By default, embark build
will use the production
mode to build our application.
$ embark build |
--pipeline
Embark comes with two modes for building our application:
\nembark run
or embark console
, this mode is used by default. Since this mode skips code optimizations, it’s also the faster mode.embark build
and embark upload
commands.We can specify a mode using the --pipeline
option. This is available for both, embark run
and embark build
commands:
$ embark build --pipeline development |
If we’re building a Smart Contract only application, or we’re simply not interested in building the entire application and deploying it, but just want to compile our Smart Contracts, we can use the build
command’s --contracts
option:
$ embark build --contracts |
Embark uses webpack to bundle and postprocess all kinds of assets of our decentralized application. This also includes things like:
\n['last 1 version', 'not dead', '> 0.2%']
Deprecation warning:
\nSince Embark version 4.0.0 it’s possible (and recommended) to use Embark in combination with other front-end tooling, such as Angular CLI, Vue CLI or Create React App, making Embark’s own build pipeline obsolete.
\nWhen using Embark with any other existing front-end tooling, please turn off Embark’s internal build pipeline by setting the following configuration option in config/pipeline.js
:
\nenabled: false\n\n
Sometimes we run into scenarios where our setup is so specific that the build process for our application needs further customization. For those cases, where Embark’s built-in build pipeline isn’t enough, it enables us to “eject” the internally used webpack.config.js
file, so we can change it to our needs and fully bypass Embark’s internal build process.
Ejecting the internally used config file is as simple as using Embark’s eject-build-config
command like this:
$ embark eject-build-config |
On --eject-webpack option
\nIn older versions of Embark, the same could be achieved using the --eject-webpack
option. This option still works, but is now considered deprecated and will be removed in future versions of Embark.
Deprecation warning:
\nAs mentioned earlier in this guide, we recommend using existing front-end tooling for building and optimizing your application’s front-end code. This command will be deprecated in future versions of Embark.
\n\nAs discussed in Running Apps, Embark takes care of quite a few things developing applications, including compiling Smart Contracts, JavaScript and other assets. In this guide we’ll learn how to take full advantage of Embark’s flexibility to build our Smart Contracts or even replace the entire build pipeline for our application’s assets.
\nEmbark’s build
command enables us to build our decentralized application and deploy it accordingly. Similar to embark run
, it compiles our Smart Contracts, deploys them to a blockchain network that our app is connected to, processes our app’s assets and uploads them to the configured decentralized storage (e.g. IPFS).
By default, embark build
will use the production
mode to build our application.
$ embark build |
--pipeline
Embark comes with two modes for building our application:
\nembark run
or embark console
, this mode is used by default. Since this mode skips code optimizations, it’s also the faster mode.embark build
and embark upload
commands.We can specify a mode using the --pipeline
option. This is available for both, embark run
and embark build
commands:
$ embark build --pipeline development |
If we’re building a Smart Contract only application, or we’re simply not interested in building the entire application and deploying it, but just want to compile our Smart Contracts, we can use the build
command’s --contracts
option:
$ embark build --contracts |
Embark uses webpack to bundle and postprocess all kinds of assets of our decentralized application. This also includes things like:
\n['last 1 version', 'not dead', '> 0.2%']
Deprecation warning:
\nSince Embark version 4.0.0 it’s possible (and recommended) to use Embark in combination with other front-end tooling, such as Angular CLI, Vue CLI or Create React App, making Embark’s own build pipeline obsolete.
\nWhen using Embark with any other existing front-end tooling, please turn off Embark’s internal build pipeline by setting the following configuration option in config/pipeline.js
:
\nenabled: false\n\n
Sometimes we run into scenarios where our setup is so specific that the build process for our application needs further customization. For those cases, where Embark’s built-in build pipeline isn’t enough, it enables us to “eject” the internally used webpack.config.js
file, so we can change it to our needs and fully bypass Embark’s internal build process.
Ejecting the internally used config file is as simple as using Embark’s eject-build-config
command like this:
$ embark eject-build-config |
On --eject-webpack option
\nIn older versions of Embark, the same could be achieved using the --eject-webpack
option. This option still works, but is now considered deprecated and will be removed in future versions of Embark.
Deprecation warning:
\nAs mentioned earlier in this guide, we recommend using existing front-end tooling for building and optimizing your application’s front-end code. This command will be deprecated in future versions of Embark.
\n\nIn this guide we’ll explore how easy it is to quickly get up and running with Embark to build our first decentralized application. This is the perfect place to start if you haven’t used Embark before.
\nTogether, we’re going to:
\nHopefully, after that you’ll be motivated to explore the rest of Embark’s documentation. If you run into any problems along your journey, check out our Gitter channel as well. We are there to help.
\nLet’s get started!
\nFirst things first, we’ll have to install Embark on our local machines. This is easily done buy using a package manager of your choice. The following command installs the Embark CLI as a global command using npm:
\n$ npm install -g embark |
Once that is done, embark
should be available as a global command.
Prerequisites
\nIn order to actually start a blockchain client or other processes, there are some
more tools that need to be installed. Head over to our installation guide to learn more.
In order to get results as quickly as possible, Embark comes with a demo
command that scaffolds and sets up a complete application for us to play with. Open up a terminal of your choice and run:
$ embark demo |
This will create a demo application. Feel free to look around to get familiar with the project’s structure, but don’t worry. We’ll take a closer look at it later in one of our dedicated guides.
\nThe fastest way to get your app running is to use Embark’s run
command. It takes care of a lot of things, such as spinning up an Ethereum and IPFS node, or keeping an eye on file changes to recompile your code. There’s other ways to run your app, in case you need more control over different processes, but let’s not get ahead of ourselves.
$ embark run |
Once executed, we’ll notice that Embark opens up a dashboard view inside our terminal. This is the place where we monitor running processes such as compilation of our sources as well as deployments. As everything in Embark, the dashboard usage is configurable. If we prefer Embark to just output logs of whatever it’s doing, this can be easily done by running the same command with the --nodashboard
option.
Notice that the dashboard comes with sections for Contracts, Environment, Status, Available Services, Logs and Console. While most of them are self explanatory, we’ll take a closer look at those in the dashboard guide.
\n\nFor now, let’s focus on what has happened in the meantime. Embark has compiled and deployed the Smart Contracts that come with the demo application to a custom blockchain on your local machine. It has also compiled the web app that’s part of the demo and deployed that to a local web server, which is listening on http://localhost:8000
. In fact, Embark has probably already opened a browser window for you.
If not, give it a try yourself and open localhost:8000 in your browser of choice!
\nCongratulations! You’ve just created your first decentralized application. Now it’s a good time to explore what else Embark has to offer. To get started, type help
into the running console to get a list of commands you can run inside the dashboard.
Also, make sure to check out the other guides and let us know if you miss anything! If you run into any problems, the guide on troubleshooting is here to help.
\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"In this guide we’ll explore how easy it is to quickly get up and running with Embark to build our first decentralized application. This is the perfect place to start if you haven’t used Embark before.
\nTogether, we’re going to:
\nHopefully, after that you’ll be motivated to explore the rest of Embark’s documentation. If you run into any problems along your journey, check out our Gitter channel as well. We are there to help.
\nLet’s get started!
\nFirst things first, we’ll have to install Embark on our local machines. This is easily done buy using a package manager of your choice. The following command installs the Embark CLI as a global command using npm:
\n$ npm install -g embark |
Once that is done, embark
should be available as a global command.
Prerequisites
\nIn order to actually start a blockchain client or other processes, there are some
more tools that need to be installed. Head over to our installation guide to learn more.
In order to get results as quickly as possible, Embark comes with a demo
command that scaffolds and sets up a complete application for us to play with. Open up a terminal of your choice and run:
$ embark demo |
This will create a demo application. Feel free to look around to get familiar with the project’s structure, but don’t worry. We’ll take a closer look at it later in one of our dedicated guides.
\nThe fastest way to get your app running is to use Embark’s run
command. It takes care of a lot of things, such as spinning up an Ethereum and IPFS node, or keeping an eye on file changes to recompile your code. There’s other ways to run your app, in case you need more control over different processes, but let’s not get ahead of ourselves.
$ embark run |
Once executed, we’ll notice that Embark opens up a dashboard view inside our terminal. This is the place where we monitor running processes such as compilation of our sources as well as deployments. As everything in Embark, the dashboard usage is configurable. If we prefer Embark to just output logs of whatever it’s doing, this can be easily done by running the same command with the --nodashboard
option.
Notice that the dashboard comes with sections for Contracts, Environment, Status, Available Services, Logs and Console. While most of them are self explanatory, we’ll take a closer look at those in the dashboard guide.
\n\nFor now, let’s focus on what has happened in the meantime. Embark has compiled and deployed the Smart Contracts that come with the demo application to a custom blockchain on your local machine. It has also compiled the web app that’s part of the demo and deployed that to a local web server, which is listening on http://localhost:8000
. In fact, Embark has probably already opened a browser window for you.
If not, give it a try yourself and open localhost:8000 in your browser of choice!
\nCongratulations! You’ve just created your first decentralized application. Now it’s a good time to explore what else Embark has to offer. To get started, type help
into the running console to get a list of commands you can run inside the dashboard.
Also, make sure to check out the other guides and let us know if you miss anything! If you run into any problems, the guide on troubleshooting is here to help.
\n\n"},{"title":"Running apps","layout":"docs","_content":"\nWhile running Embark applications is pretty straight forward, there are some additional options we can take advantage of to change how our application is run. Whether we want Embark to automatically open a browser, open its dashboard or even make our app connect to different blockchains. This guide explores how this is done.\n\n## Using the `run` command\n\nIf you've read the [quickstart](quick_start.html) you're already aware that running an application is done by simply executing `embark run` within your project:\n\n```\n$ embark run\n```\n\nBy default, this will make Embark do a couple of things:\n\n- It initializes Embark\n- It starts the dashboard\n- It loads plugins\n- It spins up a blockchain and IPFS client, a web server and other necessary services\n- It compiles and deploys your app\n- It monitors running processes and recompiles and redeploys your app if needed\n- It starts [Cockpit](/docs/cockpit_introduction.html)\n\nMost of the time, using the `run` command is all what we need to work on our Embark project, but as mentioned above, we can take a bit more control over running our application.\n\n## Running an app without the dashboard\n\nWhile the dashboard gives us a great overview of all the processes and services that Embark manages for us, it's not required to start it every single time along with compiling and deploying our app. If we don't need the dashboard, we can prevent Embark from starting it by using the `--nodashboard` option:\n\n```\n$ embark run --nodashboard\n```\n\nWhen running the command with `--nodashboard`, Embark will fallback to only use standard log outputs, which are the same that we get in the **Logs** panel within the dashboard.\n\n## Running an app without opening a browser\n\nIn order to get up and running as fast as possible, Embark also takes care of opening a new browser window that connects to the web server to load our application's client. While this is quite convenient, sometimes we don't need a browser window to work on our app. This is the case when we're for example only interested in developing Smart Contracts, without creating a front-end.\n\nIf we don't want Embark to open a browser for us, all we have to do is using the `--nobrowser` option like this:\n\n\n```\n$ embark run --nobrowser\n```\n\n\n## Running an app without starting a web server\n\nIf we aren't interested in Embark starting a web server in the first place, we can easily turn it off by using the `--noserver` option:\n\n```\n$ embark run --noserver\n```\n\n## Running apps in different modes\n\nEmbark comes with different \"modes\" when building applications. `embark run` uses the `development` mode by default. However, this can be overwritten using the `--pipeline` option. The following command run our application in `production` mode.\n\n```\n$ embark run --pipeline production\n```\n\nFor more information about modes, head over to our guide on [building apps](pipeline_and_webpack.html).\n\n## Switching environments\n\nEmbark allows for configuring different environments to run our app against. This can be useful if we want to deploy our app to test networks or even private networks. In order to run our application in a specified environment, we first have to add a dedicated configuration to our project's `blockchain.js` file. \n\nDepending on how you initialized your application, it may have already multiple environments configured. Here's what a sample test network environment could look like:\n\n```\n// config/blockchain.js\n\nmodules.exports = {\n ...\n testnet: {\n networkType: \"testnet\",\n syncMode: \"light\",\n account: {\n password: \"config/testnet/password\"\n }\n },\n ...\n}\n```\n\nFor more information on configuring your Embark application, head over to the [general configuration guide](configuration.html).\n\nRunning an application in a different environment is just a matter of specifying the environment's name as part of the run command:\n\n```\n$ embark run [environment]\n```\n\nSo in case we want to run our app against the test network environment described above, this could be achieved by running:\n\n```\n$ embark run testnet\n```\n\n## Starting a blockchain separately\n\nSometimes we might want to have more control over the different processes involved when running our application with Embark. One of those things is to spin up a blockchain first and then have `embark run` connect to it. This enables us to stop and restart the blockchain process, without stopping Embark from doing its work.\n\nEmbark comes with a `blockchain` command that does exactly that:\n\n```\n$ embark blockchain\n```\n\nWhen this is executed before Embark is run within a project, the run command will skip spinning up a blockchain node itself and connect to the existing process. Similar to the `run` command, the `blockchain` command also allows to specify an environment:\n\n```\n$ embark blockchain testnet\n```\n\nBy default Embark blockchain will mine a minimum amount of ether and will only mine when new transactions come in.\n\n## Using the blockchain simulator\n\nAnother feature of Embark is to start a **simulated** blockchain. This can be useful for testing purposes as there's no need to wait for transactions to be mined. You might have heard of [Ganache CLI](https://truffleframework.com/docs/ganache/quickstart), which is a great project that implements such a simulated blockchain.\n\nEmbark integrates perfectly with this existing tool chain. To start a simulated blockchain, all we have do is to use the `simulator` command:\n\n```\n$ embark simulator\n```\n\n## Resetting apps\n\nSometimes we want to develop and test behaviours that are related to the deployment of our application. For example, we might want to use some of Embark's powerful [deployment hooks](/docs/contracts_configuration.html#Deployment-hooks) to initialize one of our Smart Contracts based on the deployment of another Smart Contract.\n\nTo test this, we'll have to redeploy our Smart Contracts. However once a Smart Contract is deployed, Embark keeps track of it and won't try to redeploy the same Smart Contract again.\n\nOne way to deal with this is to use the [deployment tracking](/docs/contracts_configuration.html#Deployment-tracking) configuration. Another way is to use Embark's `reset` command which will remove some files and data that Embark stores in the project's `.embark` folder.\n\nWe can reset our project by running the following command:\n\n```\n$ embark reset\n```\n\nIt's possible to configure what files Embark is going to remove when doing a reset. Check out [this guide](/docs/configuration.html#Configuring-Embark’s-reset-command) to learn more.\n","source":"docs/running_apps.md","raw":"title: Running apps\nlayout: docs\n---\n\nWhile running Embark applications is pretty straight forward, there are some additional options we can take advantage of to change how our application is run. Whether we want Embark to automatically open a browser, open its dashboard or even make our app connect to different blockchains. This guide explores how this is done.\n\n## Using the `run` command\n\nIf you've read the [quickstart](quick_start.html) you're already aware that running an application is done by simply executing `embark run` within your project:\n\n```\n$ embark run\n```\n\nBy default, this will make Embark do a couple of things:\n\n- It initializes Embark\n- It starts the dashboard\n- It loads plugins\n- It spins up a blockchain and IPFS client, a web server and other necessary services\n- It compiles and deploys your app\n- It monitors running processes and recompiles and redeploys your app if needed\n- It starts [Cockpit](/docs/cockpit_introduction.html)\n\nMost of the time, using the `run` command is all what we need to work on our Embark project, but as mentioned above, we can take a bit more control over running our application.\n\n## Running an app without the dashboard\n\nWhile the dashboard gives us a great overview of all the processes and services that Embark manages for us, it's not required to start it every single time along with compiling and deploying our app. If we don't need the dashboard, we can prevent Embark from starting it by using the `--nodashboard` option:\n\n```\n$ embark run --nodashboard\n```\n\nWhen running the command with `--nodashboard`, Embark will fallback to only use standard log outputs, which are the same that we get in the **Logs** panel within the dashboard.\n\n## Running an app without opening a browser\n\nIn order to get up and running as fast as possible, Embark also takes care of opening a new browser window that connects to the web server to load our application's client. While this is quite convenient, sometimes we don't need a browser window to work on our app. This is the case when we're for example only interested in developing Smart Contracts, without creating a front-end.\n\nIf we don't want Embark to open a browser for us, all we have to do is using the `--nobrowser` option like this:\n\n\n```\n$ embark run --nobrowser\n```\n\n\n## Running an app without starting a web server\n\nIf we aren't interested in Embark starting a web server in the first place, we can easily turn it off by using the `--noserver` option:\n\n```\n$ embark run --noserver\n```\n\n## Running apps in different modes\n\nEmbark comes with different \"modes\" when building applications. `embark run` uses the `development` mode by default. However, this can be overwritten using the `--pipeline` option. The following command run our application in `production` mode.\n\n```\n$ embark run --pipeline production\n```\n\nFor more information about modes, head over to our guide on [building apps](pipeline_and_webpack.html).\n\n## Switching environments\n\nEmbark allows for configuring different environments to run our app against. This can be useful if we want to deploy our app to test networks or even private networks. In order to run our application in a specified environment, we first have to add a dedicated configuration to our project's `blockchain.js` file. \n\nDepending on how you initialized your application, it may have already multiple environments configured. Here's what a sample test network environment could look like:\n\n```\n// config/blockchain.js\n\nmodules.exports = {\n ...\n testnet: {\n networkType: \"testnet\",\n syncMode: \"light\",\n account: {\n password: \"config/testnet/password\"\n }\n },\n ...\n}\n```\n\nFor more information on configuring your Embark application, head over to the [general configuration guide](configuration.html).\n\nRunning an application in a different environment is just a matter of specifying the environment's name as part of the run command:\n\n```\n$ embark run [environment]\n```\n\nSo in case we want to run our app against the test network environment described above, this could be achieved by running:\n\n```\n$ embark run testnet\n```\n\n## Starting a blockchain separately\n\nSometimes we might want to have more control over the different processes involved when running our application with Embark. One of those things is to spin up a blockchain first and then have `embark run` connect to it. This enables us to stop and restart the blockchain process, without stopping Embark from doing its work.\n\nEmbark comes with a `blockchain` command that does exactly that:\n\n```\n$ embark blockchain\n```\n\nWhen this is executed before Embark is run within a project, the run command will skip spinning up a blockchain node itself and connect to the existing process. Similar to the `run` command, the `blockchain` command also allows to specify an environment:\n\n```\n$ embark blockchain testnet\n```\n\nBy default Embark blockchain will mine a minimum amount of ether and will only mine when new transactions come in.\n\n## Using the blockchain simulator\n\nAnother feature of Embark is to start a **simulated** blockchain. This can be useful for testing purposes as there's no need to wait for transactions to be mined. You might have heard of [Ganache CLI](https://truffleframework.com/docs/ganache/quickstart), which is a great project that implements such a simulated blockchain.\n\nEmbark integrates perfectly with this existing tool chain. To start a simulated blockchain, all we have do is to use the `simulator` command:\n\n```\n$ embark simulator\n```\n\n## Resetting apps\n\nSometimes we want to develop and test behaviours that are related to the deployment of our application. For example, we might want to use some of Embark's powerful [deployment hooks](/docs/contracts_configuration.html#Deployment-hooks) to initialize one of our Smart Contracts based on the deployment of another Smart Contract.\n\nTo test this, we'll have to redeploy our Smart Contracts. However once a Smart Contract is deployed, Embark keeps track of it and won't try to redeploy the same Smart Contract again.\n\nOne way to deal with this is to use the [deployment tracking](/docs/contracts_configuration.html#Deployment-tracking) configuration. Another way is to use Embark's `reset` command which will remove some files and data that Embark stores in the project's `.embark` folder.\n\nWe can reset our project by running the following command:\n\n```\n$ embark reset\n```\n\nIt's possible to configure what files Embark is going to remove when doing a reset. Check out [this guide](/docs/configuration.html#Configuring-Embark’s-reset-command) to learn more.\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/running_apps.html","comments":1,"_id":"ck5ijm3rt001j7heg41pw16p3","content":"While running Embark applications is pretty straight forward, there are some additional options we can take advantage of to change how our application is run. Whether we want Embark to automatically open a browser, open its dashboard or even make our app connect to different blockchains. This guide explores how this is done.
\nrun
commandIf you’ve read the quickstart you’re already aware that running an application is done by simply executing embark run
within your project:
$ embark run |
By default, this will make Embark do a couple of things:
\nMost of the time, using the run
command is all what we need to work on our Embark project, but as mentioned above, we can take a bit more control over running our application.
While the dashboard gives us a great overview of all the processes and services that Embark manages for us, it’s not required to start it every single time along with compiling and deploying our app. If we don’t need the dashboard, we can prevent Embark from starting it by using the --nodashboard
option:
$ embark run --nodashboard |
When running the command with --nodashboard
, Embark will fallback to only use standard log outputs, which are the same that we get in the Logs panel within the dashboard.
In order to get up and running as fast as possible, Embark also takes care of opening a new browser window that connects to the web server to load our application’s client. While this is quite convenient, sometimes we don’t need a browser window to work on our app. This is the case when we’re for example only interested in developing Smart Contracts, without creating a front-end.
\nIf we don’t want Embark to open a browser for us, all we have to do is using the --nobrowser
option like this:
$ embark run --nobrowser |
If we aren’t interested in Embark starting a web server in the first place, we can easily turn it off by using the --noserver
option:
$ embark run --noserver |
Embark comes with different “modes” when building applications. embark run
uses the development
mode by default. However, this can be overwritten using the --pipeline
option. The following command run our application in production
mode.
$ embark run --pipeline production |
For more information about modes, head over to our guide on building apps.
\nEmbark allows for configuring different environments to run our app against. This can be useful if we want to deploy our app to test networks or even private networks. In order to run our application in a specified environment, we first have to add a dedicated configuration to our project’s blockchain.js
file.
Depending on how you initialized your application, it may have already multiple environments configured. Here’s what a sample test network environment could look like:
\n// config/blockchain.js |
For more information on configuring your Embark application, head over to the general configuration guide.
\nRunning an application in a different environment is just a matter of specifying the environment’s name as part of the run command:
\n$ embark run [environment] |
So in case we want to run our app against the test network environment described above, this could be achieved by running:
\n$ embark run testnet |
Sometimes we might want to have more control over the different processes involved when running our application with Embark. One of those things is to spin up a blockchain first and then have embark run
connect to it. This enables us to stop and restart the blockchain process, without stopping Embark from doing its work.
Embark comes with a blockchain
command that does exactly that:
$ embark blockchain |
When this is executed before Embark is run within a project, the run command will skip spinning up a blockchain node itself and connect to the existing process. Similar to the run
command, the blockchain
command also allows to specify an environment:
$ embark blockchain testnet |
By default Embark blockchain will mine a minimum amount of ether and will only mine when new transactions come in.
\nAnother feature of Embark is to start a simulated blockchain. This can be useful for testing purposes as there’s no need to wait for transactions to be mined. You might have heard of Ganache CLI, which is a great project that implements such a simulated blockchain.
\nEmbark integrates perfectly with this existing tool chain. To start a simulated blockchain, all we have do is to use the simulator
command:
$ embark simulator |
Sometimes we want to develop and test behaviours that are related to the deployment of our application. For example, we might want to use some of Embark’s powerful deployment hooks to initialize one of our Smart Contracts based on the deployment of another Smart Contract.
\nTo test this, we’ll have to redeploy our Smart Contracts. However once a Smart Contract is deployed, Embark keeps track of it and won’t try to redeploy the same Smart Contract again.
\nOne way to deal with this is to use the deployment tracking configuration. Another way is to use Embark’s reset
command which will remove some files and data that Embark stores in the project’s .embark
folder.
We can reset our project by running the following command:
\n$ embark reset |
It’s possible to configure what files Embark is going to remove when doing a reset. Check out this guide to learn more.
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"While running Embark applications is pretty straight forward, there are some additional options we can take advantage of to change how our application is run. Whether we want Embark to automatically open a browser, open its dashboard or even make our app connect to different blockchains. This guide explores how this is done.
\nrun
commandIf you’ve read the quickstart you’re already aware that running an application is done by simply executing embark run
within your project:
$ embark run |
By default, this will make Embark do a couple of things:
\nMost of the time, using the run
command is all what we need to work on our Embark project, but as mentioned above, we can take a bit more control over running our application.
While the dashboard gives us a great overview of all the processes and services that Embark manages for us, it’s not required to start it every single time along with compiling and deploying our app. If we don’t need the dashboard, we can prevent Embark from starting it by using the --nodashboard
option:
$ embark run --nodashboard |
When running the command with --nodashboard
, Embark will fallback to only use standard log outputs, which are the same that we get in the Logs panel within the dashboard.
In order to get up and running as fast as possible, Embark also takes care of opening a new browser window that connects to the web server to load our application’s client. While this is quite convenient, sometimes we don’t need a browser window to work on our app. This is the case when we’re for example only interested in developing Smart Contracts, without creating a front-end.
\nIf we don’t want Embark to open a browser for us, all we have to do is using the --nobrowser
option like this:
$ embark run --nobrowser |
If we aren’t interested in Embark starting a web server in the first place, we can easily turn it off by using the --noserver
option:
$ embark run --noserver |
Embark comes with different “modes” when building applications. embark run
uses the development
mode by default. However, this can be overwritten using the --pipeline
option. The following command run our application in production
mode.
$ embark run --pipeline production |
For more information about modes, head over to our guide on building apps.
\nEmbark allows for configuring different environments to run our app against. This can be useful if we want to deploy our app to test networks or even private networks. In order to run our application in a specified environment, we first have to add a dedicated configuration to our project’s blockchain.js
file.
Depending on how you initialized your application, it may have already multiple environments configured. Here’s what a sample test network environment could look like:
\n// config/blockchain.js |
For more information on configuring your Embark application, head over to the general configuration guide.
\nRunning an application in a different environment is just a matter of specifying the environment’s name as part of the run command:
\n$ embark run [environment] |
So in case we want to run our app against the test network environment described above, this could be achieved by running:
\n$ embark run testnet |
Sometimes we might want to have more control over the different processes involved when running our application with Embark. One of those things is to spin up a blockchain first and then have embark run
connect to it. This enables us to stop and restart the blockchain process, without stopping Embark from doing its work.
Embark comes with a blockchain
command that does exactly that:
$ embark blockchain |
When this is executed before Embark is run within a project, the run command will skip spinning up a blockchain node itself and connect to the existing process. Similar to the run
command, the blockchain
command also allows to specify an environment:
$ embark blockchain testnet |
By default Embark blockchain will mine a minimum amount of ether and will only mine when new transactions come in.
\nAnother feature of Embark is to start a simulated blockchain. This can be useful for testing purposes as there’s no need to wait for transactions to be mined. You might have heard of Ganache CLI, which is a great project that implements such a simulated blockchain.
\nEmbark integrates perfectly with this existing tool chain. To start a simulated blockchain, all we have do is to use the simulator
command:
$ embark simulator |
Sometimes we want to develop and test behaviours that are related to the deployment of our application. For example, we might want to use some of Embark’s powerful deployment hooks to initialize one of our Smart Contracts based on the deployment of another Smart Contract.
\nTo test this, we’ll have to redeploy our Smart Contracts. However once a Smart Contract is deployed, Embark keeps track of it and won’t try to redeploy the same Smart Contract again.
\nOne way to deal with this is to use the deployment tracking configuration. Another way is to use Embark’s reset
command which will remove some files and data that Embark stores in the project’s .embark
folder.
We can reset our project by running the following command:
\n$ embark reset |
It’s possible to configure what files Embark is going to remove when doing a reset. Check out this guide to learn more.
\n"},{"title":"Sending and Receiving messages","layout":"docs","_content":"\n### listening to messages\n\nEmbarkJS.Messages.listenTo({topic: [\"topic1\", \"topic2\"]}).then(function(message) {\n console.log(\"received: \" + message);\n})\n
\n\n### sending messages\n\nYou can send plain text\n\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: 'hello world'})\n
\n\nOr an object\n\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: {msg: 'hello world'}})\n
\n\nNote: array of topics are considered an AND. In Whisper you can use another array for OR combinations of several topics e.g ``[\"topic1\", [\"topic2\", \"topic3\"]]`` => ``topic1 AND (topic2 OR topic 3)``\n\n### Setup\n\nBy default Embark will automatically initialize EmbarkJS with the provider configured at `config/communication.js`. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:\n\nEmbarkJS.Messages.setProvider('whisper')\n
\n\n\n","source":"docs/sending_and_receiving_messages.md","raw":"title: Sending and Receiving messages\nlayout: docs\n---\n\n### listening to messages\n\nEmbarkJS.Messages.listenTo({topic: [\"topic1\", \"topic2\"]}).then(function(message) {\n console.log(\"received: \" + message);\n})\n
\n\n### sending messages\n\nYou can send plain text\n\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: 'hello world'})\n
\n\nOr an object\n\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: {msg: 'hello world'}})\n
\n\nNote: array of topics are considered an AND. In Whisper you can use another array for OR combinations of several topics e.g ``[\"topic1\", [\"topic2\", \"topic3\"]]`` => ``topic1 AND (topic2 OR topic 3)``\n\n### Setup\n\nBy default Embark will automatically initialize EmbarkJS with the provider configured at `config/communication.js`. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:\n\nEmbarkJS.Messages.setProvider('whisper')\n
\n\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/sending_and_receiving_messages.html","comments":1,"_id":"ck5ijm3ru001k7heg3fkc3809","content":"EmbarkJS.Messages.listenTo({topic: [\"topic1\", \"topic2\"]}).then(function(message) {\n console.log(\"received: \" + message);\n})\n
\n\nYou can send plain text
\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: 'hello world'})\n
\n\nOr an object
\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: {msg: 'hello world'}})\n
\n\nNote: array of topics are considered an AND. In Whisper you can use another array for OR combinations of several topics e.g ["topic1", ["topic2", "topic3"]]
=> topic1 AND (topic2 OR topic 3)
By default Embark will automatically initialize EmbarkJS with the provider configured at config/communication.js
. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:
EmbarkJS.Messages.setProvider('whisper')\n
\n\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"EmbarkJS.Messages.listenTo({topic: [\"topic1\", \"topic2\"]}).then(function(message) {\n console.log(\"received: \" + message);\n})\n
\n\nYou can send plain text
\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: 'hello world'})\n
\n\nOr an object
\nEmbarkJS.Messages.sendMessage({topic: \"sometopic\", data: {msg: 'hello world'}})\n
\n\nNote: array of topics are considered an AND. In Whisper you can use another array for OR combinations of several topics e.g ["topic1", ["topic2", "topic3"]]
=> topic1 AND (topic2 OR topic 3)
By default Embark will automatically initialize EmbarkJS with the provider configured at config/communication.js
. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:
EmbarkJS.Messages.setProvider('whisper')\n
\n\n\n"},{"title":"Smart Contract Objects","layout":"docs","_content":"### Interacting with contracts in Javascript\n\nEmbark will automatically take care of deployment for you and set all needed JS bindings. For example, the contract below:\n\n```\n// app/contracts/simple_storage.sol\n\ncontract SimpleStorage {\n uint public storedData;\n\n function SimpleStorage(uint initialValue) {\n storedData = initialValue;\n }\n\n function set(uint x) {\n storedData = x;\n }\n function get() constant returns (uint retVal) {\n return storedData;\n }\n}\n```\n\nWill automatically be available in Javascript as:\n\n```\n// app/js/index.js\n\nimport SimpleStorage from 'Embark/contracts/SimpleStorage';\n\nSimpleStorage.methods.set(100).send();\nSimpleStorage.methods.get().call().then(function(value) { console.log(value) });\nSimpleStorage.methods.storedData().call().then(function(value) { console.log(value) });\n```\n\nThe syntax used is web3.js 1.2.1\n","source":"docs/smart_contract_objects.md","raw":"title: Smart Contract Objects\nlayout: docs\n---\n### Interacting with contracts in Javascript\n\nEmbark will automatically take care of deployment for you and set all needed JS bindings. For example, the contract below:\n\n```\n// app/contracts/simple_storage.sol\n\ncontract SimpleStorage {\n uint public storedData;\n\n function SimpleStorage(uint initialValue) {\n storedData = initialValue;\n }\n\n function set(uint x) {\n storedData = x;\n }\n function get() constant returns (uint retVal) {\n return storedData;\n }\n}\n```\n\nWill automatically be available in Javascript as:\n\n```\n// app/js/index.js\n\nimport SimpleStorage from 'Embark/contracts/SimpleStorage';\n\nSimpleStorage.methods.set(100).send();\nSimpleStorage.methods.get().call().then(function(value) { console.log(value) });\nSimpleStorage.methods.storedData().call().then(function(value) { console.log(value) });\n```\n\nThe syntax used is web3.js 1.2.1\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/smart_contract_objects.html","comments":1,"_id":"ck5ijm3rv001l7heg41h7gzra","content":"Embark will automatically take care of deployment for you and set all needed JS bindings. For example, the contract below:
\n// app/contracts/simple_storage.sol |
Will automatically be available in Javascript as:
\n// app/js/index.js |
The syntax used is web3.js 1.2.1
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Embark will automatically take care of deployment for you and set all needed JS bindings. For example, the contract below:
\n// app/contracts/simple_storage.sol |
Will automatically be available in Javascript as:
\n// app/js/index.js |
The syntax used is web3.js 1.2.1
\n"},{"title":"Solidity Documentation","_content":"\nThe documentation for Solidity can be found [here](https://solidity.readthedocs.io/)\n\n","source":"docs/solidity.md","raw":"title: Solidity Documentation\n---\n\nThe documentation for Solidity can be found [here](https://solidity.readthedocs.io/)\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/solidity.html","comments":1,"layout":"page","_id":"ck5ijm3rv001m7hegeg1e1h1s","content":"The documentation for Solidity can be found here
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"The documentation for Solidity can be found here
\n"},{"title":"Configuring decentralized storages","layout":"docs","_content":"\nWith Embark, we easily connect to decentralized storage solutions such as IPFS and Swarm. This enables us to upload, storing and download data and assets for our decentralized applications. Let's take a closer look at how to make use of this.\n\n## Configuration basics\n\nEmbark will check our preferred storage configuration in the file `config/storage.js`, unless [configured differently](/docs/configuration.html) in our application's `embark.json` file. This file contains the preferred configuration for each environment, with `default` being the configuration that applies to every environment. If [environments in Embark](/docs/environments.html) are new to you, check out the dedicated guide first and come back.\n\nEach of these configuration options can be individually overridden on a per environment basis.\n\n```\nmodule.exports = {\n \"default\": {\n \"enabled\": true,\n \"ipfs_bin\": \"ipfs\",\n \"available_providers\": [\"ipfs\", \"swarm\"],\n \"upload\":{\n \"provider\": \"ipfs\",\n \"host\": \"localhost\",\n \"port\": 5001,\n \"getUrl\": \"http://localhost:8080/ipfs\"\n },\n \"dappConnection\":[\n {\"provider\": \"swarm\", \"host\": \"localhost\", \"port\": 8500, \"getUrl\": \"http://localhost:8500/bzz:/\"},\n {\"provider\": \"ipfs\", \"host\": \"localhost\", \"port\": 5001, \"getUrl\": \"http://localhost:8080/ipfs/\"}\n ]\n },\n \"development\": {\n \"enabled\": true,\n \"provider\": \"ipfs\",\n \"host\": \"localhost\",\n \"port\": 5001\n }\n}\n```\n\nThe available options are:\n\nOption | Type: `default` | Value\n--- | --- | ---\n`enabled` | boolean: `true` | Enables or completely disables storage support\n`ipfs_bin` | string: `ipfs` | Name or desired path to the ipfs binary\n`available_providers` | array: `[\"ipfs\", \"swarm\"]` | List of storages to be supported on the dapp. This will affect what's available with the EmbarkJS library on the dapp.\n`upload` | | The upload element specifies storage provider settings used for uploading your dapp. A swarm node will be automatically launched in a child process using these settings.\n`upload.provider` | string: `ipfs` | Desired provider to use when uploading dapp.\n`upload.protocol` | string: `http` | Storage provider protocol for upload, ie `http` or `https`\n`upload.host` | string: `localhost` | Host value used to interact with the storage provider for upload, i.e. `localhost` or `swarm-gateways.net`\n`upload.port` | integer: `5001` | Port value used to interact with the storage provider for upload, i.e. `5001` (IPFS local node) or `8500` (Swarm local node) or `80`\n`upload.getUrl` | string: `http://localhost:8080/ipfs/` | Only for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API.\n`dappConnection` | | List of storage providers to attempt connection to in the dapp. Each provider process will be launched in a child process. Each connection listed will be tried in order on the dapp, until one is avaialable. Can also specify `$BZZ` to attempt to connect to an injected swarm object.\n`dappConnection.provider` | string: `ipfs` | Desired provider to use for dapp storage.\n`dappConnection.protocol` | string: `http` | Storage provider protocol used in the dapp, i.e. `http` or `https`\n`dappConnection.host` | string | Host value used to interact with the storage provider in the dapp, i.e. `localhost` or `swarm-gateways.net`\n`dappConnection.port` | integer | Port value used to interact with the storage provider in the dapp, i.e. `5001` (IPFS local node) or `8500` (Swarm local node) or `80`. Can specify `false` if a port should not be included in the connection URL (i.e. for a public gateway like `http://swarm-gateways.net`).\n`dappConnection.getUrl` | string | Only for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API.\n\n## Using a local node\n\nEither for IPFS or Swarm, Embark will default to use a local node for development purposes. Note that we still need to set up the right port according to the storage platform we use. By default, IPFS runs on port `5001` and Swarm runs on `8500`.\n\nWe can start a local storage node ourselves or now we can let Embark start the node for us. Letting Embark do the job lets us focus on developing faster while doing it ourselves might give us more flexibility. Obviously, we still need to have IPFS or Swarm installed locally for it to work.\n\n**Important configurations for swarm**:\n\n```\n{\n \"development\": {\n \"provider\": \"swarm\",\n \"account\": {\n \"address\": \"YOUR_ACCOUNT_ADDRESS\",\n \"password\": \"PATH/TO/PASSWORD/FILE\"\n },\n \"swarmPath\": \"PATH/TO/SWARM/EXECUTABLE\"\n }\n}\n```\n\n## Using a public gateway\n\nEmbark can connect to a public gateway when using any of the available storage options. To use a public gateway, instead of running a local node, for IPFS or Swarm, use the following `config/storage.js` options:\n\n### IPFS\n```\n\"development\": {\n \"enabled\": true,\n \"upload\":{\n \"provider\": \"ipfs\",\n \"host\": \"ipfs.infura.io\",\n \"port\": 80,\n \"protocol\": \"https\",\n \"getUrl\": \"https://ipfs.infura.io/ipfs/\"\n }\n}\n```\n\n### Swarm\n\n```\n\"development\": {\n \"enabled\": true,\n \"upload\": {\n \"provider\": \"swarm\",\n \"host\": \"localhost\",\n \"port\": 8500\n }\n}\n```\n\n## Troubleshooting\n\nIf you are running your own processes for IPFS or Swarm, the CORS needs to be set to the domain of your application, to the geth domain, and to the domain of the storage used inside the application.\n\nIf you are using the built in webserver, the CORS would need to be set to `http://localhost:8000`, however if you are using `embark upload`, the domain of the decentralised storage host should be included in CORS.\n\nDepending on your `upload` settings in `storage.js`, this could be `http://localhost:8080` or `http://ipfs.infura.io` for IPFS or it could be `http://localhost:8500` or `http://swarm-gateways.net` for Swarm.\n\nOf course, if you are hosting your DApp on a different domain (i.e. not `localhost`, then that would need to be included in CORS as well. Examples of how to include multiple domains for each are below:\n\n```\nipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin \"[\\\"http://localhost:8000\\\", \\\"http://localhost:8500\\\", \\\"http://localhost:8545\\\", \\\"ws://localhost:8546\\\"]\"\n```\nNOTE: `http://localhost:8545` and `ws://localhost:8546` are for geth.\n\n```\nswarm --bzzaccount=fedda09fd9218d1ea4fd41ad44694fa4ccba1878 --datadir=~/.bzz-data/ --password=config/development/password --corsdomain=http://localhost:8000,http://localhost:8080,http://localhost:8545,ws://localhost:8546 --ens-api=''\n```\n","source":"docs/storage_configuration.md","raw":"title: Configuring decentralized storages\nlayout: docs\n---\n\nWith Embark, we easily connect to decentralized storage solutions such as IPFS and Swarm. This enables us to upload, storing and download data and assets for our decentralized applications. Let's take a closer look at how to make use of this.\n\n## Configuration basics\n\nEmbark will check our preferred storage configuration in the file `config/storage.js`, unless [configured differently](/docs/configuration.html) in our application's `embark.json` file. This file contains the preferred configuration for each environment, with `default` being the configuration that applies to every environment. If [environments in Embark](/docs/environments.html) are new to you, check out the dedicated guide first and come back.\n\nEach of these configuration options can be individually overridden on a per environment basis.\n\n```\nmodule.exports = {\n \"default\": {\n \"enabled\": true,\n \"ipfs_bin\": \"ipfs\",\n \"available_providers\": [\"ipfs\", \"swarm\"],\n \"upload\":{\n \"provider\": \"ipfs\",\n \"host\": \"localhost\",\n \"port\": 5001,\n \"getUrl\": \"http://localhost:8080/ipfs\"\n },\n \"dappConnection\":[\n {\"provider\": \"swarm\", \"host\": \"localhost\", \"port\": 8500, \"getUrl\": \"http://localhost:8500/bzz:/\"},\n {\"provider\": \"ipfs\", \"host\": \"localhost\", \"port\": 5001, \"getUrl\": \"http://localhost:8080/ipfs/\"}\n ]\n },\n \"development\": {\n \"enabled\": true,\n \"provider\": \"ipfs\",\n \"host\": \"localhost\",\n \"port\": 5001\n }\n}\n```\n\nThe available options are:\n\nOption | Type: `default` | Value\n--- | --- | ---\n`enabled` | boolean: `true` | Enables or completely disables storage support\n`ipfs_bin` | string: `ipfs` | Name or desired path to the ipfs binary\n`available_providers` | array: `[\"ipfs\", \"swarm\"]` | List of storages to be supported on the dapp. This will affect what's available with the EmbarkJS library on the dapp.\n`upload` | | The upload element specifies storage provider settings used for uploading your dapp. A swarm node will be automatically launched in a child process using these settings.\n`upload.provider` | string: `ipfs` | Desired provider to use when uploading dapp.\n`upload.protocol` | string: `http` | Storage provider protocol for upload, ie `http` or `https`\n`upload.host` | string: `localhost` | Host value used to interact with the storage provider for upload, i.e. `localhost` or `swarm-gateways.net`\n`upload.port` | integer: `5001` | Port value used to interact with the storage provider for upload, i.e. `5001` (IPFS local node) or `8500` (Swarm local node) or `80`\n`upload.getUrl` | string: `http://localhost:8080/ipfs/` | Only for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API.\n`dappConnection` | | List of storage providers to attempt connection to in the dapp. Each provider process will be launched in a child process. Each connection listed will be tried in order on the dapp, until one is avaialable. Can also specify `$BZZ` to attempt to connect to an injected swarm object.\n`dappConnection.provider` | string: `ipfs` | Desired provider to use for dapp storage.\n`dappConnection.protocol` | string: `http` | Storage provider protocol used in the dapp, i.e. `http` or `https`\n`dappConnection.host` | string | Host value used to interact with the storage provider in the dapp, i.e. `localhost` or `swarm-gateways.net`\n`dappConnection.port` | integer | Port value used to interact with the storage provider in the dapp, i.e. `5001` (IPFS local node) or `8500` (Swarm local node) or `80`. Can specify `false` if a port should not be included in the connection URL (i.e. for a public gateway like `http://swarm-gateways.net`).\n`dappConnection.getUrl` | string | Only for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API.\n\n## Using a local node\n\nEither for IPFS or Swarm, Embark will default to use a local node for development purposes. Note that we still need to set up the right port according to the storage platform we use. By default, IPFS runs on port `5001` and Swarm runs on `8500`.\n\nWe can start a local storage node ourselves or now we can let Embark start the node for us. Letting Embark do the job lets us focus on developing faster while doing it ourselves might give us more flexibility. Obviously, we still need to have IPFS or Swarm installed locally for it to work.\n\n**Important configurations for swarm**:\n\n```\n{\n \"development\": {\n \"provider\": \"swarm\",\n \"account\": {\n \"address\": \"YOUR_ACCOUNT_ADDRESS\",\n \"password\": \"PATH/TO/PASSWORD/FILE\"\n },\n \"swarmPath\": \"PATH/TO/SWARM/EXECUTABLE\"\n }\n}\n```\n\n## Using a public gateway\n\nEmbark can connect to a public gateway when using any of the available storage options. To use a public gateway, instead of running a local node, for IPFS or Swarm, use the following `config/storage.js` options:\n\n### IPFS\n```\n\"development\": {\n \"enabled\": true,\n \"upload\":{\n \"provider\": \"ipfs\",\n \"host\": \"ipfs.infura.io\",\n \"port\": 80,\n \"protocol\": \"https\",\n \"getUrl\": \"https://ipfs.infura.io/ipfs/\"\n }\n}\n```\n\n### Swarm\n\n```\n\"development\": {\n \"enabled\": true,\n \"upload\": {\n \"provider\": \"swarm\",\n \"host\": \"localhost\",\n \"port\": 8500\n }\n}\n```\n\n## Troubleshooting\n\nIf you are running your own processes for IPFS or Swarm, the CORS needs to be set to the domain of your application, to the geth domain, and to the domain of the storage used inside the application.\n\nIf you are using the built in webserver, the CORS would need to be set to `http://localhost:8000`, however if you are using `embark upload`, the domain of the decentralised storage host should be included in CORS.\n\nDepending on your `upload` settings in `storage.js`, this could be `http://localhost:8080` or `http://ipfs.infura.io` for IPFS or it could be `http://localhost:8500` or `http://swarm-gateways.net` for Swarm.\n\nOf course, if you are hosting your DApp on a different domain (i.e. not `localhost`, then that would need to be included in CORS as well. Examples of how to include multiple domains for each are below:\n\n```\nipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin \"[\\\"http://localhost:8000\\\", \\\"http://localhost:8500\\\", \\\"http://localhost:8545\\\", \\\"ws://localhost:8546\\\"]\"\n```\nNOTE: `http://localhost:8545` and `ws://localhost:8546` are for geth.\n\n```\nswarm --bzzaccount=fedda09fd9218d1ea4fd41ad44694fa4ccba1878 --datadir=~/.bzz-data/ --password=config/development/password --corsdomain=http://localhost:8000,http://localhost:8080,http://localhost:8545,ws://localhost:8546 --ens-api=''\n```\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/storage_configuration.html","comments":1,"_id":"ck5ijm3rw001n7heghk4sbt8r","content":"With Embark, we easily connect to decentralized storage solutions such as IPFS and Swarm. This enables us to upload, storing and download data and assets for our decentralized applications. Let’s take a closer look at how to make use of this.
\nEmbark will check our preferred storage configuration in the file config/storage.js
, unless configured differently in our application’s embark.json
file. This file contains the preferred configuration for each environment, with default
being the configuration that applies to every environment. If environments in Embark are new to you, check out the dedicated guide first and come back.
Each of these configuration options can be individually overridden on a per environment basis.
\nmodule.exports = { |
The available options are:
\nOption | \nType: default | \nValue | \n
---|---|---|
enabled | \nboolean: true | \nEnables or completely disables storage support | \n
ipfs_bin | \nstring: ipfs | \nName or desired path to the ipfs binary | \n
available_providers | \narray: ["ipfs", "swarm"] | \nList of storages to be supported on the dapp. This will affect what’s available with the EmbarkJS library on the dapp. | \n
upload | \n\n | The upload element specifies storage provider settings used for uploading your dapp. A swarm node will be automatically launched in a child process using these settings. | \n
upload.provider | \nstring: ipfs | \nDesired provider to use when uploading dapp. | \n
upload.protocol | \nstring: http | \nStorage provider protocol for upload, ie http or https | \n
upload.host | \nstring: localhost | \nHost value used to interact with the storage provider for upload, i.e. localhost or swarm-gateways.net | \n
upload.port | \ninteger: 5001 | \nPort value used to interact with the storage provider for upload, i.e. 5001 (IPFS local node) or 8500 (Swarm local node) or 80 | \n
upload.getUrl | \nstring: http://localhost:8080/ipfs/ | \nOnly for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API. | \n
dappConnection | \n\n | List of storage providers to attempt connection to in the dapp. Each provider process will be launched in a child process. Each connection listed will be tried in order on the dapp, until one is avaialable. Can also specify $BZZ to attempt to connect to an injected swarm object. | \n
dappConnection.provider | \nstring: ipfs | \nDesired provider to use for dapp storage. | \n
dappConnection.protocol | \nstring: http | \nStorage provider protocol used in the dapp, i.e. http or https | \n
dappConnection.host | \nstring | \nHost value used to interact with the storage provider in the dapp, i.e. localhost or swarm-gateways.net | \n
dappConnection.port | \ninteger | \nPort value used to interact with the storage provider in the dapp, i.e. 5001 (IPFS local node) or 8500 (Swarm local node) or 80 . Can specify false if a port should not be included in the connection URL (i.e. for a public gateway like http://swarm-gateways.net ). | \n
dappConnection.getUrl | \nstring | \nOnly for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API. | \n
Either for IPFS or Swarm, Embark will default to use a local node for development purposes. Note that we still need to set up the right port according to the storage platform we use. By default, IPFS runs on port 5001
and Swarm runs on 8500
.
We can start a local storage node ourselves or now we can let Embark start the node for us. Letting Embark do the job lets us focus on developing faster while doing it ourselves might give us more flexibility. Obviously, we still need to have IPFS or Swarm installed locally for it to work.
\nImportant configurations for swarm:
\n{ |
Embark can connect to a public gateway when using any of the available storage options. To use a public gateway, instead of running a local node, for IPFS or Swarm, use the following config/storage.js
options:
"development": { |
"development": { |
If you are running your own processes for IPFS or Swarm, the CORS needs to be set to the domain of your application, to the geth domain, and to the domain of the storage used inside the application.
\nIf you are using the built in webserver, the CORS would need to be set to http://localhost:8000
, however if you are using embark upload
, the domain of the decentralised storage host should be included in CORS.
Depending on your upload
settings in storage.js
, this could be http://localhost:8080
or http://ipfs.infura.io
for IPFS or it could be http://localhost:8500
or http://swarm-gateways.net
for Swarm.
Of course, if you are hosting your DApp on a different domain (i.e. not localhost
, then that would need to be included in CORS as well. Examples of how to include multiple domains for each are below:
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin "[\\"http://localhost:8000\\", \\"http://localhost:8500\\", \\"http://localhost:8545\\", \\"ws://localhost:8546\\"]" |
NOTE: http://localhost:8545
and ws://localhost:8546
are for geth.
swarm --bzzaccount=fedda09fd9218d1ea4fd41ad44694fa4ccba1878 --datadir=~/.bzz-data/ --password=config/development/password --corsdomain=http://localhost:8000,http://localhost:8080,http://localhost:8545,ws://localhost:8546 --ens-api='' |
With Embark, we easily connect to decentralized storage solutions such as IPFS and Swarm. This enables us to upload, storing and download data and assets for our decentralized applications. Let’s take a closer look at how to make use of this.
\nEmbark will check our preferred storage configuration in the file config/storage.js
, unless configured differently in our application’s embark.json
file. This file contains the preferred configuration for each environment, with default
being the configuration that applies to every environment. If environments in Embark are new to you, check out the dedicated guide first and come back.
Each of these configuration options can be individually overridden on a per environment basis.
\nmodule.exports = { |
The available options are:
\nOption | \nType: default | \nValue | \n
---|---|---|
enabled | \nboolean: true | \nEnables or completely disables storage support | \n
ipfs_bin | \nstring: ipfs | \nName or desired path to the ipfs binary | \n
available_providers | \narray: ["ipfs", "swarm"] | \nList of storages to be supported on the dapp. This will affect what’s available with the EmbarkJS library on the dapp. | \n
upload | \n\n | The upload element specifies storage provider settings used for uploading your dapp. A swarm node will be automatically launched in a child process using these settings. | \n
upload.provider | \nstring: ipfs | \nDesired provider to use when uploading dapp. | \n
upload.protocol | \nstring: http | \nStorage provider protocol for upload, ie http or https | \n
upload.host | \nstring: localhost | \nHost value used to interact with the storage provider for upload, i.e. localhost or swarm-gateways.net | \n
upload.port | \ninteger: 5001 | \nPort value used to interact with the storage provider for upload, i.e. 5001 (IPFS local node) or 8500 (Swarm local node) or 80 | \n
upload.getUrl | \nstring: http://localhost:8080/ipfs/ | \nOnly for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API. | \n
dappConnection | \n\n | List of storage providers to attempt connection to in the dapp. Each provider process will be launched in a child process. Each connection listed will be tried in order on the dapp, until one is avaialable. Can also specify $BZZ to attempt to connect to an injected swarm object. | \n
dappConnection.provider | \nstring: ipfs | \nDesired provider to use for dapp storage. | \n
dappConnection.protocol | \nstring: http | \nStorage provider protocol used in the dapp, i.e. http or https | \n
dappConnection.host | \nstring | \nHost value used to interact with the storage provider in the dapp, i.e. localhost or swarm-gateways.net | \n
dappConnection.port | \ninteger | \nPort value used to interact with the storage provider in the dapp, i.e. 5001 (IPFS local node) or 8500 (Swarm local node) or 80 . Can specify false if a port should not be included in the connection URL (i.e. for a public gateway like http://swarm-gateways.net ). | \n
dappConnection.getUrl | \nstring | \nOnly for IPFS. This sets the file/document retrieval URL, which is different than the host/port combination used to interact with the IPFS API. | \n
Either for IPFS or Swarm, Embark will default to use a local node for development purposes. Note that we still need to set up the right port according to the storage platform we use. By default, IPFS runs on port 5001
and Swarm runs on 8500
.
We can start a local storage node ourselves or now we can let Embark start the node for us. Letting Embark do the job lets us focus on developing faster while doing it ourselves might give us more flexibility. Obviously, we still need to have IPFS or Swarm installed locally for it to work.
\nImportant configurations for swarm:
\n{ |
Embark can connect to a public gateway when using any of the available storage options. To use a public gateway, instead of running a local node, for IPFS or Swarm, use the following config/storage.js
options:
"development": { |
"development": { |
If you are running your own processes for IPFS or Swarm, the CORS needs to be set to the domain of your application, to the geth domain, and to the domain of the storage used inside the application.
\nIf you are using the built in webserver, the CORS would need to be set to http://localhost:8000
, however if you are using embark upload
, the domain of the decentralised storage host should be included in CORS.
Depending on your upload
settings in storage.js
, this could be http://localhost:8080
or http://ipfs.infura.io
for IPFS or it could be http://localhost:8500
or http://swarm-gateways.net
for Swarm.
Of course, if you are hosting your DApp on a different domain (i.e. not localhost
, then that would need to be included in CORS as well. Examples of how to include multiple domains for each are below:
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin "[\\"http://localhost:8000\\", \\"http://localhost:8500\\", \\"http://localhost:8545\\", \\"ws://localhost:8546\\"]" |
NOTE: http://localhost:8545
and ws://localhost:8546
are for geth.
swarm --bzzaccount=fedda09fd9218d1ea4fd41ad44694fa4ccba1878 --datadir=~/.bzz-data/ --password=config/development/password --corsdomain=http://localhost:8000,http://localhost:8080,http://localhost:8545,ws://localhost:8546 --ens-api='' |
To build truly decentralized applications, we probably want to upload and host our application’s assets on a decentralized storage network as well. In this guide we’ll explore how to upload data to IPFS and Swarm using Embark.
\nupload
commandTo upload our application to IPFS or Swarm, we first need to ensure we have correctly set up our storage configuration.
\nOnce that is done we can use Embark’s upload
command to take the assets located in the configured buildDir
(read here for more information) and upload it to the configured storage network.
$ embark upload |
Similar to other available services that Embark supports, we can upload our data to different environments. The follow command uploads data using the livenet
environment configuration:
$ embark upload livenet |
We can associate our uploaded data to an ENS domain by using the --ens
option. This will take the storage hash and upload it to an ENS domain.
For example, the following command will upload our application to IPFS or Swarm and connect it with the embark.eth
domain:
$ embark upload --ens=embark.etk |
Important:
\nYou need to be the owner of the given domain for this to work. Head over to ens.domains for more information.
\n\nTo build truly decentralized applications, we probably want to upload and host our application’s assets on a decentralized storage network as well. In this guide we’ll explore how to upload data to IPFS and Swarm using Embark.
\nupload
commandTo upload our application to IPFS or Swarm, we first need to ensure we have correctly set up our storage configuration.
\nOnce that is done we can use Embark’s upload
command to take the assets located in the configured buildDir
(read here for more information) and upload it to the configured storage network.
$ embark upload |
Similar to other available services that Embark supports, we can upload our data to different environments. The follow command uploads data using the livenet
environment configuration:
$ embark upload livenet |
We can associate our uploaded data to an ENS domain by using the --ens
option. This will take the storage hash and upload it to an ENS domain.
For example, the following command will upload our application to IPFS or Swarm and connect it with the embark.eth
domain:
$ embark upload --ens=embark.etk |
Important:
\nYou need to be the owner of the given domain for this to work. Head over to ens.domains for more information.
\n\nAs mentioned in our guide on Using EmbarkJS, Embark’s companion JavaScript library EmbarkJS comes with APIs specifically designed to make working with decentralized Storages a breeze. Let’s a have closer look at what EmbarkJS.Storage
has to offer.
By default Embark will automatically initialize EmbarkJS with the provider configured at config/storage.js
. However if we are using EmbarkJS directly or wish to change the provider configuration at run time, we can do so using the setProvider()
method:
EmbarkJS.Storage.setProvider('swarm', options); |
Options are optional and if provided, will override the values in storage.js
. Here’s what a manual configuration could look like:
EmbarkJS.Storage.setProvider('ipfs', { |
String data can be easily uploaded to the configured storage using EmbarkJS.Storage.saveText()
. This method takes any string and returns a Promise that resolves with a storage hash that can then be used to retrieve the data:
EmbarkJS.Storage |
If we happen to have a storage hash, we can use to to retrieve the data that’s associated to it using EmbarkJS.Storage.get()
as shown below. Just like saveText()
this method returns a Promise and resolves with the data the hash points to:
EmbarkJS.Storage.get(hash).then(content => { |
We can upload files as binary data using EmbarkJS as well. All we need is a reference to a DOM object of type input[type=file]
and pass it the uploadFile()
method. So assuming we had an input that looked something like this:
<input type="file"> |
We can upload its data like this:
\nconst input = document.querySelector('input[type=file"]'); |
Similar to saveText()
and get()
, this method returns a Promise and can be used with JavaScript’s async/await
syntec as well.
To display any uploaded data in the browser, we can request a fully qualified URL using EmbarkJS.Storage.getUrl()
and a dedicated storage hash:
EmbarkJS.Storage.getUrl(hash).then(url => { |
We can check whether our configured storage provider is available or not using isAvailable()
. This method resolves with either true
or false
depending on whether the service is available:
EmbarkJS.Storage.isAvailable().then(isAvailable => { |
We can register IPFS hashes using IPNS using the register()
method has shown below:
EmbarkJS.Storage.register(some_hash).then(name => { |
Note on registering hashes:
\nRegistering a hash with IPFS can take a bit of time, so keep that in mind when relying on these APIs.
\n\nAnd of course, we can resolve hashes to their IPFS paths as well, using the resolve()
method:
EmbarkJS.Storage.resolve(some_hash).then(name => { |
As mentioned in our guide on Using EmbarkJS, Embark’s companion JavaScript library EmbarkJS comes with APIs specifically designed to make working with decentralized Storages a breeze. Let’s a have closer look at what EmbarkJS.Storage
has to offer.
By default Embark will automatically initialize EmbarkJS with the provider configured at config/storage.js
. However if we are using EmbarkJS directly or wish to change the provider configuration at run time, we can do so using the setProvider()
method:
EmbarkJS.Storage.setProvider('swarm', options); |
Options are optional and if provided, will override the values in storage.js
. Here’s what a manual configuration could look like:
EmbarkJS.Storage.setProvider('ipfs', { |
String data can be easily uploaded to the configured storage using EmbarkJS.Storage.saveText()
. This method takes any string and returns a Promise that resolves with a storage hash that can then be used to retrieve the data:
EmbarkJS.Storage |
If we happen to have a storage hash, we can use to to retrieve the data that’s associated to it using EmbarkJS.Storage.get()
as shown below. Just like saveText()
this method returns a Promise and resolves with the data the hash points to:
EmbarkJS.Storage.get(hash).then(content => { |
We can upload files as binary data using EmbarkJS as well. All we need is a reference to a DOM object of type input[type=file]
and pass it the uploadFile()
method. So assuming we had an input that looked something like this:
<input type="file"> |
We can upload its data like this:
\nconst input = document.querySelector('input[type=file"]'); |
Similar to saveText()
and get()
, this method returns a Promise and can be used with JavaScript’s async/await
syntec as well.
To display any uploaded data in the browser, we can request a fully qualified URL using EmbarkJS.Storage.getUrl()
and a dedicated storage hash:
EmbarkJS.Storage.getUrl(hash).then(url => { |
We can check whether our configured storage provider is available or not using isAvailable()
. This method resolves with either true
or false
depending on whether the service is available:
EmbarkJS.Storage.isAvailable().then(isAvailable => { |
We can register IPFS hashes using IPNS using the register()
method has shown below:
EmbarkJS.Storage.register(some_hash).then(name => { |
Note on registering hashes:
\nRegistering a hash with IPFS can take a bit of time, so keep that in mind when relying on these APIs.
\n\nAnd of course, we can resolve hashes to their IPFS paths as well, using the resolve()
method:
EmbarkJS.Storage.resolve(some_hash).then(name => { |
Once a project is initialized, it’s a good time to take a look at the resulting project structure, to get a better idea of what’s going on. In this guide we’ll explore an Embark project’s structure and learn where to find different file types and configurations.
\nFor Smart Contract developers: This guide covers projects that have been created with the --contracts-only
option as well.
Project structure with other tools
\nSince Embark version 4.0.0, it’s possible (and recommended) to use Embark along with existing front-end tooling. This could be tools such as Angular CLI, Vue CLI or Create React App.
\nWhen using Embark in combination with any of these or similar tools, the application structure will likely look different as each of these tools comes with an opinion and preference on how an application should be structured.
\n\nAn Embark project’s structure is pretty straight forward. It contains a config
, a test
, an app
, a contracts
and a dist
folder for their dedicated purposes. Most of them are self explanatory, but let’s take a look at the overall file tree.
├── app/ |
This is where the frontend of our decentralized application lives. It doesn’t matter whether we prefer using one of the amazing frameworks out there, like Angular or Vue, or if we like writing vanilla JavaScript. Embark will build our application with all the source files it can find inside app
.
Smart Contracts go here. Embark will automatically compile, deploy & track our Smart Contracts from this directory. While Embark is running, it’ll detect changes made to any Smart Contract and re-deploy it and its dependencies if necessary.
\nThere are many different components inside a decentralized application that can be configured. Embark offers different configuration files for each of those components and gives us full control over how the different parts are behaving. The configuration files for the different components of the stack can be found here.
\nblockchain.js
This file contains the configuration used for Embark to run a blockchain node with an Ethereum client such as go-ethereum, Parity, or a simulator like Ganache.
contracts.js
This file contains the configuration for Smart Contracts, including their arguments and relationships between them, such as dependencies. Here we can also specify where to deploy our Smart Contracts and how the application should attempt to connect to a node. Please see Configuring Contracts for more details.
storage.js
This file lets us configure what storage component to use (e.g IPFS), including what node to connect to, to upload and retrieve data through the application. Head over to our guide on configuring decentralized storage for details configuring a decentralized storage system for our application.
communication.js
Similar to the other configuration files, this file can be used to configure what communication component should be used (e.g Whisper) and what node it should connect to. Check out our guide message configuration to learn more about the available configuration options.
webserver.js
This file contains the configuration for the webserver that Embark starts when developing our application. Configuration options are the host, port and other useful options, such as whether a browser window should be opened on start up or not.
Embark lets us write tests for our Smart Contracts in JavaScript as well as Solidity. All of our tests are located here. To learn more about testing with Embark head over to our guide on testing.
\nThe build output of our application will be put here. Everything inside this folder can be considered a production ready build artifact. This folder also gets uploaded to a decentralized storage using embark upload
.
This file is used to keep track of the deployed contracts in each chain. This is a super useful feature as it lets Embark figure out all by itself if and when a Smart Contract needs to be (re)deployed. See chains file documentation for more information
\nIn order to provide as much flexibility for our users as possible, Embark comes with an embark.json
file that lets us configure our own directory structure. This file is also used to specify Embark plugins and other configurations. More information on how to use this configuration file, can be found in configuring embark.json.
When creating a project using the --contracts-only
option, the resulting structure is a little bit simpler. Let’s take quick look:
├── contracts/ |
Most components or services that our application could take advantage of are disabled with the exception of Smart Contracts support, but we can still re-enable them in the embark.json
configuration file if needed. Notice that this time, the contracts.js
config file is in the root of the project’s directory. This is because in the embark.json
config file,contracts
points to a path in the same folder.
... |
As mentioned earlier, other services like storage and blockchain support can be easily re-enabled by changing them to path values as well.
\nAwesome, now that we have a better understanding of what a project in Embark looks like, let’s head over to the next guide and explore the different ways of running an application with Embark!
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Once a project is initialized, it’s a good time to take a look at the resulting project structure, to get a better idea of what’s going on. In this guide we’ll explore an Embark project’s structure and learn where to find different file types and configurations.
\nFor Smart Contract developers: This guide covers projects that have been created with the --contracts-only
option as well.
Project structure with other tools
\nSince Embark version 4.0.0, it’s possible (and recommended) to use Embark along with existing front-end tooling. This could be tools such as Angular CLI, Vue CLI or Create React App.
\nWhen using Embark in combination with any of these or similar tools, the application structure will likely look different as each of these tools comes with an opinion and preference on how an application should be structured.
\n\nAn Embark project’s structure is pretty straight forward. It contains a config
, a test
, an app
, a contracts
and a dist
folder for their dedicated purposes. Most of them are self explanatory, but let’s take a look at the overall file tree.
├── app/ |
This is where the frontend of our decentralized application lives. It doesn’t matter whether we prefer using one of the amazing frameworks out there, like Angular or Vue, or if we like writing vanilla JavaScript. Embark will build our application with all the source files it can find inside app
.
Smart Contracts go here. Embark will automatically compile, deploy & track our Smart Contracts from this directory. While Embark is running, it’ll detect changes made to any Smart Contract and re-deploy it and its dependencies if necessary.
\nThere are many different components inside a decentralized application that can be configured. Embark offers different configuration files for each of those components and gives us full control over how the different parts are behaving. The configuration files for the different components of the stack can be found here.
\nblockchain.js
This file contains the configuration used for Embark to run a blockchain node with an Ethereum client such as go-ethereum, Parity, or a simulator like Ganache.
contracts.js
This file contains the configuration for Smart Contracts, including their arguments and relationships between them, such as dependencies. Here we can also specify where to deploy our Smart Contracts and how the application should attempt to connect to a node. Please see Configuring Contracts for more details.
storage.js
This file lets us configure what storage component to use (e.g IPFS), including what node to connect to, to upload and retrieve data through the application. Head over to our guide on configuring decentralized storage for details configuring a decentralized storage system for our application.
communication.js
Similar to the other configuration files, this file can be used to configure what communication component should be used (e.g Whisper) and what node it should connect to. Check out our guide message configuration to learn more about the available configuration options.
webserver.js
This file contains the configuration for the webserver that Embark starts when developing our application. Configuration options are the host, port and other useful options, such as whether a browser window should be opened on start up or not.
Embark lets us write tests for our Smart Contracts in JavaScript as well as Solidity. All of our tests are located here. To learn more about testing with Embark head over to our guide on testing.
\nThe build output of our application will be put here. Everything inside this folder can be considered a production ready build artifact. This folder also gets uploaded to a decentralized storage using embark upload
.
This file is used to keep track of the deployed contracts in each chain. This is a super useful feature as it lets Embark figure out all by itself if and when a Smart Contract needs to be (re)deployed. See chains file documentation for more information
\nIn order to provide as much flexibility for our users as possible, Embark comes with an embark.json
file that lets us configure our own directory structure. This file is also used to specify Embark plugins and other configurations. More information on how to use this configuration file, can be found in configuring embark.json.
When creating a project using the --contracts-only
option, the resulting structure is a little bit simpler. Let’s take quick look:
├── contracts/ |
Most components or services that our application could take advantage of are disabled with the exception of Smart Contracts support, but we can still re-enable them in the embark.json
configuration file if needed. Notice that this time, the contracts.js
config file is in the root of the project’s directory. This is because in the embark.json
config file,contracts
points to a path in the same folder.
... |
As mentioned earlier, other services like storage and blockchain support can be easily re-enabled by changing them to path values as well.
\nAwesome, now that we have a better understanding of what a project in Embark looks like, let’s head over to the next guide and explore the different ways of running an application with Embark!
\n"},{"title":"Using the Cockpit Debugger","layout":"docs","_content":"\nCockpit comes with a very powerful integrated debugger similar to the one provided by the [Remix](https://remix.ethereum.org/) browser IDE. Having an integrated debugger experience right at our finger tips makes us more productive when building decentralized applications and improves our developer experience.\n\nIn this guide we'll take a look at how to use the debugger.\n\n## Entering the Debugger\n\nFirst things first, we need to know where to find the debugger and how to enter it. In Cockpit, basically any transaction that is a Smart Contract call can be debugged.\n\nTherefore, there are different entry points to the debugger. Most of the UI components that represent transaction come with a \"Debug\" button. Clicking that button takes us to Cockpit's [Code Editor](/docs/cockpit_editor.html) in its debugging mode.\n\nProbably the most straight forward way to do that is entering the [Explorer](/docs/cockpit_explorer.html) and simply select any transaction that is a Smart Contract call.\n\n![Cockpit Enter Debugger](/assets/images/cockpit_enter_debugger.gif)\n\n## Debugger View\n\nOnce we enter the debugger mode inside the Code Editor we'll see that Cockpit provides us with several controls to and variable scopes to debug transactions. The controls are very similar to controls in other debugger tools (such as the browser devtools). \n\n![Cockpit Debugger Controls](/assets/images/cockpit_debugger_controls.png)\n\nFrom left to right, the controls are:\n\n- **Jump to previous breakpoint** - Jumps to the previous available breakpoint within the current function\n- **Jump to next breakpoint** - Jumps to the next available breakpoint within the current function\n- **Step over previous function call** - Executes the previous function without stepping into it\n- **Step over next function call** - Executes the next function without stepping into it\n- **Step into previous function call** - Steps into the previous function call and sets temporary breakpoint\n- **Step into next function call** - Steps into the next function call and sets temporary breakpoint\n\nWhen using any of these controls, the breakpoint indicator in the source of the Smart Contract, as well as the variables in the Scopes view will update as well. \n\n![Cockpit Using Debugger](/assets/images/cockpit_using_debugger.gif)\n\n## Debugger variables\n\nAs we're using the debugger and step through function calls, Cockpit updates and outputs relevant variables within the scope of the function we're debugging. This is a very useful feature as we can see in real-time which variables contain which value.\n\nThe debugger provides variables in the following scopes:\n\n- **contract** - These are variable members of the Smart Contract instance itself.\n- **globals** - These are global variables available in the current scope of the function that is being debugged. This includes useful values such as the current `block` as well as `msg`.\n- **locals** - These are parameter variables scoped to the function that is being debugged.\n","source":"docs/cockpit_debugger.md","raw":"title: Using the Cockpit Debugger\nlayout: docs\n---\n\nCockpit comes with a very powerful integrated debugger similar to the one provided by the [Remix](https://remix.ethereum.org/) browser IDE. Having an integrated debugger experience right at our finger tips makes us more productive when building decentralized applications and improves our developer experience.\n\nIn this guide we'll take a look at how to use the debugger.\n\n## Entering the Debugger\n\nFirst things first, we need to know where to find the debugger and how to enter it. In Cockpit, basically any transaction that is a Smart Contract call can be debugged.\n\nTherefore, there are different entry points to the debugger. Most of the UI components that represent transaction come with a \"Debug\" button. Clicking that button takes us to Cockpit's [Code Editor](/docs/cockpit_editor.html) in its debugging mode.\n\nProbably the most straight forward way to do that is entering the [Explorer](/docs/cockpit_explorer.html) and simply select any transaction that is a Smart Contract call.\n\n![Cockpit Enter Debugger](/assets/images/cockpit_enter_debugger.gif)\n\n## Debugger View\n\nOnce we enter the debugger mode inside the Code Editor we'll see that Cockpit provides us with several controls to and variable scopes to debug transactions. The controls are very similar to controls in other debugger tools (such as the browser devtools). \n\n![Cockpit Debugger Controls](/assets/images/cockpit_debugger_controls.png)\n\nFrom left to right, the controls are:\n\n- **Jump to previous breakpoint** - Jumps to the previous available breakpoint within the current function\n- **Jump to next breakpoint** - Jumps to the next available breakpoint within the current function\n- **Step over previous function call** - Executes the previous function without stepping into it\n- **Step over next function call** - Executes the next function without stepping into it\n- **Step into previous function call** - Steps into the previous function call and sets temporary breakpoint\n- **Step into next function call** - Steps into the next function call and sets temporary breakpoint\n\nWhen using any of these controls, the breakpoint indicator in the source of the Smart Contract, as well as the variables in the Scopes view will update as well. \n\n![Cockpit Using Debugger](/assets/images/cockpit_using_debugger.gif)\n\n## Debugger variables\n\nAs we're using the debugger and step through function calls, Cockpit updates and outputs relevant variables within the scope of the function we're debugging. This is a very useful feature as we can see in real-time which variables contain which value.\n\nThe debugger provides variables in the following scopes:\n\n- **contract** - These are variable members of the Smart Contract instance itself.\n- **globals** - These are global variables available in the current scope of the function that is being debugged. This includes useful values such as the current `block` as well as `msg`.\n- **locals** - These are parameter variables scoped to the function that is being debugged.\n","date":"2020-01-17T19:00:03.896Z","updated":"2020-01-17T19:00:03.896Z","path":"docs/cockpit_debugger.html","comments":1,"_id":"ck5ijm3ry001r7hegh8osc273","content":"Cockpit comes with a very powerful integrated debugger similar to the one provided by the Remix browser IDE. Having an integrated debugger experience right at our finger tips makes us more productive when building decentralized applications and improves our developer experience.
\nIn this guide we’ll take a look at how to use the debugger.
\nFirst things first, we need to know where to find the debugger and how to enter it. In Cockpit, basically any transaction that is a Smart Contract call can be debugged.
\nTherefore, there are different entry points to the debugger. Most of the UI components that represent transaction come with a “Debug” button. Clicking that button takes us to Cockpit’s Code Editor in its debugging mode.
\nProbably the most straight forward way to do that is entering the Explorer and simply select any transaction that is a Smart Contract call.
\n\nOnce we enter the debugger mode inside the Code Editor we’ll see that Cockpit provides us with several controls to and variable scopes to debug transactions. The controls are very similar to controls in other debugger tools (such as the browser devtools).
\n\nFrom left to right, the controls are:
\nWhen using any of these controls, the breakpoint indicator in the source of the Smart Contract, as well as the variables in the Scopes view will update as well.
\n\nAs we’re using the debugger and step through function calls, Cockpit updates and outputs relevant variables within the scope of the function we’re debugging. This is a very useful feature as we can see in real-time which variables contain which value.
\nThe debugger provides variables in the following scopes:
\nblock
as well as msg
.Cockpit comes with a very powerful integrated debugger similar to the one provided by the Remix browser IDE. Having an integrated debugger experience right at our finger tips makes us more productive when building decentralized applications and improves our developer experience.
\nIn this guide we’ll take a look at how to use the debugger.
\nFirst things first, we need to know where to find the debugger and how to enter it. In Cockpit, basically any transaction that is a Smart Contract call can be debugged.
\nTherefore, there are different entry points to the debugger. Most of the UI components that represent transaction come with a “Debug” button. Clicking that button takes us to Cockpit’s Code Editor in its debugging mode.
\nProbably the most straight forward way to do that is entering the Explorer and simply select any transaction that is a Smart Contract call.
\n\nOnce we enter the debugger mode inside the Code Editor we’ll see that Cockpit provides us with several controls to and variable scopes to debug transactions. The controls are very similar to controls in other debugger tools (such as the browser devtools).
\n\nFrom left to right, the controls are:
\nWhen using any of these controls, the breakpoint indicator in the source of the Smart Contract, as well as the variables in the Scopes view will update as well.
\n\nAs we’re using the debugger and step through function calls, Cockpit updates and outputs relevant variables within the scope of the function we’re debugging. This is a very useful feature as we can see in real-time which variables contain which value.
\nThe debugger provides variables in the following scopes:
\nblock
as well as msg
.In case you’re experiencing problems with using Embark, here is a list of solutions to some frequently encountered issues. If this page doesn’t help you solve your problem, try doing a search on GitHub.
\nnode-gyp can cause problems, because it requires a C++ compiler.
\nIf you do have problems caused by it, first follow the installation steps for your OS here.
\nIf you still have problems and are on Windows, try the following:
\nnpm config set msvs_version 2015
before npm install
Issues typically occur if NodeJS and/or Embark are installed using sudo
, avoid using it possible. There are several options to fix this. We recommend installing node using NVM
This warning happens when Embark can’t deploy one of your Smart Contracts because the compiler did not return a bytecode.
\nHere are some of the reasons:
\npublic
In case you’re experiencing problems with using Embark, here is a list of solutions to some frequently encountered issues. If this page doesn’t help you solve your problem, try doing a search on GitHub.
\nnode-gyp can cause problems, because it requires a C++ compiler.
\nIf you do have problems caused by it, first follow the installation steps for your OS here.
\nIf you still have problems and are on Windows, try the following:
\nnpm config set msvs_version 2015
before npm install
Issues typically occur if NodeJS and/or Embark are installed using sudo
, avoid using it possible. There are several options to fix this. We recommend installing node using NVM
This warning happens when Embark can’t deploy one of your Smart Contracts because the compiler did not return a bytecode.
\nHere are some of the reasons:
\npublic
EmbarkJS.Storage.saveText(\"hello world\")\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS saveText Error => \" + err.message);\n }\n });\n
\n\n### Retrieve Text/Data\n\nEmbarkJS.Storage.get(hash)\n .then(function(content) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS get Error => \" + err.message);\n }\n });\n
\n\n### Upload a file\n\n<input type="file">\n
\nvar input = $(\"input[type=file\"]);\nEmbarkJS.Storage.uploadFile(input)\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS uploadFile Error => \" + err.message);\n }\n });\n
\n\n### Display a file\n\nEmbarkJS.Storage.getUrl(hash);\n
\n\n### Check for storage provider availability\nThis will return true if the storage provider (IPFS or Swarm) is available and running. \n\nEmbarkJS.Storage.isAvailable()\n .then(isAvailable => { alert(`The storage provider is: ${isAvailable ? 'available' : 'not available'}`) })\n .catch(function(err) {\n if(err){\n console.log(\"Error getting storage provider availability => \" + err.message);\n }\n });\n
\n\n### Setup\n\nBy default Embark will automatically initialize EmbarkJS with the provider configured at `config/storage.js`. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:\n\nEmbarkJS.Storage.setProvider('swarm', options);\n
\n\nOptions are optional and if provided, will override the values in `storage.js`. \n\nFor example,\nEmbarkJS.Storage.setProvider('ipfs', {server: 'localhost', port: '5001'});\n// OR\nEmbarkJS.Storage.setProvider('swarm', {server: 'swarm-gateways.net', port: '80'});\n
\n\n### IPNS registration\n\nYou can register your IPFS hash using IPNS.\n\n*It can take up to a minute to register.\n\n#### IPNS - Register\n\n```Javascript\nEmbarkJS.Storage.register('IPFS_hash', (err, name) => {\n if(err){\n console.log(\"Error registering\", err.message);\n return;\n }\n console.log('Registred to the following hash:', name);\n});\n```\n\n#### IPNS - Resolve\n\n```Javascript\nEmbarkJS.Storage.resolve('IPNS_hash', (err, path) => {\n if(err){\n console.log(\"Error resolving\", err.message);\n return;\n }\n console.log('Resolved to the following IPFS path:', name);\n});\n```\n\n","source":"docs/using_storages.md","raw":"title: Using Storages\nlayout: docs\n---\n\n### Save Text/Data\n\nEmbarkJS.Storage.saveText(\"hello world\")\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS saveText Error => \" + err.message);\n }\n });\n
\n\n### Retrieve Text/Data\n\nEmbarkJS.Storage.get(hash)\n .then(function(content) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS get Error => \" + err.message);\n }\n });\n
\n\n### Upload a file\n\n<input type="file">\n
\nvar input = $(\"input[type=file\"]);\nEmbarkJS.Storage.uploadFile(input)\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS uploadFile Error => \" + err.message);\n }\n });\n
\n\n### Display a file\n\nEmbarkJS.Storage.getUrl(hash);\n
\n\n### Check for storage provider availability\nThis will return true if the storage provider (IPFS or Swarm) is available and running. \n\nEmbarkJS.Storage.isAvailable()\n .then(isAvailable => { alert(`The storage provider is: ${isAvailable ? 'available' : 'not available'}`) })\n .catch(function(err) {\n if(err){\n console.log(\"Error getting storage provider availability => \" + err.message);\n }\n });\n
\n\n### Setup\n\nBy default Embark will automatically initialize EmbarkJS with the provider configured at `config/storage.js`. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:\n\nEmbarkJS.Storage.setProvider('swarm', options);\n
\n\nOptions are optional and if provided, will override the values in `storage.js`. \n\nFor example,\nEmbarkJS.Storage.setProvider('ipfs', {server: 'localhost', port: '5001'});\n// OR\nEmbarkJS.Storage.setProvider('swarm', {server: 'swarm-gateways.net', port: '80'});\n
\n\n### IPNS registration\n\nYou can register your IPFS hash using IPNS.\n\n*It can take up to a minute to register.\n\n#### IPNS - Register\n\n```Javascript\nEmbarkJS.Storage.register('IPFS_hash', (err, name) => {\n if(err){\n console.log(\"Error registering\", err.message);\n return;\n }\n console.log('Registred to the following hash:', name);\n});\n```\n\n#### IPNS - Resolve\n\n```Javascript\nEmbarkJS.Storage.resolve('IPNS_hash', (err, path) => {\n if(err){\n console.log(\"Error resolving\", err.message);\n return;\n }\n console.log('Resolved to the following IPFS path:', name);\n});\n```\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/using_storages.html","comments":1,"_id":"ck5ijm3s0001t7heghjkv38tk","content":"EmbarkJS.Storage.saveText(\"hello world\")\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS saveText Error => \" + err.message);\n }\n });\n
\n\nEmbarkJS.Storage.get(hash)\n .then(function(content) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS get Error => \" + err.message);\n }\n });\n
\n\n<input type="file">\n
\nvar input = $(\"input[type=file\"]);\nEmbarkJS.Storage.uploadFile(input)\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS uploadFile Error => \" + err.message);\n }\n });\n
\n\nEmbarkJS.Storage.getUrl(hash);\n
\n\nThis will return true if the storage provider (IPFS or Swarm) is available and running.
\nEmbarkJS.Storage.isAvailable()\n .then(isAvailable => { alert(`The storage provider is: ${isAvailable ? 'available' : 'not available'}`) })\n .catch(function(err) {\n if(err){\n console.log(\"Error getting storage provider availability => \" + err.message);\n }\n });\n
\n\nBy default Embark will automatically initialize EmbarkJS with the provider configured at config/storage.js
. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:
EmbarkJS.Storage.setProvider('swarm', options);\n
\n\nOptions are optional and if provided, will override the values in storage.js
.
For example,
\nEmbarkJS.Storage.setProvider('ipfs', {server: 'localhost', port: '5001'});\n// OR\nEmbarkJS.Storage.setProvider('swarm', {server: 'swarm-gateways.net', port: '80'});\n
\n\nYou can register your IPFS hash using IPNS.
\n*It can take up to a minute to register.
\nEmbarkJS.Storage.register('IPFS_hash', (err, name) => { |
EmbarkJS.Storage.resolve('IPNS_hash', (err, path) => { |
EmbarkJS.Storage.saveText(\"hello world\")\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS saveText Error => \" + err.message);\n }\n });\n
\n\nEmbarkJS.Storage.get(hash)\n .then(function(content) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS get Error => \" + err.message);\n }\n });\n
\n\n<input type="file">\n
\nvar input = $(\"input[type=file\"]);\nEmbarkJS.Storage.uploadFile(input)\n .then(function(hash) {})\n .catch(function(err) {\n if(err){\n console.log(\"IPFS uploadFile Error => \" + err.message);\n }\n });\n
\n\nEmbarkJS.Storage.getUrl(hash);\n
\n\nThis will return true if the storage provider (IPFS or Swarm) is available and running.
\nEmbarkJS.Storage.isAvailable()\n .then(isAvailable => { alert(`The storage provider is: ${isAvailable ? 'available' : 'not available'}`) })\n .catch(function(err) {\n if(err){\n console.log(\"Error getting storage provider availability => \" + err.message);\n }\n });\n
\n\nBy default Embark will automatically initialize EmbarkJS with the provider configured at config/storage.js
. However if you are using EmbarkJS directly or wish to change the provider configuration on the fly you can do:
EmbarkJS.Storage.setProvider('swarm', options);\n
\n\nOptions are optional and if provided, will override the values in storage.js
.
For example,
\nEmbarkJS.Storage.setProvider('ipfs', {server: 'localhost', port: '5001'});\n// OR\nEmbarkJS.Storage.setProvider('swarm', {server: 'swarm-gateways.net', port: '80'});\n
\n\nYou can register your IPFS hash using IPNS.
\n*It can take up to a minute to register.
\nEmbarkJS.Storage.register('IPFS_hash', (err, name) => { |
EmbarkJS.Storage.resolve('IPNS_hash', (err, path) => { |
Another powerful feature of Embark is its interactive console. It helps you debugging your application and lets you talk to your already deployed Smart Contracts. In this guide we’ll take a closer look at how to work with it.
\nStarting Embark’s interactive console is just a matter of running
\n$ embark console |
Very similar to embark run
, Embark will compile and deploy your application, however, it won’t spin up a webserver for your application. After that, you’ll see a prompt sitting IDLE, waiting for you to enter commands.
Embark (development) > _ |
The console will surface the environment we’re running Embark in at the moment. If we don’t specify an environment, Embark will default to development
, as discussed in our guide on environments.
From now on, we can keep entering commands and have them processed by Embark until we’re done with whatever we’re aiming to do.
\nLet’s take a look at a few them!
\nhelp
commandProbably one of the most important commands is the console’s help
command. This will give us some useful information about what we can and what we can not do inside the interactive console.
Enter the following command and see for yourself:
\nEmbark (development) > help<ENTER> |
This is a good time to read a bit through the available commands and familiarize yourself with them.
\nBy default, Embark will log output from all processes into the console. Since this can get quite verbose sometimes, we can disable logging for certain processes using the log
command.
Simply specify the process and turn it on
or off
:
Embark (development) > log ipfs off |
One thing that the console’s help doesn’t tell us, is that each and every of our deployed Smart Contracts is available as descriptive JavaScript object. Simply enter the name of your Smart Contract and Embark will output its structure, properties and methods:
\nEmbark (development) > SimpleStorage<ENTER> |
This turns out to be very useful when inspecting available methods and properties on already deployed Smart Contracts. Notice that not only your own Smart Contract’s are available within the interactive console, but also 3rd-party Smart Contracts that have been configured accordingly.
\nThe interactive console comes with its own JavaScript execution context, meaning we can actually run JavaScript code from inside the console.
\nThis applies to synchronous as well as asynchronous APIs, which is very common when dealing with Smart Contract instances. There is different ways to use asynchronous APIs in JavaScript. Smart Contract instances tend to use Promise
-based APIs, making them a great fit for JavaScript’s async/await
syntax.
await
is an ES2015 keyword that is very useful when dealing with asynchronous APIs. It let’s us wait for a Promise to resolve and simply returns the result.
In both the dashboard’s console and the standalone console, you can use await
for Promise
-based calls:
Embark (development) > await SimpleStorage.methods.get().call()<ENTER> |
This works with other objects as well. The following example outputs available accounts emitted by the web3
object:
Embark (development) > await web3.eth.getAccounts()<ENTER> |
We can also install Embark plugins using the interactive console. This can be done using the plugin
command.
Embark (development) > plugin install embark-status |
This will install and load the plugin, without the need to restart Embark.
\nWhen using Cockpit, Embark’s companion web interface, it’s necessary to authenticate through the web browser with the Embark process we want Cockpit to connect to. Embark and Cockpit use an authentication token based system for that. All we have to do is entering a valid token in the authentication mask, or append it as a query parameter to Cockpit.
\nTo get a valid token, use the token
command, which will output the token and copy it to your clipboard:
Embark (development) > token<ENTER> |
It’s possible to extend Embark’s interactive console to include custom commands. Head over to our Plugin guide which discusses this in more detail!
\nIn our section on using the dashboard we’ve slightly mentioned that Embark’s dashboard comes with a console as well and you might wonder, why there’s a separate command to start an interactive console in standalone mode.
\nThis is a very valid question, so here are a few scenarios where you might want to prefer running the interactive console over the dashboard:
\nAs the last point suggests, running embark console
when Embark is already running on your machine, it’ll connect to that existing process,
letting you interact with an already deployed application.
Another powerful feature of Embark is its interactive console. It helps you debugging your application and lets you talk to your already deployed Smart Contracts. In this guide we’ll take a closer look at how to work with it.
\nStarting Embark’s interactive console is just a matter of running
\n$ embark console |
Very similar to embark run
, Embark will compile and deploy your application, however, it won’t spin up a webserver for your application. After that, you’ll see a prompt sitting IDLE, waiting for you to enter commands.
Embark (development) > _ |
The console will surface the environment we’re running Embark in at the moment. If we don’t specify an environment, Embark will default to development
, as discussed in our guide on environments.
From now on, we can keep entering commands and have them processed by Embark until we’re done with whatever we’re aiming to do.
\nLet’s take a look at a few them!
\nhelp
commandProbably one of the most important commands is the console’s help
command. This will give us some useful information about what we can and what we can not do inside the interactive console.
Enter the following command and see for yourself:
\nEmbark (development) > help<ENTER> |
This is a good time to read a bit through the available commands and familiarize yourself with them.
\nBy default, Embark will log output from all processes into the console. Since this can get quite verbose sometimes, we can disable logging for certain processes using the log
command.
Simply specify the process and turn it on
or off
:
Embark (development) > log ipfs off |
One thing that the console’s help doesn’t tell us, is that each and every of our deployed Smart Contracts is available as descriptive JavaScript object. Simply enter the name of your Smart Contract and Embark will output its structure, properties and methods:
\nEmbark (development) > SimpleStorage<ENTER> |
This turns out to be very useful when inspecting available methods and properties on already deployed Smart Contracts. Notice that not only your own Smart Contract’s are available within the interactive console, but also 3rd-party Smart Contracts that have been configured accordingly.
\nThe interactive console comes with its own JavaScript execution context, meaning we can actually run JavaScript code from inside the console.
\nThis applies to synchronous as well as asynchronous APIs, which is very common when dealing with Smart Contract instances. There is different ways to use asynchronous APIs in JavaScript. Smart Contract instances tend to use Promise
-based APIs, making them a great fit for JavaScript’s async/await
syntax.
await
is an ES2015 keyword that is very useful when dealing with asynchronous APIs. It let’s us wait for a Promise to resolve and simply returns the result.
In both the dashboard’s console and the standalone console, you can use await
for Promise
-based calls:
Embark (development) > await SimpleStorage.methods.get().call()<ENTER> |
This works with other objects as well. The following example outputs available accounts emitted by the web3
object:
Embark (development) > await web3.eth.getAccounts()<ENTER> |
We can also install Embark plugins using the interactive console. This can be done using the plugin
command.
Embark (development) > plugin install embark-status |
This will install and load the plugin, without the need to restart Embark.
\nWhen using Cockpit, Embark’s companion web interface, it’s necessary to authenticate through the web browser with the Embark process we want Cockpit to connect to. Embark and Cockpit use an authentication token based system for that. All we have to do is entering a valid token in the authentication mask, or append it as a query parameter to Cockpit.
\nTo get a valid token, use the token
command, which will output the token and copy it to your clipboard:
Embark (development) > token<ENTER> |
It’s possible to extend Embark’s interactive console to include custom commands. Head over to our Plugin guide which discusses this in more detail!
\nIn our section on using the dashboard we’ve slightly mentioned that Embark’s dashboard comes with a console as well and you might wonder, why there’s a separate command to start an interactive console in standalone mode.
\nThis is a very valid question, so here are a few scenarios where you might want to prefer running the interactive console over the dashboard:
\nAs the last point suggests, running embark console
when Embark is already running on your machine, it’ll connect to that existing process,
letting you interact with an already deployed application.
$ embark demo
\n\nInside the demo's root directory, remove `contracts/simple_storage.sol` and replace it with this file instead:\n\n# contracts/SimpleStorage.vy\nstoredData: public(uint256)\n\n@public\ndef __init__(initialValue: uint256):\n self.storedData = initialValue\n\n@public\n@payable\ndef set(x: uint256):\n self.storedData = x\n\n@public\ndef get() -> uint256:\n return self.storedData\n
\n\nThis has exactly the same logic as its Solidity counterpart, so the tests will still pass:\n\n$ embark test
\n\nThe full documentation for Vyper can be found [here](https://vyper.readthedocs.io/en/latest/vyper-by-example.html)\n","source":"docs/vyper.md","raw":"title: Vyper\n---\n\nAs of Embark 3.0, Vyper is supported out of the box. You only need to [install the compiler](https://vyper.readthedocs.io/en/latest/installing-vyper.html) yourself.\n\nEmbark's Vyper support means that any files with the extension `.vy` in the contracts directory will be deployed with the file name as the contract name, so, for instance, `contracts/Crowdfunding.vy` will be deployed as `Crowdfunding`.\n\nTo see Vyper in action, generate a new demo project by running:\n\n$ embark demo
\n\nInside the demo's root directory, remove `contracts/simple_storage.sol` and replace it with this file instead:\n\n# contracts/SimpleStorage.vy\nstoredData: public(uint256)\n\n@public\ndef __init__(initialValue: uint256):\n self.storedData = initialValue\n\n@public\n@payable\ndef set(x: uint256):\n self.storedData = x\n\n@public\ndef get() -> uint256:\n return self.storedData\n
\n\nThis has exactly the same logic as its Solidity counterpart, so the tests will still pass:\n\n$ embark test
\n\nThe full documentation for Vyper can be found [here](https://vyper.readthedocs.io/en/latest/vyper-by-example.html)\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/vyper.html","comments":1,"layout":"page","_id":"ck5ijm3s1001v7heg068n1gik","content":"As of Embark 3.0, Vyper is supported out of the box. You only need to install the compiler yourself.
\nEmbark’s Vyper support means that any files with the extension .vy
in the contracts directory will be deployed with the file name as the contract name, so, for instance, contracts/Crowdfunding.vy
will be deployed as Crowdfunding
.
To see Vyper in action, generate a new demo project by running:
\n$ embark demo
\n\nInside the demo’s root directory, remove contracts/simple_storage.sol
and replace it with this file instead:
# contracts/SimpleStorage.vy\nstoredData: public(uint256)\n\n@public\ndef __init__(initialValue: uint256):\n self.storedData = initialValue\n\n@public\n@payable\ndef set(x: uint256):\n self.storedData = x\n\n@public\ndef get() -> uint256:\n return self.storedData\n
\n\nThis has exactly the same logic as its Solidity counterpart, so the tests will still pass:
\n$ embark test
\n\nThe full documentation for Vyper can be found here
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"As of Embark 3.0, Vyper is supported out of the box. You only need to install the compiler yourself.
\nEmbark’s Vyper support means that any files with the extension .vy
in the contracts directory will be deployed with the file name as the contract name, so, for instance, contracts/Crowdfunding.vy
will be deployed as Crowdfunding
.
To see Vyper in action, generate a new demo project by running:
\n$ embark demo
\n\nInside the demo’s root directory, remove contracts/simple_storage.sol
and replace it with this file instead:
# contracts/SimpleStorage.vy\nstoredData: public(uint256)\n\n@public\ndef __init__(initialValue: uint256):\n self.storedData = initialValue\n\n@public\n@payable\ndef set(x: uint256):\n self.storedData = x\n\n@public\ndef get() -> uint256:\n return self.storedData\n
\n\nThis has exactly the same logic as its Solidity counterpart, so the tests will still pass:
\n$ embark test
\n\nThe full documentation for Vyper can be found here
\n"},{"title":"Web3.js Documentation","_content":"\nThe documentation for Web3.js can be found [here](https://web3js.readthedocs.io/en/v1.2.1/)\n","source":"docs/web3js.md","raw":"title: Web3.js Documentation\n---\n\nThe documentation for Web3.js can be found [here](https://web3js.readthedocs.io/en/v1.2.1/)\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/web3js.html","comments":1,"layout":"page","_id":"ck5ijm3s1001w7heg18r26xcv","content":"The documentation for Web3.js can be found here
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"The documentation for Web3.js can be found here
\n"},{"title":"Integrating with Webpack","_content":"\nTODO\n\n","source":"docs/webpack.md","raw":"title: Integrating with Webpack\n---\n\nTODO\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/webpack.html","comments":1,"layout":"page","_id":"ck5ijm3s2001x7heg2sqyh4ii","content":"TODO
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"TODO
\n"},{"title":"What is a DApp","_content":"\n## What is a DApp\n\nA Decentralized Application is a serverless html5 application that uses one or more decentralized technologies.\n\n","source":"docs/what_dapp.md","raw":"title: What is a DApp\n---\n\n## What is a DApp\n\nA Decentralized Application is a serverless html5 application that uses one or more decentralized technologies.\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/what_dapp.html","comments":1,"layout":"page","_id":"ck5ijm3s2001y7hegb6i804bx","content":"A Decentralized Application is a serverless html5 application that uses one or more decentralized technologies.
\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"A Decentralized Application is a serverless html5 application that uses one or more decentralized technologies.
\n"},{"title":"Working with Name Systems","layout":"docs","_content":"\nIn order to improve the user experience of decentralized applications that deal with smart contracts or Ethereum addresses in general, it's a good practice to take advantage of the [Ethereum Name Service](https://ens.domains/) and its registered, human-readable names. Embark provides APIs to either resolve a given domain to its corresponding address, or lookup a registered name by a given address.\n\nLet's take a look at how this is done.\n\n### Resolving a Domain to an address\n\nResolving a domain to its corresponding address is done by calling `EmbarkJS.Names.resolve`, which takes the domain in question as first argument and a callback function that has access to the resolved address as a second argument:\n\nEmbarkJS.Names.resolve('ethereum.eth', (err, result) => {\n if (err) {\n console.error('ENS resolve error', err);\n }\n console.log('ENS address', result)\n});\n
\n\nIf you prefer using Promises, Embark has got you covered! `EmbarkJS.Names.resolve` returns a promise that resolves with the corresponding address, or an error message in case the given domain doesn't resolve to an address:\n\nEmbarkJS.Names.resolve(\"ethereum.eth\").then(address => {\n console.log(\"the address for ethereum.eth is: \" + address);\n})\n
\n\n### Reverse resolve an ENS domain\n\nSimilar to resolving addresses, looking up domains is really just a matter of calling `EmbarkJS.Names.lookup`, which takes an address as argument. Just like `EmbarkJS.Names.resolve`, a callback can be used to get notified whether the lookup was successful or not:\n\nEmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\", (err, name) => {\n if (err) {\n console.error('ENS lookup error', err);\n }\n console.log(\"the domain is: \" + name);\n})\n
\n\nGuess what, `EmbarkJS.Names.lookup` also returns a Promise in case you prefer using those over callbacks:\n\nEmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\").then(name => {\n console.log(\"the domain is: \" + name);\n})\n
\n\n### Register a sub-domain\n\nThis enables you to register some others sub-domains.\nThis is mostly for demo purposes as it is only available in development.\n\n\n EmbarkJS.Names.registerSubDomain('newsubdomain', '0x4a17f35f0a9927fb4141aa91cbbc72c1b31598de', (err, transaction) => {\n if (err) {\n console.error('ENS register error', err);\n }\n console.log(`Successfully registered with ${transaction.gasUsed} gas`);\n});\n
\n\n","source":"docs/working_with_name_systems.md","raw":"title: Working with Name Systems\nlayout: docs\n---\n\nIn order to improve the user experience of decentralized applications that deal with smart contracts or Ethereum addresses in general, it's a good practice to take advantage of the [Ethereum Name Service](https://ens.domains/) and its registered, human-readable names. Embark provides APIs to either resolve a given domain to its corresponding address, or lookup a registered name by a given address.\n\nLet's take a look at how this is done.\n\n### Resolving a Domain to an address\n\nResolving a domain to its corresponding address is done by calling `EmbarkJS.Names.resolve`, which takes the domain in question as first argument and a callback function that has access to the resolved address as a second argument:\n\nEmbarkJS.Names.resolve('ethereum.eth', (err, result) => {\n if (err) {\n console.error('ENS resolve error', err);\n }\n console.log('ENS address', result)\n});\n
\n\nIf you prefer using Promises, Embark has got you covered! `EmbarkJS.Names.resolve` returns a promise that resolves with the corresponding address, or an error message in case the given domain doesn't resolve to an address:\n\nEmbarkJS.Names.resolve(\"ethereum.eth\").then(address => {\n console.log(\"the address for ethereum.eth is: \" + address);\n})\n
\n\n### Reverse resolve an ENS domain\n\nSimilar to resolving addresses, looking up domains is really just a matter of calling `EmbarkJS.Names.lookup`, which takes an address as argument. Just like `EmbarkJS.Names.resolve`, a callback can be used to get notified whether the lookup was successful or not:\n\nEmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\", (err, name) => {\n if (err) {\n console.error('ENS lookup error', err);\n }\n console.log(\"the domain is: \" + name);\n})\n
\n\nGuess what, `EmbarkJS.Names.lookup` also returns a Promise in case you prefer using those over callbacks:\n\nEmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\").then(name => {\n console.log(\"the domain is: \" + name);\n})\n
\n\n### Register a sub-domain\n\nThis enables you to register some others sub-domains.\nThis is mostly for demo purposes as it is only available in development.\n\n\n EmbarkJS.Names.registerSubDomain('newsubdomain', '0x4a17f35f0a9927fb4141aa91cbbc72c1b31598de', (err, transaction) => {\n if (err) {\n console.error('ENS register error', err);\n }\n console.log(`Successfully registered with ${transaction.gasUsed} gas`);\n});\n
\n\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"docs/working_with_name_systems.html","comments":1,"_id":"ck5ijm3s3001z7hegefgi88bl","content":"In order to improve the user experience of decentralized applications that deal with smart contracts or Ethereum addresses in general, it’s a good practice to take advantage of the Ethereum Name Service and its registered, human-readable names. Embark provides APIs to either resolve a given domain to its corresponding address, or lookup a registered name by a given address.
\nLet’s take a look at how this is done.
\nResolving a domain to its corresponding address is done by calling EmbarkJS.Names.resolve
, which takes the domain in question as first argument and a callback function that has access to the resolved address as a second argument:
EmbarkJS.Names.resolve('ethereum.eth', (err, result) => {\n if (err) {\n console.error('ENS resolve error', err);\n }\n console.log('ENS address', result)\n});\n
\n\nIf you prefer using Promises, Embark has got you covered! EmbarkJS.Names.resolve
returns a promise that resolves with the corresponding address, or an error message in case the given domain doesn’t resolve to an address:
EmbarkJS.Names.resolve(\"ethereum.eth\").then(address => {\n console.log(\"the address for ethereum.eth is: \" + address);\n})\n
\n\nSimilar to resolving addresses, looking up domains is really just a matter of calling EmbarkJS.Names.lookup
, which takes an address as argument. Just like EmbarkJS.Names.resolve
, a callback can be used to get notified whether the lookup was successful or not:
EmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\", (err, name) => {\n if (err) {\n console.error('ENS lookup error', err);\n }\n console.log(\"the domain is: \" + name);\n})\n
\n\nGuess what, EmbarkJS.Names.lookup
also returns a Promise in case you prefer using those over callbacks:
EmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\").then(name => {\n console.log(\"the domain is: \" + name);\n})\n
\n\nThis enables you to register some others sub-domains.
This is mostly for demo purposes as it is only available in development.
\n EmbarkJS.Names.registerSubDomain('newsubdomain', '0x4a17f35f0a9927fb4141aa91cbbc72c1b31598de', (err, transaction) => {\n if (err) {\n console.error('ENS register error', err);\n }\n console.log(`Successfully registered with ${transaction.gasUsed} gas`);\n});\n
\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"In order to improve the user experience of decentralized applications that deal with smart contracts or Ethereum addresses in general, it’s a good practice to take advantage of the Ethereum Name Service and its registered, human-readable names. Embark provides APIs to either resolve a given domain to its corresponding address, or lookup a registered name by a given address.
\nLet’s take a look at how this is done.
\nResolving a domain to its corresponding address is done by calling EmbarkJS.Names.resolve
, which takes the domain in question as first argument and a callback function that has access to the resolved address as a second argument:
EmbarkJS.Names.resolve('ethereum.eth', (err, result) => {\n if (err) {\n console.error('ENS resolve error', err);\n }\n console.log('ENS address', result)\n});\n
\n\nIf you prefer using Promises, Embark has got you covered! EmbarkJS.Names.resolve
returns a promise that resolves with the corresponding address, or an error message in case the given domain doesn’t resolve to an address:
EmbarkJS.Names.resolve(\"ethereum.eth\").then(address => {\n console.log(\"the address for ethereum.eth is: \" + address);\n})\n
\n\nSimilar to resolving addresses, looking up domains is really just a matter of calling EmbarkJS.Names.lookup
, which takes an address as argument. Just like EmbarkJS.Names.resolve
, a callback can be used to get notified whether the lookup was successful or not:
EmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\", (err, name) => {\n if (err) {\n console.error('ENS lookup error', err);\n }\n console.log(\"the domain is: \" + name);\n})\n
\n\nGuess what, EmbarkJS.Names.lookup
also returns a Promise in case you prefer using those over callbacks:
EmbarkJS.Names.lookup(\"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359\").then(name => {\n console.log(\"the domain is: \" + name);\n})\n
\n\nThis enables you to register some others sub-domains.
This is mostly for demo purposes as it is only available in development.
\n EmbarkJS.Names.registerSubDomain('newsubdomain', '0x4a17f35f0a9927fb4141aa91cbbc72c1b31598de', (err, transaction) => {\n if (err) {\n console.error('ENS register error', err);\n }\n console.log(`Successfully registered with ${transaction.gasUsed} gas`);\n});\n
\n\n"},{"title":"blog.header.title","tagline":"blog.header.tagline","layout":"blog","_content":"","source":"news/index.md","raw":"title: blog.header.title\ntagline: blog.header.tagline\nlayout: blog\n---\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"news/index.html","comments":1,"_id":"ck5ijm3s400207heg7ovygrsl","content":"","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":""},{"layout":"plugins","tagline":"plugins_page.header.tagline","title":"plugins_page.header.title","data":"plugins","intro":"plugins_page.intro_section.heading.referal","_content":"","source":"plugins/index.md","raw":"layout: plugins\ntagline: plugins_page.header.tagline\ntitle: plugins_page.header.title\ndata: plugins\nintro: plugins_page.intro_section.heading.referal\n---\n","date":"2020-01-17T19:00:03.900Z","updated":"2020-01-17T19:00:03.900Z","path":"plugins/index.html","comments":1,"_id":"ck5ijm3s400217heg1pdtd3jb","content":"","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":""},{"title":"Using Infura","_content":"\nTo deploy to a test network (or even the mainnet), you usually have [to synchronize a blockchain node yourself](/docs/blockchain_configuration.html#Testnet-configuration) to be able to connect.\n\nThere is thankfully another alternative to save time and it is to use something like [Infura](https://infura.io/), that has already synchronized nodes to which you can connect to.\n\nThey offer nodes for the most popular testnets like Ropsten, Kovan and Rinkeby and also for the main network.\n\n### Registration\n\nTo start you will need to first register with Infura. Go to [https://infura.io/register](https://infura.io/register) and register.\n\nAfterwards, you will get an API KEY by email. Save this key, you will need it to configure Infura. Careful, it is private.\n\n![Screenshot](infura_guide/api-keys.png)\n\n### Account Configuration\n\nTo deploy to Infura, we need to configure Embark with an account containing funds.\n\nIn this example we will use a mnemonic.\nIt is also possible to use a private key (the documentation for the accounts functionality can be found [here](/docs/contracts.html#Using-accounts-in-a-wallet)).\n\nMake sure to read our recommendations on how to make sure your credentials stay secure [here](/docs/contracts_deployment.html#Deploying-to-Mainnet).\n\nEdit your contract configuration (usually found at `config/contracts.js`) and add a new environment, which we will name `infura`:\n\n\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ]\n }\n}\n
\n\nMake sure the account has funds in the network you are deploying to. Most testnets have faucets.\nFor example you can find a faucet for Rinkeby [here](https://faucet.rinkeby.io/).\n\n### Adding Infura\n\nNow we will add the infura endpoint to our configuration. **You should replace the key in the `host` field with your own.**\nWe will use Rinkeby for this example. You can specify the network as `\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ],\n host: \"rinkeby.infura.io/YOUR_KEY\",\n port: false,\n protocol: 'https'\n type: \"rpc\"\n }\n}\n
\n\n### Deploying\n\nNow to deploy, all you need to do is run `embark run infura` and Embark will deploy using Infura!\n\n![Screenshot](infura_guide/lift-off.jpg)\n","source":"tutorials/infura_guide.md","raw":"title: Using Infura\n---\n\nTo deploy to a test network (or even the mainnet), you usually have [to synchronize a blockchain node yourself](/docs/blockchain_configuration.html#Testnet-configuration) to be able to connect.\n\nThere is thankfully another alternative to save time and it is to use something like [Infura](https://infura.io/), that has already synchronized nodes to which you can connect to.\n\nThey offer nodes for the most popular testnets like Ropsten, Kovan and Rinkeby and also for the main network.\n\n### Registration\n\nTo start you will need to first register with Infura. Go to [https://infura.io/register](https://infura.io/register) and register.\n\nAfterwards, you will get an API KEY by email. Save this key, you will need it to configure Infura. Careful, it is private.\n\n![Screenshot](infura_guide/api-keys.png)\n\n### Account Configuration\n\nTo deploy to Infura, we need to configure Embark with an account containing funds.\n\nIn this example we will use a mnemonic.\nIt is also possible to use a private key (the documentation for the accounts functionality can be found [here](/docs/contracts.html#Using-accounts-in-a-wallet)).\n\nMake sure to read our recommendations on how to make sure your credentials stay secure [here](/docs/contracts_deployment.html#Deploying-to-Mainnet).\n\nEdit your contract configuration (usually found at `config/contracts.js`) and add a new environment, which we will name `infura`:\n\n\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ]\n }\n}\n
\n\nMake sure the account has funds in the network you are deploying to. Most testnets have faucets.\nFor example you can find a faucet for Rinkeby [here](https://faucet.rinkeby.io/).\n\n### Adding Infura\n\nNow we will add the infura endpoint to our configuration. **You should replace the key in the `host` field with your own.**\nWe will use Rinkeby for this example. You can specify the network as `\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ],\n host: \"rinkeby.infura.io/YOUR_KEY\",\n port: false,\n protocol: 'https'\n type: \"rpc\"\n }\n}\n
\n\n### Deploying\n\nNow to deploy, all you need to do is run `embark run infura` and Embark will deploy using Infura!\n\n![Screenshot](infura_guide/lift-off.jpg)\n","date":"2020-01-17T19:00:03.904Z","updated":"2020-01-17T19:00:03.904Z","path":"tutorials/infura_guide.html","comments":1,"layout":"page","_id":"ck5ijm3s500227hegfai76hxj","content":"To deploy to a test network (or even the mainnet), you usually have to synchronize a blockchain node yourself to be able to connect.
\nThere is thankfully another alternative to save time and it is to use something like Infura, that has already synchronized nodes to which you can connect to.
\nThey offer nodes for the most popular testnets like Ropsten, Kovan and Rinkeby and also for the main network.
\nTo start you will need to first register with Infura. Go to https://infura.io/register and register.
\nAfterwards, you will get an API KEY by email. Save this key, you will need it to configure Infura. Careful, it is private.
\n\nTo deploy to Infura, we need to configure Embark with an account containing funds.
\nIn this example we will use a mnemonic.
It is also possible to use a private key (the documentation for the accounts functionality can be found here).
Make sure to read our recommendations on how to make sure your credentials stay secure here.
\nEdit your contract configuration (usually found at config/contracts.js
) and add a new environment, which we will name infura
:
\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ]\n }\n}\n
\n\nMake sure the account has funds in the network you are deploying to. Most testnets have faucets.
For example you can find a faucet for Rinkeby here.
Now we will add the infura endpoint to our configuration. You should replace the key in the host
field with your own.
We will use Rinkeby for this example. You can specify the network as <network>.infura.io
.
\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ],\n host: \"rinkeby.infura.io/YOUR_KEY\",\n port: false,\n protocol: 'https'\n type: \"rpc\"\n }\n}\n
\n\nNow to deploy, all you need to do is run embark run infura
and Embark will deploy using Infura!
To deploy to a test network (or even the mainnet), you usually have to synchronize a blockchain node yourself to be able to connect.
\nThere is thankfully another alternative to save time and it is to use something like Infura, that has already synchronized nodes to which you can connect to.
\nThey offer nodes for the most popular testnets like Ropsten, Kovan and Rinkeby and also for the main network.
\nTo start you will need to first register with Infura. Go to https://infura.io/register and register.
\nAfterwards, you will get an API KEY by email. Save this key, you will need it to configure Infura. Careful, it is private.
\n\nTo deploy to Infura, we need to configure Embark with an account containing funds.
\nIn this example we will use a mnemonic.
It is also possible to use a private key (the documentation for the accounts functionality can be found here).
Make sure to read our recommendations on how to make sure your credentials stay secure here.
\nEdit your contract configuration (usually found at config/contracts.js
) and add a new environment, which we will name infura
:
\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ]\n }\n}\n
\n\nMake sure the account has funds in the network you are deploying to. Most testnets have faucets.
For example you can find a faucet for Rinkeby here.
Now we will add the infura endpoint to our configuration. You should replace the key in the host
field with your own.
We will use Rinkeby for this example. You can specify the network as <network>.infura.io
.
\n\ninfura: {\n deployment:{\n accounts: [\n {\n mnemonic: process.env.yourMnemonic\n }\n ],\n host: \"rinkeby.infura.io/YOUR_KEY\",\n port: false,\n protocol: 'https'\n type: \"rpc\"\n }\n}\n
\n\nNow to deploy, all you need to do is run embark run infura
and Embark will deploy using Infura!
When in developing, to interact with a blockchain, it is necessary to use a local Ethereum node, either using a simulator or a client like Geth or Parity. In this guide we’ll explore how to configure a blockchain client we want Embark to connect to. Embark uses the blockchain.js
file inside the ./config
folder by default for blockchain related configurations. This can be configured to different locations if we want to.
Embark offers a lot of configuration options and most of them already come with a decent default so we can start right away.
\nHere are the common parameters. You will often need only a few of them to make your Embark node work.
\nIf you want more configuration options, you can find them here
\nmodule.exports = { |
Similar to configuring Smart Contracts, this config contains environments that help configuring certain parameters differently depending of the environment. You can read more about environments here.
\nMost of the options are self-explanatory, still, here are some brief descriptions:
\nOption | \nType: default | \nValue | \n
---|---|---|
enabled | \nboolean: true | \nWhether or not to spawn an Ethereum node | \n
client | \nstring: geth | \nClient to use for the Ethereum node. Currently supported: geth and parity | \n
miningMode | \nstring: dev | \nThe mining mode to use for the node.dev : This is a special mode where the node uses a development account as defaultAccount. This account is already funded and transactions are faster.auto : Uses a mining script to mine only when needed.always : Miner is always on.off : Turns off the miner | \n
endpoint | \nstring | \nEndpoint to connect to. Works for external endpoints (like Infura) and local ones too (only for nodes started by embark run ) | \n
accounts | \narray | \nAccounts array for the node and to deploy. When no account is given, defaults to one node account. For more details, go here | \n
Here are all the parameters you can use to customize your node. Note that they all come with defaults that make it that you don’t need to specify those.
\nWe recommend putting those inside the clientConfig
object a better structure.
Option | \nType: default | \nValue | \n
---|---|---|
rpcHost | \nstring: localhost | \nHost the RPC server listens to | \n
rpcPort | \nnumber: 8545 | \nPort the RPC server listens to | \n
rpcCorsDomain | \nobject | \nThe CORS domains the node accepts | \n
rpcCorsDomain.auto | \n\n | When set to true, Embark checks your other configurations to set the CORS domains. This only adds the required domains. | \n
rpcCorsDomain.additionalCors | \n\n | Manual list of CORS domains to accept. If auto is set to true , any URLs specified here will be applied in addition to those automatically added with auto . | \n
wsRPC | \nboolean: true | \nWhether or not to enable the Websocket server | \n
wsOrigins | \nobject | \nSame as rpcCorsDomain , but for the Websocket server | \n
wsHost | \nstring: localhost | \nSame as rpcHost , but for the Websocket server | \n
wsPort | \nnumber: 8546 | \nSame as rpcPort , but for the Websocket server | \n
ethereumClientBin | \nstring: geth | \nPath to the client binary. By default, Embark uses the client name as an executable (if it is in the PATH) | \n
datadir | \nstring | \nDirectory where to put the Node’s data (eg: keystores) | \n
networkType | \nstring: custom | \nCan be: testnet , rinkeby , kovan or custom, in which case, it will use the specified networkId | \n
networkId | \nnumber: 1337 | \nUsed when networkType is set as custom . List of known network ids | \n
nodiscover | \nboolean: true | \nDisables the peer discovery mechanism when set to true | \n
maxpeers | \nnumber: 0 | \nMaximum number of network peers | \n
proxy | \nboolean: true | \nWhether or not Embark should use a proxy to add functionalities. This proxy is used by Embark to see the different transactions that go through, for example, and shows them to you. | \n
targetGasLimit | \nnumber | \nArtificial target gas floor for the blocks to mine | \n
genesisBlock | \nstring | \nThe genesis file to use to create the network. This file is used when creating the network. It tells the client the parameters to initiate the node with. You can read more on genesis blocks here | \n
Using Parity and Metamask
\nParity has very strict CORS policies. In order to use it with Metamask (or any other browser extension), you need to add the extension’s URL in the CORS.
\nYou can do so by opening Metamask in its own tab. Then, copy the URL. It will look something like chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn
.
Afterwards, in your blockchain config, add it to additionalCors
of rpcCorsDomain
and wsOrigins
.
A private network is really similar to using the development mode of a client. The biggest differences is that it does not come with a default pre-funded account and it will not use POA (proof of authority), meaning that blocks will need to be mined.
\nLuckily, Embark has settings to limit the mining to a minimum so that everything can run smoothly while testing in a more realistic environment before going to a test network.
\nHere are common parameters for private net configurations:
\nprivatenet: { |
Note that we can always use the parameters we saw in the Common parameters section to override the default
parameters.
Option | \nType: value | \nDescription | \n
---|---|---|
miningMode | \nstring: auto | \nYou need to set miningMode to auto or always so you don’t use the development mode | \n
genesisBlock | \nstring | \nFile to start the chain in a clean state for your private network | \n
accounts | \narray | \nArray of accounts to connect to. Go to the Accounts configuration page to learn more on accounts | \n
Test networks are networks that are public. Knowing that, if we want to connect to a node that we control, we will first need to synchronize it. This can take hours, as we need to download the blocks that we are missing from the other peers.
\nThe big advantage of using a local synced node is that we have control over it and it preserves our privacy, as we aren’t using a third party node. However, as mentioned, it takes a lot of time to synchronize a node and also requires a lot of computer resources, so keep it in mind if you want to go down that route.
\ntestnet: { |
Here are the necessary parameters. Again, we can add more to override as you see fit.
\nOption | \nType: default | \nValue | \n
---|---|---|
networkType | \nstring: testnet | \nAgain, used to specify the network. testnet here represents Ropsten. You can change the network by using a networkId by changing networkType to custom | \n
syncMode | \nstring | \nBlockchain sync mode | \n
syncMode = 'light' | \n\n | Light clients synchronize a bare minimum of data and fetch necessary data on-demand from the network. Much lower in storage, potentially higher in bandwidth | \n
syncMode = 'fast' | \n\n | Faster, but higher store | \n
syncMode = 'full' | \n\n | Normal sync | \n
accounts | \narray | \nArray of accounts to connect to. Go to the Accounts configuration page to learn more on accounts | \n
Finally, the main network, a.k.a. mainnet. It may come as no surprise, but to sync to the mainnet, the step and configurations are actually the same as for a test network. The only major difference is that the networkType
needs to be custom
with the networkId
set to 1
.
mainnet: { |
When in developing, to interact with a blockchain, it is necessary to use a local Ethereum node, either using a simulator or a client like Geth or Parity. In this guide we’ll explore how to configure a blockchain client we want Embark to connect to. Embark uses the blockchain.js
file inside the ./config
folder by default for blockchain related configurations. This can be configured to different locations if we want to.
Embark offers a lot of configuration options and most of them already come with a decent default so we can start right away.
\nHere are the common parameters. You will often need only a few of them to make your Embark node work.
\nIf you want more configuration options, you can find them here
\nmodule.exports = { |
Similar to configuring Smart Contracts, this config contains environments that help configuring certain parameters differently depending of the environment. You can read more about environments here.
\nMost of the options are self-explanatory, still, here are some brief descriptions:
\nOption | \nType: default | \nValue | \n
---|---|---|
enabled | \nboolean: true | \nWhether or not to spawn an Ethereum node | \n
client | \nstring: geth | \nClient to use for the Ethereum node. Currently supported: geth and parity | \n
miningMode | \nstring: dev | \nThe mining mode to use for the node.dev : This is a special mode where the node uses a development account as defaultAccount. This account is already funded and transactions are faster.auto : Uses a mining script to mine only when needed.always : Miner is always on.off : Turns off the miner | \n
endpoint | \nstring | \nEndpoint to connect to. Works for external endpoints (like Infura) and local ones too (only for nodes started by embark run ) | \n
accounts | \narray | \nAccounts array for the node and to deploy. When no account is given, defaults to one node account. For more details, go here | \n
Here are all the parameters you can use to customize your node. Note that they all come with defaults that make it that you don’t need to specify those.
\nWe recommend putting those inside the clientConfig
object a better structure.
Option | \nType: default | \nValue | \n
---|---|---|
rpcHost | \nstring: localhost | \nHost the RPC server listens to | \n
rpcPort | \nnumber: 8545 | \nPort the RPC server listens to | \n
rpcCorsDomain | \nobject | \nThe CORS domains the node accepts | \n
rpcCorsDomain.auto | \n\n | When set to true, Embark checks your other configurations to set the CORS domains. This only adds the required domains. | \n
rpcCorsDomain.additionalCors | \n\n | Manual list of CORS domains to accept. If auto is set to true , any URLs specified here will be applied in addition to those automatically added with auto . | \n
wsRPC | \nboolean: true | \nWhether or not to enable the Websocket server | \n
wsOrigins | \nobject | \nSame as rpcCorsDomain , but for the Websocket server | \n
wsHost | \nstring: localhost | \nSame as rpcHost , but for the Websocket server | \n
wsPort | \nnumber: 8546 | \nSame as rpcPort , but for the Websocket server | \n
ethereumClientBin | \nstring: geth | \nPath to the client binary. By default, Embark uses the client name as an executable (if it is in the PATH) | \n
datadir | \nstring | \nDirectory where to put the Node’s data (eg: keystores) | \n
networkType | \nstring: custom | \nCan be: testnet , rinkeby , kovan or custom, in which case, it will use the specified networkId | \n
networkId | \nnumber: 1337 | \nUsed when networkType is set as custom . List of known network ids | \n
nodiscover | \nboolean: true | \nDisables the peer discovery mechanism when set to true | \n
maxpeers | \nnumber: 0 | \nMaximum number of network peers | \n
proxy | \nboolean: true | \nWhether or not Embark should use a proxy to add functionalities. This proxy is used by Embark to see the different transactions that go through, for example, and shows them to you. | \n
targetGasLimit | \nnumber | \nArtificial target gas floor for the blocks to mine | \n
genesisBlock | \nstring | \nThe genesis file to use to create the network. This file is used when creating the network. It tells the client the parameters to initiate the node with. You can read more on genesis blocks here | \n
Using Parity and Metamask
\nParity has very strict CORS policies. In order to use it with Metamask (or any other browser extension), you need to add the extension’s URL in the CORS.
\nYou can do so by opening Metamask in its own tab. Then, copy the URL. It will look something like chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn
.
Afterwards, in your blockchain config, add it to additionalCors
of rpcCorsDomain
and wsOrigins
.
A private network is really similar to using the development mode of a client. The biggest differences is that it does not come with a default pre-funded account and it will not use POA (proof of authority), meaning that blocks will need to be mined.
\nLuckily, Embark has settings to limit the mining to a minimum so that everything can run smoothly while testing in a more realistic environment before going to a test network.
\nHere are common parameters for private net configurations:
\nprivatenet: { |
Note that we can always use the parameters we saw in the Common parameters section to override the default
parameters.
Option | \nType: value | \nDescription | \n
---|---|---|
miningMode | \nstring: auto | \nYou need to set miningMode to auto or always so you don’t use the development mode | \n
genesisBlock | \nstring | \nFile to start the chain in a clean state for your private network | \n
accounts | \narray | \nArray of accounts to connect to. Go to the Accounts configuration page to learn more on accounts | \n
Test networks are networks that are public. Knowing that, if we want to connect to a node that we control, we will first need to synchronize it. This can take hours, as we need to download the blocks that we are missing from the other peers.
\nThe big advantage of using a local synced node is that we have control over it and it preserves our privacy, as we aren’t using a third party node. However, as mentioned, it takes a lot of time to synchronize a node and also requires a lot of computer resources, so keep it in mind if you want to go down that route.
\ntestnet: { |
Here are the necessary parameters. Again, we can add more to override as you see fit.
\nOption | \nType: default | \nValue | \n
---|---|---|
networkType | \nstring: testnet | \nAgain, used to specify the network. testnet here represents Ropsten. You can change the network by using a networkId by changing networkType to custom | \n
syncMode | \nstring | \nBlockchain sync mode | \n
syncMode = 'light' | \n\n | Light clients synchronize a bare minimum of data and fetch necessary data on-demand from the network. Much lower in storage, potentially higher in bandwidth | \n
syncMode = 'fast' | \n\n | Faster, but higher store | \n
syncMode = 'full' | \n\n | Normal sync | \n
accounts | \narray | \nArray of accounts to connect to. Go to the Accounts configuration page to learn more on accounts | \n
Finally, the main network, a.k.a. mainnet. It may come as no surprise, but to sync to the mainnet, the step and configurations are actually the same as for a test network. The only major difference is that the networkType
needs to be custom
with the networkId
set to 1
.
mainnet: { |
Testing is a crucial part of developing robust and high-quality software. That’s why Embark aims to make testing our Smart Contract as easy as possible. In this guide we’ll explore Embark specific testing APIs and how to write tests for our Smart Contracts.
\nTest files resides in a project’s test
folder. Any JavaScript file within test/
is considered a spec file and will be executed by Embark as such. A spec file contains test specs which are grouped in contract()
functions. A single spec is written using it()
blocks.
Here’s what such a test could look like:
\ncontract('SomeContract', () => { |
This is a single test spec which will always pass. We’re using a globally available assert
object to make assertions in our specs. If you’re familiar with the Mocha testing framework, this syntax might be familiar. In fact, Embark uses Mocha as a test runner behind the scenes.
contract()
is just an alias for Mocha’s describe()
function and is globally available. In general, global functions and objects are:
contract()
: Same as Mocha’s describe
config()
: Function to configure Embark and deploy contractsweb3
: Web3 objectassert
: Node’s assertdescribe()
, it()
, before()
, etc.If we want to use any of EmbarkJS’ APIs, we can require it as expected:
\nconst EmbarkJS = require('Embark/EmbarkJS'); |
For more information on EmbarkJS’s APIs, head over to this guide.
\nOnce we’ve written our tests, we can execute them using Embark’s test
command:
$ embark test |
As mentioned earlier, this will pick up all files inside the test/
folder and run them as test files.
If we aren’t interested in running all tests but only a specific subset, we can specify a test file as part of the test
command like this:
$ embark test test/SomeContract_spec.js |
By default, tests are run using an Ethereum simulator (Ganache). We can use the --node
option to change that behavior. Passing --node embark
to embark test
will use the Ethereum node associated with an already running embark process. We can also specify a custom endpoint, for example:
$ embark test --node ws://localhost:8556 |
When running tests, we can even get an idea of what the gas costs of our Smart Contract deployments are. Embark comes with a --gasDetails
option that makes this possible.
$ embark test --gasDetails |
When running tests, the default [environment}(/docs/environments.html) is test
. You can obviously change this using the --env
flag.
The special thing with the test
environment is that if you do not have a test
section in your module configuration, that module with be disabled (enabled: false
). This is done to speed up the test as if you don’t need a module, it is disabled.
Very similar to how we configure our Smart Contracts for deployment, we have to configure them for our tests as well. This is important, so that our Smart Contracts get deployed with the correct testing data.
\nTo do that, Embark adds a global config()
function to the execution context, which uses the same API as the configuration object for our application’s Smart Contracts. So if we had a SomeContract
that should be picked up for deployment, this is what the configuration would look like:
config({ |
One thing that’s important to note here is that, behind the scenes, Embark has to run config()
first to deploy the Smart Contracts and only then starts running tests. This will have an impact on the developer experience when importing Smart Contract instances within spec files. But more on that later.
A note on config()
\nThe global config()
function is used for Smart Contract deployment and therefore delays the execution of tests until deployment is done.
To write meaningful tests, we obviously want to interact with our Smart Contracts. As we know, Embark generates Smart Contract instances for us. All we have to do is importing and using them accordingly.
\nThe following code imports SomeContract
and calls an imaginary method on it inside a spec:
const SomeContract = require('EmbarkJS/contracts/SomeContract'); |
There’s one gotcha to keep in mind though. Looking at the snippet above, it seems like we can use SmartContract
right away once it is imported. However, this is not actually true. As mentioned earlier, Embark first has to actually deploy our Smart Contracts and until that happens, all imported Smart Contract references are empty objects.
This is not a problem anymore when using Smart Contract instances inside spec blocks, because we know that tests are executed after all Smart Contracts have been deployed. Embark will hydrate the imported references with actual data before the tests are run.
\nSmart Contract reference hydration
\nSmart Contract references imported from EmbarkJS are empty until the Smart Contract are actually deployed. This means Smart Contract references can only be used inside contract()
blocks.
Accounts within the testing environment can be configured just like we’re used to. The same rules apply here, and configuring an Ether balance is supported as well. Configuring custom accounts in tests is especially useful if we want to use a specific account for our tests.
\nconfig({ |
Obviously, we want to access all configured accounts as well. Sometimes we want to test functions or methods that require us to specify a from
address to send transactions from. For those cases we very likely want to access any of our our available accounts.
All available accounts are emitted by config()
and can be accessed using a callback parameter like this:
let accounts = []; |
You can also grab the accounts from the callback of the contract()
function (describe
alias):
contract('SomeContract', (accounts) => { |
By default, Embark will use an internal VM to run the tests. However we can also specify a node to connect to and run the tests there, using the host
, port
and type
options as shown below:
config({ |
You can configure the different Embark modules directly in your test file. The available modules are: storage, namesystem and communication.
\nAll configuration options for the respective modules are available. Also, the configurations you put inside the config
function are merged inside the ones that are in the configuration file (meaning that you don’t have to put all the provider options if they are already in the default configs).
config({ |
If the module is not started (eg. IPFS), Embark will start it for you.
\nAs mentioned earlier, Embark handles the deployment of our Smart Contracts using the function config()
function. If we wish to deploy particular Smart Contracts manually, we can do so using an imported Smart Contract reference. We just need to make sure that we’re doing this inside a contract()
block as discussed earlier:
const SimpleStorage = require('Embark/contracts/SimpleStorage'); |
Using assert.reverts
, you can easily assert that your transaction reverts.
await assert.reverts(contractMethodAndArguments[, options][, message]) |
contractMethodAndArguments
: [Function] Contract method to call send
on, including the argumentsoptions
: [Object] Optional options to pass to the send
functionmessage
: [String] Optional string to match the revert messageReturns a promise that you can wait for with await
.
it(\"should revert with a value lower than 5\", async function() { |
Using eventEmitted
, you can assert that a transaction has emitted an event. You can also check for the returned values.
assert.eventEmitted(transaction, event[, values]) |
transaction
: [Object] Transaction object returns by a send
callevent
: [String] Name of the event being emittedvalues
: [Array or Object] Optional array or object of the returned values of the event.it('asserts that the event was triggered', async function() { |
This function lets you increase the time of the EVM. It is useful in the case where you want to test expiration times for example.
\nawait increaseTime(amount); |
amount
: [Number] Number of seconds to increase
it(\"should have expired after increasing time\", async function () { |
Embark allows you to generate a coverage report for your Solidity Smart Contracts by passing the --coverage
option on the embark test
command.
$ embark test --coverage |
The generated report looks something like this:
\n\nThis gives us a birds-eye view on the state of the coverage of our Smart Contracts: how many of the functions were called, how many lines were hit, even whether all the branch cases were executed. When selecting a file, a more detailed report is produced. Here’s what it looks like:
\n\n","site":{"data":{"authors":{"iuri_matias":{"name":"Iuri Matias","twitter":"iurimatias","image":"https://pbs.twimg.com/profile_images/928272512181563392/iDJdvy2k_400x400.jpg"},"pascal_precht":{"name":"Pascal Precht","twitter":"pascalprecht","image":"https://pbs.twimg.com/profile_images/993785060733194241/p3oAIMDP_400x400.jpg"},"anthony_laibe":{"name":"Anthony Laibe","twitter":"a_laibe","image":"https://pbs.twimg.com/profile_images/257742900/13168239_400x400.jpg"},"jonathan_rainville":{"name":"Jonathan Rainville","twitter":"ShyolGhul","image":"https://pbs.twimg.com/profile_images/993873866878570496/-aE4byjj_400x400.jpg"},"andre_medeiros":{"name":"Andre Medeiros","twitter":"superdealloc","image":"https://pbs.twimg.com/profile_images/965722487735701504/m58KNgWN_400x400.jpg"},"eric_mastro":{"name":"Eric Mastro","twitter":"ericmastro","image":"https://avatars1.githubusercontent.com/u/5089238?s=460&v=4"},"michael_bradley":{"name":"Michael Bradley","image":"https://avatars3.githubusercontent.com/u/194260?s=460&v=4"},"richard_ramos":{"name":"Richard Ramos","twitter":"richardramos_me","image":"https://pbs.twimg.com/profile_images/1063160577973866496/aM313uHG_400x400.jpg"},"jonny_zerah":{"name":"Jonny Zerah","twitter":"jonnyzerah","image":"https://pbs.twimg.com/profile_images/1043774340490248192/gI9aGy17_400x400.jpg"},"robin_percy":{"name":"Robin Percy","twitter":"rbin","image":"https://avatars1.githubusercontent.com/u/29288325?s=400&v=4"}},"categories":{"tutorials":"Tutorials","announcements":"Announcements"},"languages":{"en":"English"},"plugins":[{"name":"embark-bamboo","description":"plugins_page.plugins.bamboo.desc","link":"https://www.npmjs.com/package/embark-bamboo","thumbnail":"bamboo.png","tags":["language","smart-contracts"]},{"name":"embark-solc","description":"plugins_page.plugins.solc.desc","link":"https://www.npmjs.com/package/embark-solc","thumbnail":"solidity.png","tags":["solidity","language","smart-contracts"]},{"name":"embark-solium","description":"plugins_page.plugins.solium.desc","link":"https://www.npmjs.com/package/embark-solium","thumbnail":"solium.png","tags":["linter","solidity","solium"]},{"name":"embark-etherscan-verifier","description":"plugins_page.plugins.verifier.desc","link":"https://www.npmjs.com/package/embark-etherscan-verifier","tags":["solidity","etherscan","smart-contracts"]},{"name":"embark-status","description":"plugins_page.plugins.status.desc","link":"https://www.npmjs.com/package/embark-status-plugin","thumbnail":"status.png","tags":["status","mobile"]},{"name":"embark-remix","description":"plugins_page.plugins.remix.desc","link":"https://www.npmjs.com/package/embark-remix","thumbnail":"remix.png","tags":["remix","debugger"]},{"name":"embark-slither","description":"plugins_page.plugins.slither.desc","link":"https://www.npmjs.com/package/embark-slither","tags":["solidity"]},{"name":"embark-snark","description":"plugins_page.plugins.snark.desc","link":"https://www.npmjs.com/package/embark-snark","tags":["snark"]},{"name":"embark-fortune","description":"plugins_page.plugins.fortune.desc","link":"https://www.npmjs.com/package/embark-fortune","thumbnail":"fortune.jpg","tags":["fun"]},{"name":"embark-pug","description":"plugins_page.plugins.pug.desc","link":"https://www.npmjs.com/package/embark-pug","legacy":true,"thumbnail":"pug.png","tags":["pug","jade","templates"]},{"name":"embark-haml","description":"plugins_page.plugins.haml.desc","link":"https://www.npmjs.com/package/embark-haml","legacy":true,"thumbnail":"haml.png","tags":["haml","templates"]},{"name":"embark-mythx","description":"plugins_page.plugins.mythx.desc","link":"https://www.npmjs.com/package/embark-mythx","thumbnail":"mythx.png","tags":["mythx","smart-contracts"]}],"menu":{"docs":"/docs/","plugins":"/plugins/","chat":"/chat/","blog":"/news/"},"sidebar":{"docs":{"getting_started":{"overview":"overview.html","installation":"installation.html","faq":"faq.html"},"general_usage":{"creating_project":"create_project.html","structure":"structure.html","running_apps":"running_apps.html","dashboard":"dashboard.html","using_the_console":"using_the_console.html","environments":"environments.html","configuration":"configuration.html","pipeline_and_webpack":"pipeline_and_webpack.html","javascript_usage":"javascript_usage.html"},"smart_contracts":{"contracts_configuration":"contracts_configuration.html","contracts_deployment":"contracts_deployment.html","contracts_imports":"contracts_imports.html","contracts_testing":"contracts_testing.html","contracts_javascript":"contracts_javascript.html"},"blockchain_node":{"blockchain_configuration":"blockchain_configuration.html","blockchain_accounts_configuration":"blockchain_accounts_configuration.html"},"storage":{"storage_configuration":"storage_configuration.html","storage_deployment":"storage_deployment.html","storage_javascript":"storage_javascript.html"},"messages":{"messages_configuration":"messages_configuration.html","messages_javascript":"messages_javascript.html"},"naming":{"naming_configuration":"naming_configuration.html","naming_javascript":"naming_javascript.html"},"plugins":{"installing_a_plugin":"installing_plugins.html","creating_a_plugin":"creating_plugins.html","plugin_reference":"plugin_reference.html"},"cockpit":{"cockpit_introduction":"cockpit_introduction.html","cockpit_dashboard":"cockpit_dashboard.html","cockpit_deployment":"cockpit_deployment.html","cockpit_explorer":"cockpit_explorer.html","cockpit_editor":"cockpit_editor.html","cockpit_debugger":"cockpit_debugger.html"},"reference":{"embark_commands":"embark_commands.html"},"miscellaneous":{"migrating_from_3":"migrating_from_3.x.html","troubleshooting":"troubleshooting.html","contributing":"contributing.html"}}},"templates":[{"name":"Vyper Template","description":"Template to demonstrate the use of the Vyper contracts","install":"embark new AppName --template vyper","thumbnail":"vyper.png","link":"https://github.com/embarklabs/embark-vyper-template","tags":["vyper","contracts"]},{"name":"Embark Demo React Template","description":"A React Application showcasing Embark's functionality","install":"embark demo","thumbnail":"react.png","link":"https://embark.status.im/docs/create_project.html#Creating-a-Demo-Project","tags":["react","contracts","whisper","ipfs"]},{"name":"Typescript Template","description":"Template with Typescript support pre-configured","thumbnail":"typescript.png","install":"embark new AppName --template typescript","link":"https://github.com/embarklabs/embark-typescript-template","tags":["typescript","frontend"]},{"name":"Vue.js Template","description":"Ready to use Template for using Embark with vue.js","thumbnail":"vuejs.png","install":"embark new AppName --template vue","link":"https://github.com/embarklabs/embark-vue-template","tags":["vue.js","frontend"]},{"name":"ethvtx Template","description":"Demo app for ethvtx, an Ethereum-Ready & Framework-Agnostic Redux configuration","thumbnail":"vortex.png","install":"embark new AppName --template Horyus/ethvtx_embark","link":"https://github.com/Horyus/ethvtx_embark","tags":["react"]},{"name":"Bamboo Template","description":"Template to demonstrate use of the Bamboo contracts","install":"embark new AppName --template bamboo","thumbnail":"bamboo.png","link":"https://github.com/embarklabs/embark-bamboo-template","tags":["bamboo","contracts"]},{"name":"Solidity Gas Golfing","description":"Boilerplate and tests for the first Solidity Gas Golfing Contest","thumbnail":"sggc.png","install":"embark new AppName --template embarklabs/sggc","link":"https://github.com/embarklabs/sggc","tags":["solidity","tests","fun"]}],"tutorials":[{"name":"How to create a Token Factory with Ethereum — Part 1","description":"Create and Deploy a Token with Ethereum","link":"/tutorials/token_factory_1.html","tags":["token","ethereum"]},{"name":"How to create a Token Factory with Ethereum — Part 2","description":"Create a DApp that can deploy Tokens on the fly","link":"/tutorials/token_factory_2.html","tags":["token","ethereum","client-side-deployment"]},{"name":"How to deploy to a testnet with Infura","description":"Deploy and interact with your Dapp on a testnet with the use of Infura","link":"/tutorials/infura_guide.html","tags":["ethereum","deployment","testnet"]}],"versions":{"latest":{"label":"stable (v4)","url":"https://embark.status.im/docs"},"3.2":{"label":"v3.2","url":"https://5ca4e0fdb29712000adde37f--embark-site-versions.netlify.com/docs/"}}}},"excerpt":"","more":"Testing is a crucial part of developing robust and high-quality software. That’s why Embark aims to make testing our Smart Contract as easy as possible. In this guide we’ll explore Embark specific testing APIs and how to write tests for our Smart Contracts.
\nTest files resides in a project’s test
folder. Any JavaScript file within test/
is considered a spec file and will be executed by Embark as such. A spec file contains test specs which are grouped in contract()
functions. A single spec is written using it()
blocks.
Here’s what such a test could look like:
\ncontract('SomeContract', () => { |
This is a single test spec which will always pass. We’re using a globally available assert
object to make assertions in our specs. If you’re familiar with the Mocha testing framework, this syntax might be familiar. In fact, Embark uses Mocha as a test runner behind the scenes.
contract()
is just an alias for Mocha’s describe()
function and is globally available. In general, global functions and objects are:
contract()
: Same as Mocha’s describe
config()
: Function to configure Embark and deploy contractsweb3
: Web3 objectassert
: Node’s assertdescribe()
, it()
, before()
, etc.If we want to use any of EmbarkJS’ APIs, we can require it as expected:
\nconst EmbarkJS = require('Embark/EmbarkJS'); |
For more information on EmbarkJS’s APIs, head over to this guide.
\nOnce we’ve written our tests, we can execute them using Embark’s test
command:
$ embark test |
As mentioned earlier, this will pick up all files inside the test/
folder and run them as test files.
If we aren’t interested in running all tests but only a specific subset, we can specify a test file as part of the test
command like this:
$ embark test test/SomeContract_spec.js |
By default, tests are run using an Ethereum simulator (Ganache). We can use the --node
option to change that behavior. Passing --node embark
to embark test
will use the Ethereum node associated with an already running embark process. We can also specify a custom endpoint, for example:
$ embark test --node ws://localhost:8556 |
When running tests, we can even get an idea of what the gas costs of our Smart Contract deployments are. Embark comes with a --gasDetails
option that makes this possible.
$ embark test --gasDetails |
When running tests, the default [environment}(/docs/environments.html) is test
. You can obviously change this using the --env
flag.
The special thing with the test
environment is that if you do not have a test
section in your module configuration, that module with be disabled (enabled: false
). This is done to speed up the test as if you don’t need a module, it is disabled.
Very similar to how we configure our Smart Contracts for deployment, we have to configure them for our tests as well. This is important, so that our Smart Contracts get deployed with the correct testing data.
\nTo do that, Embark adds a global config()
function to the execution context, which uses the same API as the configuration object for our application’s Smart Contracts. So if we had a SomeContract
that should be picked up for deployment, this is what the configuration would look like:
config({ |
One thing that’s important to note here is that, behind the scenes, Embark has to run config()
first to deploy the Smart Contracts and only then starts running tests. This will have an impact on the developer experience when importing Smart Contract instances within spec files. But more on that later.
A note on config()
\nThe global config()
function is used for Smart Contract deployment and therefore delays the execution of tests until deployment is done.
To write meaningful tests, we obviously want to interact with our Smart Contracts. As we know, Embark generates Smart Contract instances for us. All we have to do is importing and using them accordingly.
\nThe following code imports SomeContract
and calls an imaginary method on it inside a spec:
const SomeContract = require('EmbarkJS/contracts/SomeContract'); |
There’s one gotcha to keep in mind though. Looking at the snippet above, it seems like we can use SmartContract
right away once it is imported. However, this is not actually true. As mentioned earlier, Embark first has to actually deploy our Smart Contracts and until that happens, all imported Smart Contract references are empty objects.
This is not a problem anymore when using Smart Contract instances inside spec blocks, because we know that tests are executed after all Smart Contracts have been deployed. Embark will hydrate the imported references with actual data before the tests are run.
\nSmart Contract reference hydration
\nSmart Contract references imported from EmbarkJS are empty until the Smart Contract are actually deployed. This means Smart Contract references can only be used inside contract()
blocks.
Accounts within the testing environment can be configured just like we’re used to. The same rules apply here, and configuring an Ether balance is supported as well. Configuring custom accounts in tests is especially useful if we want to use a specific account for our tests.
\nconfig({ |
Obviously, we want to access all configured accounts as well. Sometimes we want to test functions or methods that require us to specify a from
address to send transactions from. For those cases we very likely want to access any of our our available accounts.
All available accounts are emitted by config()
and can be accessed using a callback parameter like this:
let accounts = []; |
You can also grab the accounts from the callback of the contract()
function (describe
alias):
contract('SomeContract', (accounts) => { |
By default, Embark will use an internal VM to run the tests. However we can also specify a node to connect to and run the tests there, using the host
, port
and type
options as shown below:
config({ |
You can configure the different Embark modules directly in your test file. The available modules are: storage, namesystem and communication.
\nAll configuration options for the respective modules are available. Also, the configurations you put inside the config
function are merged inside the ones that are in the configuration file (meaning that you don’t have to put all the provider options if they are already in the default configs).
config({ |
If the module is not started (eg. IPFS), Embark will start it for you.
\nAs mentioned earlier, Embark handles the deployment of our Smart Contracts using the function config()
function. If we wish to deploy particular Smart Contracts manually, we can do so using an imported Smart Contract reference. We just need to make sure that we’re doing this inside a contract()
block as discussed earlier:
const SimpleStorage = require('Embark/contracts/SimpleStorage'); |
Using assert.reverts
, you can easily assert that your transaction reverts.
await assert.reverts(contractMethodAndArguments[, options][, message]) |
contractMethodAndArguments
: [Function] Contract method to call send
on, including the argumentsoptions
: [Object] Optional options to pass to the send
functionmessage
: [String] Optional string to match the revert messageReturns a promise that you can wait for with await
.
it(\"should revert with a value lower than 5\", async function() { |
Using eventEmitted
, you can assert that a transaction has emitted an event. You can also check for the returned values.
assert.eventEmitted(transaction, event[, values]) |
transaction
: [Object] Transaction object returns by a send
callevent
: [String] Name of the event being emittedvalues
: [Array or Object] Optional array or object of the returned values of the event.it('asserts that the event was triggered', async function() { |
This function lets you increase the time of the EVM. It is useful in the case where you want to test expiration times for example.
\nawait increaseTime(amount); |
amount
: [Number] Number of seconds to increase
it(\"should have expired after increasing time\", async function () { |
Embark allows you to generate a coverage report for your Solidity Smart Contracts by passing the --coverage
option on the embark test
command.
$ embark test --coverage |
The generated report looks something like this:
\n\nThis gives us a birds-eye view on the state of the coverage of our Smart Contracts: how many of the functions were called, how many lines were hit, even whether all the branch cases were executed. When selecting a file, a more detailed report is produced. Here’s what it looks like:
\n\n"},{"title":"Contributing to Embark","layout":"docs","_content":"\nWe would love for you to contribute to Embark and help make it even better than it is\ntoday! As a contributor, here are the guidelines we would like you to follow:\n\n - [Code of Conduct](#coc)\n - [Question or Problem?](#question)\n - [Issues and Bugs](#issue)\n - [Feature Requests](#feature)\n - [Submission Guidelines](#submit)\n - [Coding Rules](#rules)\n - [Commit Message Guidelines](#commit)\n\n## Code of Conduct\nHelp us keep Embark open and inclusive. Please read and follow our [Code of Conduct](https://github.com/embarklabs/embark/blob/master/CODE_OF_CONDUCT.md).\n\n## Got a Question or Problem?\n\nDo not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests. You've got much better chances of getting your question answered on [Stack Exchange](https://ethereum.stackexchange.com/search?tab=newest&q=embark) where the questions should be tagged with tag `embark`.\n\nStack Exchange is a much better place to ask questions since:\n\n- there are thousands of people willing to help\n- questions and answers stay available for public viewing so your question / answer might help someone else\n- Stack Exchange's voting system assures that the best answers are prominently visible.\n\nTo save your and our time, we will systematically close all issues that are requests for general support and redirect people to Stack Exchange.\n\nIf you would like to chat about the question in real-time, you can reach out via [our gitter channel](https://gitter.im/embark-framework/Lobby).\n\n## Found a Bug?\nIf you find a bug in the source code, you can help us by\n[submitting an issue](#submit-issue) to our [GitHub Repository](https://github.com/embarklabs/embark/). Even better, you can\n[submit a Pull Request](#submit-pr) with a fix.\n\n## Missing a Feature?\nYou can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub\nRepository. If you would like to *implement* a new feature, please submit an issue with\na proposal for your work first, to be sure that we can use it.\nPlease consider what kind of change it is:\n\n* For a **Major Feature**, first open an issue and outline your proposal so that it can be\ndiscussed. This will also allow us to better coordinate our efforts, prevent duplication of work,\nand help you to craft the change so that it is successfully accepted into the project.\n* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).\n\n## Submission Guidelines\n\n### Submitting an Issue\n\nBefore you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available.\n\nWe want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it. In order to reproduce bugs, we will systematically ask you to provide steps to reproduce your issue.\n\nYou can file new issues by filling out our [new issue form](https://github.com/embarklabs/embark/issues/new/choose).\n\n### Submitting a Pull Request (PR)\nBefore you submit your Pull Request (PR) consider the following guidelines:\n\n1. Search [GitHub](https://github.com/embarklabs/embark/pulls) for an open or closed PR\n that relates to your submission. You don't want to duplicate effort.\n1. Fork the embarklabs/embark repo.\n1. Make your changes in a new git branch:\n\n ```shell\n git checkout -b my-fix-branch master\n ```\n\n1. Create your patch, **including appropriate test cases**.\n1. Run the QA suite, by running `$ npm run qa` and ensure that all steps succeed.\n1. Commit your changes using a descriptive commit message that follows our\n [commit message conventions](#commit). Adherence to these conventions\n is necessary because release notes are automatically generated from these messages.\n\n ```shell\n git commit -a\n ```\n Note: the optional commit `-a` command line option will automatically \"add\" and \"rm\" edited files.\n\n1. Push your branch to GitHub:\n\n ```shell\n git push origin my-fix-branch\n ```\n\n1. In GitHub, send a pull request to `embark:master`.\n* If we suggest changes then:\n * Make the required updates.\n * Re-run the test suites to ensure tests are still passing.\n * Rebase your branch and force push to your GitHub repository (this will update your Pull Request):\n\n ```shell\n git rebase master -i\n git push -f\n ```\n\nThat's it! Thank you for your contribution!\n\n#### After your pull request is merged\n\nAfter your pull request is merged, you can safely delete your branch and pull the changes\nfrom the main (upstream) repository:\n\n* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:\n\n ```shell\n git push origin --delete my-fix-branch\n ```\n\n* Check out the master branch:\n\n ```shell\n git checkout master -f\n ```\n\n* Delete the local branch:\n\n ```shell\n git branch -D my-fix-branch\n ```\n\n* Update your master with the latest upstream version:\n\n ```shell\n git pull --ff upstream master\n ```\n\n## Coding Rules\nTo ensure consistency throughout the source code, keep these rules in mind as you are working:\n\n* All public API methods **must be documented**.\n\n## Commit Message Guidelines\n\nWe have very precise rules over how our git commit messages can be formatted. This leads to **more\nreadable messages** that are easy to follow when looking through the **project history**. But also,\nwe use the git commit messages to **generate the Embark change log**.\n\n### Commit Message Format\nEach commit message consists of a **header**, a **body** and a **footer**. The header has a special\nformat that includes a **type**, a **scope** and a **subject**:\n\n```\ntype(@embark|@cockpit/