<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Appditto on Medium]]></title>
        <description><![CDATA[Stories by Appditto on Medium]]></description>
        <link>https://medium.com/@appditto?source=rss-a230aed74e28------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*judQWuQu3IUJpg1PXmSEcg.png</url>
            <title>Stories by Appditto on Medium</title>
            <link>https://medium.com/@appditto?source=rss-a230aed74e28------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 25 Jun 2026 13:59:24 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@appditto/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Introducing Pippin — High Performance, Production-ready External Wallet for Nano and Banano]]></title>
            <link>https://medium.com/appditto/introducing-pippin-high-performance-production-ready-external-wallet-for-nano-and-banano-242b55a5c7b1?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/242b55a5c7b1</guid>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Fri, 13 Dec 2019 20:44:58 GMT</pubDate>
            <atom:updated>2020-01-06T15:06:56.239Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9PXamVrzCB1oalfjvL1PvA.png" /><figcaption>Pippin is a High Performance, Production-Ready Developer Wallet for Nano and BANANO</figcaption></figure><p>Imagine that you wanted to integrate <a href="https://nano.org"><strong>Nano</strong></a> — the fee-less, instant, and environmentally friendly cryptocurrency, or <a href="https://banano.cc"><strong>BANANO</strong></a> — the fee-less, instant, rich in potassium cryptocurrency into your application. Whether it’s an exchange, casino, faucet, game, store, or vending machine— one of the first things you’ll need to do is figure out how to interface with a <a href="https://en.wikipedia.org/wiki/Cryptocurrency_wallet"><strong><em>wallet</em></strong></a>.</p><p>Intimidating right? Luckily if you peruse the <a href="https://docs.nano.org/commands/rpc-protocol/#wallet-rpcs"><strong>Nano Documentation</strong></a><strong> </strong>you’ll quickly find out that Nano has a developer wallet built-in, right into the node! It has a full set of APIs that lets you create accounts, send Nano, receive Nano, etc.</p><p>But then when you read a little more about it and see that the developer wallet isn’t recommended for production integrations, it’s tightly coupled to a node, and what if you have disk space or bandwidth constraints? Running a full node probably isn’t something that you want to do. The answer to these problems is <strong><em>external key management</em></strong><em> .</em> But what does that mean? Well, it basically means writing your own wallet, manually crafting and signing blocks, and using any node(s) to publish the block. All while taking proper precautions along the way to make sure blocks are confirmed and avoiding duplicate transactions. Today we’re announcing a new developer wallet that gives you external key management and incredibly high performance right out of the box…</p><h3>What is “Pippin” Anyway?</h3><p>To put it simply, Pippin is a Nano (and BANANO) wallet for developers. Pippin is the first wallet of its kind that is <strong>100% compatible with the developer wallet (aka “node wallet”) APIs</strong>. Of course the node wallet isn’t recommended for a lot of use cases, but a lot of developers use it anyway — because as you might expect, it’s the easiest solution and it generally works well enough. One of the goals of Pippin is to provide a production-ready, external key management solution that’s incredibly easy to setup and maintain.</p><p>Pippin has numerous advantages:</p><ul><li>It’s a drop-in replacement for the node/developer wallet</li><li>It has native support for <a href="https://dpow.nanocenter.org"><strong>DPoW</strong></a> and <a href="https://bpow.banano.cc"><strong>BPoW</strong></a></li><li>It’s completely detached from the node — meaning, you can use Pippin with any public node (no need to run your own node, you could also run a node in 1 location and have pippin on any number of machines using the same node)</li><li>It’s compatible with multiple database backends (SQLite, MySQL, PostgreSQL)</li><li>It can lazily auto-receive transactions (for example if you don’t want to compute PoW every time your account receives some coins but you also don’t want to explicitly receive them, Pippin can just receive blocks on demand when you need to perform a send — this also works well for when your wallet is locked and cannot auto-receive)</li><li>It supports encrypting seeds and private keys</li><li>Is fully asynchronous and easily scalable thanks to per-account, thread-safe distributed locks.</li></ul><h3>It’s Also Very, Very Fast</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cldx-sixPw_8WOOUOR3z3w.png" /></figure><p>A benchmark was constructed that:</p><ol><li>Created a new wallet with 21 accounts, and opened one of the accounts with some coins. (1 block)</li><li>Create 20 transactions to 20 different accounts from the first account. (20 blocks)</li><li>Receive all 20 transactions across the 20 different accounts (20 blocks)</li><li>Send all of the coins back to the original account in 20 more transactions (20 blocks)</li><li>Return coins to sender (1 block)</li></ol><p>The same node was used for both Pippin and the node wallet, the same PoW provider was used, and the exact same amount of transactions were made in the exact same way.</p><p>This was repeated 3 times for each wallet. Pippin was consistently at least <strong>twice as fast</strong> as the node wallet.</p><h3>The Technology Behind Pippin</h3><p>Pippin is written in Python, it is able to perform incredibly fast by using libraries such as <a href="https://docs.python.org/3/library/asyncio.html"><strong>asyncio</strong></a>, <a href="https://github.com/MagicStack/uvloop"><strong>uvloop</strong></a>, <a href="https://magicstack.github.io/asyncpg/current/"><strong>asyncpg</strong></a>/<a href="https://github.com/jreese/aiosqlite"><strong>aiosqlite</strong></a>/<a href="https://github.com/aio-libs/aiomysql"><strong>aiomysql</strong></a>, <a href="https://rapidjson.org/"><strong>rapidjson</strong></a>, and others.</p><p>It uses the brilliant <a href="https://github.com/npy0/nanopy"><strong>nanopy</strong></a><strong> </strong>library for signing blocks and generating work, which itself uses C-bindings for ed25519 and blake2b (in the most basic terms, this means that it’s fast).</p><p><strong>…but how is it so fast?</strong> Pippin uses a brilliant per-account distributed locking mechanism that’s backed by <a href="https://redis.io/"><strong>Redis</strong></a>. This means that every account can operate completely independent of one another, while still operating in a synchronous fashion on its own chain. So if you push 500 transactions that belong to account #1, then push a transaction that belongs to account #2 — the account #2 transaction will get processed immediately, even though account #1 has 500 pending requests to handle. This mechanism allows for extremely high concurrency and scalability as you increase the number of accounts, it even is safe across multiple processes.</p><p>Additionally, pippin uses a process pool that’s configurable for local work generation, although GPU PoW isn’t natively supported, you can use external work peers, run your own <a href="https://github.com/nanocurrency/nano-work-server"><strong>nano-work-server</strong></a> instance, or use a service like <a href="http://bpow.banano.cc"><strong>BoomPoW</strong></a>.</p><h3>Start Using Pippin</h3><p>Pippin is available on <a href="https://pypi.org/project/pippin-wallet/"><strong>PyPi</strong></a> and requires Python 3.6 or newer.</p><p>Simply install it with <a href="https://pip.pypa.io/en/stable/"><strong>pip</strong></a></p><pre><strong>%</strong> pip3 install pippin-wallet</pre><p>Then run the server with the command <strong>pippin-server</strong></p><p>More comprehensive instructions are outlined in the Pippin <a href="https://github.com/appditto/pippin_nano_wallet/blob/master/README.md"><strong>README</strong></a><strong>.</strong></p><h3>Thanks for reading!</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rXtsy6NDrlGsfah4cU6beQ.png" /></figure><p>Appditto Website: <a href="http://appditto.com/"><strong>appditto.com</strong></a></p><p>Appditto Twitter: <a href="http://twitter.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Github: <a href="http://github.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Instagram: <a href="http://instagram.com/appditto"><strong>@appditto</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=242b55a5c7b1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/introducing-pippin-high-performance-production-ready-external-wallet-for-nano-and-banano-242b55a5c7b1">Introducing Pippin — High Performance, Production-ready External Wallet for Nano and Banano</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automate Your Flutter Workflow Using GitLab CI/CD and Fastlane]]></title>
            <link>https://medium.com/appditto/automate-your-flutter-workflow-using-gitlab-ci-cd-and-fastlane-5872e758165a?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/5872e758165a</guid>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Wed, 13 Nov 2019 21:23:46 GMT</pubDate>
            <atom:updated>2020-01-06T15:07:26.665Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yp2sdgLKzwbHlQnaOOcEaA.png" /></figure><p><a href="https://flutter.io"><strong>Flutter</strong></a> is a modern mobile app development framework that lets you develop beautiful, highly performant apps in very little time. At Appditto we already have multiple Flutter applications in production — including open source projects like <a href="http://natrium.io"><strong>Natrium</strong></a>, <a href="http://kalium.banano.cc"><strong>Kalium</strong></a>, and <a href="http://blaisewallet.com"><strong>Blaise</strong></a>. The biggest pain point of our development process has been the testing, building, and deploying process for all of our apps.</p><h3>The old way…without CI/CD or Fastlane</h3><p>If you’ve ever gotten any mobile application into production you can understand the general process, usually it looks like this:</p><ol><li>Run tests…<em>and wait</em></li><li>Tag the release</li><li>Build the signed android binary (.aab or .apk) …<em>and wait</em></li><li>Login to the Google Play Developer Console and create a new release</li><li>Upload it to Google Play…<em>and wait</em></li><li>Fill in your changelog(s) and other general information and publish your app</li></ol><p>In the case of a cross-platform app, we can’t forget about iOS</p><ol><li>Start any iOS-specific tests…<em>and wait</em></li><li>Build the ios app (flutter build iOS)…<em>and wait</em></li><li>Archive the app in xcode…<em>and wait</em></li><li>Upload the app to the App Store via xcode…<em>and wait</em></li><li><em>And wait</em> for the App Store to process your upload</li><li>Log in to App Store Connect and create a new release</li><li>Fill in any changelog(s) and other information and submit it for review</li></ol><h4>What’s wrong with all of that, you might ask?</h4><p>Just to name a few…</p><ul><li>The entire process for just <strong>1 app</strong> can take more than an hour, just to get it submitted for review.</li><li>If you introduced a change that caused tests to fail, you don’t know about it until you are ready to release an update.</li><li>If you introduced a change that caused the build to fail, you don’t know about it until you try to build it.</li><li>It’s prone to user error. There’s a lot of steps in the process, it can be easy to miss something.</li></ul><h3><strong>The Solution: Continuous Integration &amp; Continuous Delivery</strong></h3><p>We identified the need for <a href="https://en.m.wikipedia.org/wiki/Continuous_integration"><strong>continuous integration</strong></a> and <a href="https://en.wikipedia.org/wiki/Continuous_delivery"><strong>continuous delivery</strong></a> (referred to as CI/CD) almost immediately, but there’s a lot of competing solutions out there that we wanted to research and try before choosing the one that best fit our needs.</p><p>For our Flutter applications we needed to:</p><ul><li>Automate tests for dart code, Android code, and iOS code</li><li>Automate building the iOS and Android applications</li><li>Automate deployments to the iOS App Store and the Google Play Store</li></ul><p><a href="https://fastlane.tools/"><strong>Fastlane</strong></a> is the first part of our continuous integration solution, it is a powerful tool that allows you to automate iOS and Android builds, as well as automate deployments to both of the app stores. It also has several other benefits such as allowing us to manage store information, changelogs, and more in our repository.</p><p>In this guide, we’ll walk through the steps required to integrate GitLab CI/CD and Fastlane into your project.</p><h3>Before we get started…</h3><p>This article makes a few assumptions you should be aware of.</p><ul><li>Everything described is applicable to <strong>Unix environments only</strong> — such as MacOS or Linux. <strong>If you are using Windows</strong>, using the <a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10"><strong>WSL</strong></a> is required.</li><li>MacOS is required to build and sign iOS apps. You can skip the iOS sections if you are only planning to build for Android or don’t have access to a Mac.</li><li>You need to have an <a href="https://developer.apple.com/"><strong>Apple Developer Account</strong></a> to publish iOS apps to the App Store</li><li>You need to have a <a href="https://developer.android.com/distribute"><strong>Google Play Developer Account</strong></a> to publish Android apps to the Play Store.</li><li><strong>App Store Privileges — </strong>It’s very important for CI that we add a second account to App Store Connect without 2FA-enabled. You can give it the “App Manager” permission and a secure password. If you aren’t sure how to add an additional user, <a href="https://support.appmachine.com/hc/en-us/articles/203647716-Authorize-an-Additional-User-to-your-iOS-Developer-Account"><strong>here’s a guide</strong></a>. Anywhere you are asked for credentials for the app store, you will need to use this account.</li><li>Git Usage— It’s assumed that you are using Git for source control. It doesn’t matter if your repository is self-hosted, on GitHub, on Bitbucket, on GitLab, etc.</li></ul><p>This guide will assume that you want to automate tests, builds, and deployments to both of the app stores — which means that all of the above is required to completely follow this guide.</p><h3>Getting started with Fastlane and Flutter</h3><p>We need to get Fastlane installed and configured for our project. The first step is to install fastlane, it can be installed with <a href="https://guides.rubygems.org/command-reference/"><strong>gem</strong></a>.</p><pre><strong>#</strong> gem install fastlane</pre><p>Next navigate to the root of your Flutter project, where you need to initialize fastlane for both android and iOS.</p><pre><strong># </strong>cd path_to_my_awesome_flutter_app</pre><p>First, you might want to add the following lines to .gitignore.</p><pre><strong># You definitely want these</strong><br>**/ios/*.ipa<br>**/ios/*.app.dSYM.zip</pre><pre><strong># These are optional<br># For our open source projects we choose to exclude some metadata that contains private information<br></strong>android/fastlane/report.xml<br>ios/fastlane/report.xml<br>ios/fastlane/Preview.html<br>ios/fastlane/metadata/review_information<br>ios/fastlane/metadata/trade_representative_contact_information</pre><p><strong>Fastlane install for Android builds and deployments:</strong></p><p>You need to obtain a json file that contains an access key from the Google Play Console. More details available in the <a href="https://docs.fastlane.tools/getting-started/android/setup/"><strong>fastlane docs</strong></a>.</p><p>We recommend that you keep this file outside of your repository and in your home directory <strong>/home/&lt;YOUR USER&gt;/keys/android/myaccesskey.json</strong> or <strong>/Users/&lt;YOUR USER&gt;/keys/android/myaccesskey.json</strong> (for MacOS). When prompted by fastlane use the path <strong>~/keys/android/myaccesskey.json</strong> as the location where you stored your key.</p><pre><strong>#</strong> cd android<br><strong>#</strong> fastlane init<br><strong>#</strong> cd ..</pre><p>Follow the prompts and make sure all of the information is correct, fastlane will create several files in your project once you are finished.</p><p><strong>Fastlane install for iOS builds and deployments:</strong></p><p>As mentioned in the pre-requisites, you want a dedicated account without 2FA to use for continuous integration. For iOS, the fastlane installation is similar but you’ll need to use the apple ID and password of your developer account without 2FA.</p><pre><strong>#</strong> cd ios<br><strong>#</strong> fastlane init<br><strong>#</strong> echo &#39;gem &quot;cocoapods&quot;&#39; &gt;&gt; Gemfile<br><strong>#</strong> cd ..</pre><p>Follow through the prompts and make sure the detected information is correct. Managing metadata is up to you, it means you can manage changelogs, descriptions, icons, and other data from within your project. In our case, we chose yes for those (with the exception of ios review_information and iOS trade representative contact information — simply delete the metadata you don’t want to manage via fastlane, and add it to <strong>.gitignore</strong>).</p><p>You can check in and push all of the files fastlane has created in your project.</p><h3>A word on code signing…Android</h3><p>This article assumes you have setup code signing for your android app as described in the <a href="https://flutter.dev/docs/deployment/android"><strong>flutter documentation</strong></a>. That means a .<strong>jks</strong> key store, with a <strong>key.properties</strong> file excluded from source control that has the password, keyAlias, etc.</p><p>If you haven’t configured code signing yet, then follow the steps <a href="https://flutter.dev/docs/deployment/android#signing-the-app"><strong>outlined here</strong></a><strong> </strong>before continuing with this guide.</p><h3>A word on code signing…iOS</h3><p>For <strong>iOS</strong>, the story is a bit more complicated.</p><p>We’re going to use <a href="https://docs.fastlane.tools/actions/match/"><strong>Fastlane Match</strong></a>, to manage the certificates required for code signing on iOS. Here’s how to do it.</p><ol><li>Create a <strong>private </strong>git repository named <strong>ios-certificates.git</strong> or similar</li><li>Run the following</li></ol><pre><strong># </strong>cd ios<br><strong># </strong>fastlane match init<br><strong>#</strong> fastlane match<br><strong>#</strong> cd ..</pre><p>Follow the prompts to setup match, once completed it will create <strong>ios/fastlane/Matchfile</strong>, which contains information about the ios-certificates repository.</p><h3>Configuring Fastlane for Flutter and GitLab (Android)</h3><p>We installed fastlane with <strong>fastlane init</strong>, and it configured itself for an Android project. The problem is, fastlane configured itself for an Android project — not for a Flutter project.</p><p>The main fastlane configuration can be found in <strong>android/fastlane/Fastfile</strong>, it has some default <a href="https://docs.fastlane.tools/advanced/lanes/">lanes</a>. You can think of a <strong>lane</strong> as a group of tasks. The Fastfile is written in Ruby, so you can write any ruby code within it.</p><p>We want two new lanes for android, <strong>build_android</strong> and <strong>deploy_android</strong>. The first builds and signs our Android app, the second uploads it to the play store.</p><p>We’re going to make some simple shell scripts to build the app and run tests, to keep our Fastfile clean.</p><pre><strong>#</strong> touch android/fastlane/flutter_build.sh<br><strong># </strong>touch android/fastlane/flutter_test.sh<br><strong>#</strong> chmod a+x android/fastlane/flutter_build.sh<br><strong>#</strong> chmod a+x android/fastlane/flutter_test.sh</pre><p>These create two empty scripts and make them executable (You can skip flutter_test.sh all together if you are planning to add GitLab as it will become redundant in our pipeline)</p><p>Contents of <strong>flutter_build.sh</strong>:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4221aba518fc955a7c02699771c7c25d/href">https://medium.com/media/4221aba518fc955a7c02699771c7c25d/href</a></iframe><p>Contents of <strong>flutter_test.sh</strong>:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4e47243521836d87bf3aaec3bc8150b3/href">https://medium.com/media/4e47243521836d87bf3aaec3bc8150b3/href</a></iframe><p>Now we can create our lanes in <strong>android/fastlane/Fastfile</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bee82fd6e66bde5b3114d3aa2269dd46/href">https://medium.com/media/bee82fd6e66bde5b3114d3aa2269dd46/href</a></iframe><p>Breaking down the first lane, <strong>build_android</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/495/1*1FdlxU4PULaPAqjW6bJcAQ.png" /></figure><ul><li><strong>sh &quot;./flutter_test.sh&quot;</strong> : Executes our tests, you may choose to remove this especially when using GitLab CI as we’ll do tests earlier in our pipeline.</li><li><strong>sh &quot;./flutter_build.sh&quot; --clean</strong> : This builds our <strong>.aab</strong> (<a href="https://developer.android.com/platform/technology/app-bundle">Android App Bundle</a>), this is the binary we want to use when uploading to the play store.</li><li><strong>sh &quot;./flutter_build.sh&quot; --apk</strong> : This builds our standard fat <strong>.apk</strong>, it’s also completely optional but we like to have it in our archive as it’s easier to install if you want to downgrade to a specific version, offer a download in alternative places, etc.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_6X4CKxRoUyuQOT3hdxRFA.png" /></figure><p>Our second lane, <strong>deploy_android</strong>, is where things get interesting.</p><p>In this lane we are uploading our build to the play store using the fastlane function <a href="https://docs.fastlane.tools/actions/upload_to_play_store/">upload_to_play_store</a>. This single lane allows us to upload to production, beta, alpha, or internal tracks — pretty neat!</p><p>You can use these lanes as demonstrated below:</p><pre><strong>Build the release binaries:<br>#</strong> bundle exec fastlane build_android<br><strong>Production deploy:<br>#</strong> bundle exec fastlane deploy_android production:true<br><strong>Beta deploy:<br>#</strong> bundle exec fastlane deploy_android beta:true<br><strong>Alpha deploy:<br>#</strong> bundle exec fastlane deploy_android alpha:true<br><strong>Internal track deploy:<br>#</strong> bundle exec fastlane deploy_android internal:true</pre><p>And we’re done! Fastlane can now build and deploy our Flutter application. We’ll automate this process later, but first we need to configure our iOS build.</p><h3>Configuring Fastlane for Flutter and GitLab (iOS):</h3><p><strong>Note: A MacOS machine with the latest XCode installed is needed for this section</strong></p><p>Building for iOS and deploying to the App Store is a bit more problematic, mainly because there’s more steps involved. Luckily we can still simplify the process with Fastlane.</p><p>We want to start with creating the same two scripts we made for Android</p><pre><strong>#</strong> touch ios/fastlane/flutter_build.sh<br><strong>#</strong> touch ios/fastlane/flutter_test.sh<br><strong>#</strong> chmod a+x ios/fastlane/flutter_build.sh<br><strong>#</strong> chmod a+x ios/fastlane/flutter_test.sh</pre><p>The contents of <strong>flutter_build.sh</strong>:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/62e1facf905efed8a3c1ef9729a2f08c/href">https://medium.com/media/62e1facf905efed8a3c1ef9729a2f08c/href</a></iframe><p><strong>--no-codesign</strong> is used in our flutter build step because unlike android, flutter build doesn’t give us a binary that can be uploaded straight to the AppStore. There’ll be an additional build step later which will be where we sign our app.</p><p>And <strong>flutter_test.sh</strong>:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a5b8838a1e8541de824c1aa3d24c9c24/href">https://medium.com/media/a5b8838a1e8541de824c1aa3d24c9c24/href</a></iframe><p>Now we need to create our lanes, like how we did on Android.</p><p>Like android, we also want a <strong>build_ios</strong> that builds and signs our app, as well as a <strong>deploy_ios</strong> that uploads our app to the app store.</p><p>Here’s the whole file, we’ll walk through what it means later:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3f931062e8b373c07d13ae7d6c5116f0/href">https://medium.com/media/3f931062e8b373c07d13ae7d6c5116f0/href</a></iframe><p>The Fastfile is <strong>Ruby </strong>syntax, so when we define variables and functions it’s written in Ruby.</p><p>The first group of functions and variables are for creating a temporary keychain which will be used to store our signing and deploy keys.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/691/1*mV-4Z-L9joaGXYCk65jWhw.png" /></figure><p>First we set a couple of variables with the temporary keychain name and password. These are “default” values because we also have the option to include a more secure password from the environment, which we’ll see later.</p><p>Then we have a few ruby functions which create and delete our temporary keychain.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4G5UpjmyXce_QU0hJ0arIg.png" /></figure><ul><li><strong>delete_temp_keychain</strong> will delete the temporary keychain if it exists</li><li><strong>create_temp_keychain</strong> will create the temporary keychain with a name and password</li><li><strong>ensure_temp_keychain</strong> simply deletes any existing keychain of the same name, and creates a new one with the given name and password.</li></ul><h4>Why use a temporary keychain?</h4><p>It’s not required to create a new keychain every time you build the app with Fastlane — the default Login keychain, or any other keychain on your system is perfectly fine. There’s a couple reasons we prefer this method over using the login keychain.</p><ol><li>You don’t need to expose your login password. If you use your login keychain with Fastlane, it will prompt you for a password to unlock it when you run <strong>match</strong> — not really a problem on a development machine, but for CI/CD we don’t want to be prompted for a password. So we can either provide our login password in the environment or use a different keychain — which is what we’re doing here.</li><li>You can provide a strong, random password every time when the process is automated via GitLab — which we’ll see later. This ties into increased security.</li></ol><p>Then we have our two lanes, similar to android. One is the build step and one is the upload step.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XPWKptS7v65yOaQJw-tdzw.png" /></figure><p>Breaking down the <strong>build_ios</strong> lane</p><ul><li>It disables “Automatic code signing” which is what we want for our CI/CD server. The <strong>disable_code_signing </strong>method actually changes your .xcodeprojfile, if you run this locally you probably don’t want to check the modified file into git. You could backup the original at the beginning of the lane if desired, and restore it later by doing something like cp Runner.xcodeproj Runner.xcodeproj.bak.</li><li>It creates our temporary keychain with a name and password from the environment, otherwise uses the default one.</li><li>It runs fastlane match, to install the certificates and profiles into the temporary keychain</li><li>It runs the flutter tests and build</li><li>It builds the <strong>.ipa</strong> file and signs it, which is what we need to upload to the App Store</li><li>It deletes our temporary keychain at the end</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/532/1*e7Ml_exehR6pX3C9a9ljEQ.png" /></figure><p>And the <strong>deploy_ios</strong> lane is where things get really cool</p><ul><li>It can upload to test flight</li><li>It can upload to the App Store and <em>submit it for review </em>automatically! It will upload, make sure everything is valid, wait for processing, then submit it for review all in one step.</li></ul><p>Like android you can do either or with parameters</p><pre><strong>#</strong> cd ios<br><strong>To upload to testflight:<br>#</strong> bundle exec fastlane deploy_ios testflight:true<br><strong>To submit for review:<br>#</strong> bundle exec fastlane deploy_ios</pre><h4><strong>One more thing</strong></h4><p>For iOS apps, if we want to automatically submit them for review we need to set the answers for our compliance questions. You can add the following to <strong>ios/fastlane/Deliverfile</strong>, but change the answers as they apply to your app.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/27fb66010c5e71b7c1232b038ba96e10/href">https://medium.com/media/27fb66010c5e71b7c1232b038ba96e10/href</a></iframe><p>And we’re done with Fastlane!</p><p>You can now build and deploy your iOS and Android apps in a couple simple steps.</p><h3>Automating all of it with GitLab CI/CD</h3><p>Now that we can build and deploy our apps with a few simple commands, it’s time to automate it. This is where continuous integration comes in.</p><h4>Why GitLab?</h4><p>There’s plenty of continuous integration/continuous delivery (CI/CD) solutions out there including <a href="https://travis-ci.org/">Travis CI</a>, <a href="https://github.com/features/actions">GitHub Actions</a>, <a href="https://codemagic.io/">Codemagic</a>, <a href="https://bitbucket.org/product/features/pipelines">Bitbucket pipelines</a>, <a href="https://circleci.com/">Circle CI</a>, <a href="https://jenkins.io/">Jenkins</a>, etc. I encourage you to research all of them and determine which one fits your needs the best. For us, we determined that GitLab’s CI/CD would work best for us. That definitely won’t be the case for every team or every project, but here’s the reasons we chose it over the others:</p><ul><li><strong>Ability to use your own </strong><a href="https://docs.gitlab.com/runner/"><strong>runner</strong></a>. Think of a runner like a “worker” — it executes your pipelines and in our case will be responsible for running tests, building the apps, and uploading the apps. Many of the services mentioned only allow you to use their shared servers with limited usage caps. Many offer enterprise solutions, paid plans, and various other things to fit your needs — so again, definitely research them and find what works best for you.</li><li><strong>MacOS Requirement.</strong> Flutter applications <strong><em>need</em></strong> MacOS to build the iOS binary and upload to the App Store. If you don’t intend to server iOS users, then this doesn’t apply to you. Most of the services above provide MacOS servers that you can use (GitLab happens to not provide these), but they’re generally more expensive and more restrictive. Also, we’re dealing with very sensitive data — signing and deploy keys, app store manager passwords, google play upload keys, etc. Unless you’re using an enterprise solution offered by one of the above mentioned CIs, this may not be something your internal audit requirements allow for.</li><li><strong>Intuitive Configuration.</strong> The <a href="https://yaml.org/">yaml</a> configuration that GitLab uses is very straightforward, easy to understand, and easy to work with. You can build very complex pipelines in very little time.</li><li><strong>Intuitive Interface.</strong> The experience using GitLab is generally good. It has an interface where you can easily visualize and manage your pipelines, alerts, auto-cancel features, archiving, and a lot more that really fits our needs.</li></ul><p>If your project isn’t already in GitLab, you can create a new one, import one, or mirror it from another repository. We chose to mirror it because our projects are hosted on <a href="http://github.com">GitHub</a>, but your needs may vary. <a href="https://docs.gitlab.com/ee/gitlab-basics/create-project.html"><strong>More information can be found on the GitLab website</strong></a> about creating, importing, or mirroring a project.</p><h4>What about the server?</h4><p>As I said above, GitLab does not provide any shared MacOS runners — which we need to build and deploy our iOS apps. Luckily the gitlab-runner software is incredibly easy to setup, you can run it on any MacOS machine including a MacBook.</p><p>We chose to setup a <a href="https://en.wikipedia.org/wiki/Bare-metal_server">bare-metal</a> dedicated MacOS server, this has some downsides — primarily that we need to manage the infrastructure ourselves, keep flutter up to date ourselves, keep XCode and the Android SDK up to date ourselves, etc. However we need MacOS, which is why we chose the bare-metal option instead of using docker containers or a similar lower-maintenance solution. If you want to follow the same approach — a <a href="https://en.wikipedia.org/wiki/Mac_Mini"><strong>Mac Mini</strong></a> makes a great option and used, older ones are relatively inexpensive. You can also use a hosting provider such as <a href="https://www.macstadium.com/"><strong>MacStadium</strong></a> or <a href="http://macincloud.com"><strong>MacInCloud</strong></a><em>. </em>Or like I said, if you already have a MacOS development box you can simply setup the gitlab-runner on that.</p><h4><strong>Server Configuration</strong></h4><p><strong>Note: If you are intending to use the gitlab-runner on a MacOS development machine that has already been configured for flutter development and FastLane, you can skip these steps. If you are intending to build for android-only, you can skip installing XCode.</strong></p><p>If you’re using a bare-metal MacOS server you need to install the required software to build iOS and Android apps.</p><ol><li><a href="http://www.androiddocs.com/sdk/installing/index.html"><strong>Install the Android SDK</strong></a> — Android Studio is the easiest way to install it.</li><li><strong>Install XCode</strong> — via the MacOS App Store</li><li><a href="https://flutter.dev/docs/get-started/install/macos"><strong>Install Flutter</strong></a> — Make sure you also add it to your PATH, as described in the document.</li></ol><p>Once these are complete, run <strong>flutter doctor -v</strong> to ensure everything is configured correctly.</p><p>One other thing we’ll want to do, is install XCode command line tools. This can be done by running the following command:</p><pre><strong>#</strong> xcode-select --install</pre><p>We need to add some environment variables, we can add them to <strong>~/.zprofile</strong> (on MacOS Catalina) or <strong>~/.profile</strong> (other MacOS versions)</p><pre>export LC_ALL=en_US.UTF-8<br>export LANG=en_US.UTF-8<br># Ruby<br>export GEM_HOME=~/.gems<br>export PATH=$PATH:~/.gems/bin</pre><p>You can also choose to store sensitive variables here, such as <strong>FASTLANE_PASSWORD</strong> (the password of the AppStore/Developer account you used to setup fastlane with) and <strong>MATCH_PASSWORD</strong> (the password required to decrypt your iOS certificates.</p><pre>export MATCH_PASSWORD=abc123<br>export FASTLANE_PASSWORD=123abc</pre><p>You can also choose to store variables in the GitLab interface per-project, which is what we’ll do for the rest of the guide. Just know that you have the option to do it this way.</p><h4><strong>Getting access to ios-certificates</strong></h4><p>For fastlane match, you should have created a private git repository with all of your encrypted signing/deploy certificates. We need to give this machine access to these.</p><pre><strong>#</strong> ssh-keygen -t rsa</pre><p>Once complete, you can add read-only access to your repository using your public key (by default located in ~/.ssh/id_rsa.pub). GitHub calls them <a href="https://developer.github.com/v3/guides/managing-deploy-keys/"><strong>Deploy Keys</strong></a>.</p><h4>Installing keys for Android/Google Play</h4><p>We need to install our <strong>jks</strong> key store and .<strong>json</strong> file that we generated earlier. Upload it to your server and copy it to your home directory. For our example we’ll have them at <strong>/Users/&lt;YOUR USER&gt;/keys/android/appditto.jks</strong> and <strong>/Users/&lt;YOUR USER&gt;/keys/android/myaccesskey.json</strong></p><pre><strong>#</strong> mkdir -p /Users/&lt;YOUR USER&gt;/keys/android<br><strong>#</strong> mv myaccesskey.json ~/keys/android<br><strong>#</strong> mv appditto.jks ~/keys/android</pre><h3>Installing the GitLab Runner</h3><p>We need to install the gitlab-runner software, it’s very easy to do.</p><p>In GitLab, navigate to your project settings -&gt; CI/CD -&gt; Runners and find your registration token. It should look like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t8DXX46enFwUny7H_GcwUg.png" /></figure><p>It just so happens that ours is <strong>YourRegistrationToken</strong>, we’ll need it when we setup the gitlab-runner.</p><p>To install the runner:</p><pre><strong>#</strong> sudo curl --output /usr/local/bin/gitlab-runner <a href="https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64">https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64</a><br><strong>#</strong> sudo chmod +x /usr/local/bin/gitlab-runner</pre><p>Now that it’s installed, we can register it for our project using <strong>gitlab-runner register</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/419/1*bYZAaYBK8zr62DEcW-Dugg.png" /><figcaption>Registering the GitLab runner</figcaption></figure><ul><li>Choose <strong>https://gitlab.com/</strong> when prompted for gitlab-ci coordinator URL</li><li>Enter your token from above, ours is <strong>YourRegistrationToken</strong></li><li>Choose whatever description you want</li><li>Choose whatever tag you want, but remember what you chose <strong>appditto_mac</strong> in our case, will be used to target this specific runner when we create our pipeline.</li><li>For runner type, choose <strong>shell</strong></li></ul><p>Then all we do is install and start the runner, and it should run as a Launchd service that will start itself upon system reboots, etc.</p><pre><strong>#</strong> gitlab-runner install<br><strong>#</strong> gitlab-runner start</pre><p>You can refresh the gitlab settings page and you should see your runner appear.</p><h3>Creating our Pipeline</h3><p>We saw how easy it was to install the gitlab-runner software and configure out server. Now we need to get into the fun stuff — creating our pipeline!</p><p>A <a href="https://docs.gitlab.com/ee/ci/pipelines.html"><strong>pipeline</strong></a><strong> </strong>is basically just a set of jobs that may execute in a specific order. For example test -&gt; build -&gt; deploy. The pipeline is triggered on every commit (by default).</p><p>We’re going to design a relatively simple pipeline that can test, build, and deploy our app.</p><p>We’re going to create a file called <strong>.gitlab-ci.yml</strong> in the root of our project (<strong>awesome_appditto_app/.gitlab-ci.yml</strong>)</p><p>First part will be the <strong>stages</strong>, this defines all of the stages in our pipeline.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2daed74c1ee5645102eaa32ab41acf99/href">https://medium.com/media/2daed74c1ee5645102eaa32ab41acf99/href</a></iframe><ul><li><strong>test</strong> — will be where we run our tests</li><li><strong>update</strong> — This is simply going to update our flutter dependencies, we want to run flutter packages upgrade every time because by default GitLab will “cache” the repository instead of cloning it every time (for speed), which means we aren’t guaranteed to have the latest versions of everything unless we do this.</li><li><strong>build </strong>—<strong> </strong>This stage will build our android and iOS app.</li><li><strong>deploy </strong>— This stage will deploy our android and iOS app.</li></ul><p>Every stage depends on the previous one. So if <strong>test</strong> fails then none of the other jobs will run, and the entire pipeline will be considered as failed.</p><p>—</p><p>First we can define a job in the <strong>test</strong> stage</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1de6f56a9a2d2012537c7cbbc96e03c2/href">https://medium.com/media/1de6f56a9a2d2012537c7cbbc96e03c2/href</a></iframe><p>The job is named <strong>tests</strong>, it only runs when commits are pushed to the <strong>master</strong> branch, it is part of the <strong>test</strong> stage, it only will run on a runner with the <strong>appditto_mac</strong> tag, it executes one command <strong>flutter test </strong>and it is <strong>interruptible</strong> which means it can be cancelled automatically. If there are two pushes on the master branch, GitLab will cancel redundant pipeline runs automatically for us.</p><p>—</p><p>Then define a job in the <strong>update</strong> stage</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/259e5d24cd6318c9540282323a50fde0/href">https://medium.com/media/259e5d24cd6318c9540282323a50fde0/href</a></iframe><p>Very similar to the <strong>test </strong>job, except we’re running two commands instead of only 1: <strong>flutter packages get</strong> and <strong>flutter packages upgrade</strong>.</p><p>—</p><p>Then we can define our <strong>build</strong> stage. This one consists of two jobs and gets a bit more interesting.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/513d46be83278b25d126f687b27e2389/href">https://medium.com/media/513d46be83278b25d126f687b27e2389/href</a></iframe><p>We have two jobs <strong>android:build </strong>and <strong>ios:build</strong>.</p><p>They are both just a series of shell commands like the previous jobs, although a bit more complicated. The <strong>android:build</strong> job is creating a <strong>key.properties </strong>and <strong>local.properties</strong> file on the fly, which is used by our android build to determine the SDK location as well as access the key store so it knows what to use for signing our app. We’ll get to defining our environment variables later, if you’re wondering what $ANDROID_KEY_STORE_PASSWORD and the others mean and how to define them.</p><p><strong>ios:build</strong> is creating some environment variables, <strong>TEMP_KEYCHAIN_NAME</strong> and <strong>TEMP_KEYCHAIN_PASSWORD</strong>. Remember how earlier we configured fastlane to create a temporary keychain for signing the app? This is just generating a random name and password for that key store on the fly.</p><p>Another new thing in this job is <strong>artifacts</strong>. We want to specify our build artifacts so GitLab can archive them for us. This includes our signed .apk, .aab, and .ipa files. After every successful <strong>build </strong>stage GitLab will archive the build artifacts so we can come back and download them later, if desired.</p><p>—</p><p>We can then create some jobs for the deploy stage. We’ll create 4 total. One for production on Play Store (Android), one for App Store (iOS), one for Play Store internal track (Android), one for TestFlight (iOS)</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8c253d65695598306e4958ca983dabba/href">https://medium.com/media/8c253d65695598306e4958ca983dabba/href</a></iframe><p>There’s 4 jobs that are part of the deploy stage, you can see that they simply execute some of the <strong>fastlane</strong> lanes that we created earlier with various options.</p><p>The main difference with these is <strong>when: manual</strong>. We don’t want these deploy jobs to be triggered automatically, because we don’t want to push builds to the AppStore/Play Store every time a new commit is pushed. So with this option, these jobs can be triggered manually after the build stage is complete.</p><p>Here’s the entire <strong>gitlab-ci.yml </strong>that we put together, for reference.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/db2738ac36c474c7241ea4ee82875b17/href">https://medium.com/media/db2738ac36c474c7241ea4ee82875b17/href</a></iframe><p>You can do a lot more things with your pipeline. For example, with our open source app we also want to automate release tagging and upload APKs to GitHub, you can see that <a href="https://github.com/appditto/natrium_wallet_flutter/blob/master/.gitlab-ci.yml"><strong>here</strong></a> for reference.</p><p>Check the file in and push it to your repository. You should the job trigger immediately.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zpQG-04t6EjgcmiAVkBAWQ.png" /><figcaption>Completed Pipeline — We’ll Address the Failure Next</figcaption></figure><h3>Setting up environment variables</h3><p>Your android build probably failed if you’ve been following this guide. We had specified some environment variables in our .gitlab-ci.yml but didn’t define them anywhere.</p><p>We need to define the following:</p><ul><li><strong>FLUTTER_PATH — </strong>This is the location you installed flutter on the server (example: /Users/&lt;YOUR USER&gt;/flutter)</li><li><strong>ANDROID_SDK_PATH — </strong>This is the location the android SDK was installed on the server (example: /Users/&lt;YOUR USER&gt;/Library/Android/sdk)</li><li><strong>ANDROID_KEY_STORE_PASSWORD — </strong>This is the storePassword value in our key.properties, AKA the password used to unlock your key store.</li><li><strong>ANDROID_KEY_ALIAS — </strong>This is the name of the key used to sign your app, keyAlias in the key.properties file.</li><li><strong>ANDROID_KEY_PASSWORD — </strong>This is the password for the key, keyPassword in the key.properties file.</li><li><strong>ANDROID_KEYSTORE_PATH — </strong>This is the location of the .jks file. (example: /Users/&lt;YOUR USER&gt;/android/keys/appditto.jks)</li></ul><p>There’s two options for defining these variables that we’re going to cover.</p><ol><li>Placing them in <strong>~/.zprofile</strong> (Catalina and newer) or <strong>~/.profile</strong> (Mojave and older).</li><li>Setting them up in the GitLab interface.</li></ol><p>We already briefly covered #1, we’re going to choose #2 this time. There’s pros and cons to each approach but ultimately it’ll be up to you to decide.</p><p>Adding them in GitLab is very simple, just navigate to your project settings as seen below and add them:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N8EX_0H_tIeWy9Rm0FZLGg.png" /><figcaption>Setting Environment Variables for your GitLab Project</figcaption></figure><p>And we can re-run our pipeline and can see that it passed!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eoAzFRSzP1UpIiL-pI3qyQ.png" /><figcaption>Finished GitLab Pipeline</figcaption></figure><p>We can see that our deploy jobs did not get triggered, which is what we wanted. When we want to deploy it to the app store we can just login to GitLab and manually run whichever deployment we want.</p><h3>Let’s Recap</h3><p>We’ve successfully automated our workflow using GitLab CI/CD and Fastlane.</p><ul><li>On every commit to master, all of our tests and both builds will run</li><li>On successful builds, GitLab will archive the binaries so they are available for us to download later if needed.</li><li>Also on successful builds, our binaries will be available for us to deploy at our leisure with the press of a button.</li><li>If our tests or builds are failing, GitLab will alert us of the failure based on our preferences (email is the default)</li></ul><p>Now our code is continuously tested, built, and the latest builds are ready to deploy!</p><h3>Thanks for reading!</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rXtsy6NDrlGsfah4cU6beQ.png" /></figure><p>Appditto Website: <a href="http://appditto.com/"><strong>appditto.com</strong></a></p><p>Appditto Twitter: <a href="http://twitter.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Github: <a href="http://github.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Instagram: <a href="http://instagram.com/appditto"><strong>@appditto</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5872e758165a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/automate-your-flutter-workflow-using-gitlab-ci-cd-and-fastlane-5872e758165a">Automate Your Flutter Workflow Using GitLab CI/CD and Fastlane</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Natrium v2.1 — Security Audit & More]]></title>
            <link>https://medium.com/appditto/natrium-v2-1-security-audit-and-more-26ebec66bd5b?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/26ebec66bd5b</guid>
            <category><![CDATA[nano]]></category>
            <category><![CDATA[natrium]]></category>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[wallet]]></category>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Wed, 23 Oct 2019 14:36:45 GMT</pubDate>
            <atom:updated>2019-10-23T14:36:45.050Z</atom:updated>
            <content:encoded><![CDATA[<h3>Natrium v2.1 — Security Audit &amp; More</h3><p><a href="http://natrium.io"><strong>Natrium</strong></a> has come a long way since its inception more than a year ago — it quickly became the most preferred mobile wallet for <a href="http://nano.org"><strong>NANO</strong></a> users around the world. Our own definition of Natrium is <strong><em>Fast, Robust, &amp; Secure NANO Wallet</em></strong>. We take all three of those principles very seriously with Natrium and, thanks to the Nano Foundation, we were able to take security to the next level.</p><h3>Natrium Security Audit</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7noi9YfoXH5d_ScJFmDtCw.png" /><figcaption>Natrium audited by Red4Sec — No critical vulnerabilities.</figcaption></figure><p>The Nano Foundation connected us with <a href="http://red4sec.com"><strong>Red4Sec</strong></a><em> — </em>an experienced, trusted security firm that has a lot of experience auditing and reviewing cryptocurrency projects, blockchains, and more. Red4Sec conducted a comprehensive security audit and they found that Natrium had <strong><em>no critical vulnerabilities</em></strong>. They had some recommendations to prevent lower risk vulnerabilities that require a higher skill, depend on certain factors — such as being rooted, or are related to protecting less sensitive information such as your public NANO address. Their recommendations have been implemented into Natrium v2.1.</p><p>Among these include an option to encrypt your seed with a user-provided password. While Natrium currently utilizes the built-in security of the device itself — using the <a href="https://developer.apple.com/documentation/security/keychain_services">iOS KeyChain</a> and the <a href="https://developer.android.com/training/articles/keystore">Android KeyStore</a>. Users can now add an additional layer of security to their wallet by encrypting their seed with a password that is not stored on the device. This is <em>optional</em>, but it may be beneficial for users who just want to take extra precautions, are using Natrium on a rooted or jailbroken device, or are using Natrium on a device that is not secured by a passcode, pin, or biometrics.</p><p>Some of the other changes related to the audit are less apparent, but they include: a warning when users are using a rooted or jailbroken device, cleaning up information leakage in application logs — for example Natrium logging your public nano_ address in general system logs, using a secure clipboard on iOS — disabling <a href="https://support.apple.com/en-us/HT209460">Universal Clipboard</a> and setting an expiration for copying sensitive data.</p><p>We’re thankful to the Nano Foundation for providing us with the opportunity to be audited, and we’re proud that when people install Natrium they can be confident that their seed, private keys, and other sensitive data is <strong><em>secure</em></strong><em>.</em></p><h3>What Else is New in Natrium 2.1?</h3><p>In addition to the audit-related changes mentioned above, Natrium 2.1 also adds the following new features:</p><ul><li><strong>Live Support</strong> — Chat with us in real-time from within the application. We saw a need to provide better support — people have questions, issues and they aren’t always sure where they should go. Now, they can reach us directly from within Natrium and get answers quickly. We hope that this can make the experience of using a non-custodial wallet, such as Natrium, less intimidating and easier for all users.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/369/1*qIctaO5Jz5afCzJmmLJirg.gif" /><figcaption>Natrium now has live support!</figcaption></figure><ul><li><strong>QR Scanner Shortcut</strong> — Often times users are sending NANO using QR codes. While this has always been supported in Natrium, now it can be done slightly quicker simply by swiping up on the send button.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/369/1*4vBi9ZM-Nn6RtZSLHda1Qg.gif" /><figcaption>Quickly access QR scanner by swiping up on send button.</figcaption></figure><ul><li><strong>Hide Your Balance</strong> — A community requested feature was to be able to hide your balance. If you’re recording a video or making a NANO purchase in public and don’t want onlookers to know how much NANO you own, then all you need to do is tap your balance and it will disappear.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/369/1*ZjRvm5FBTVS1uTWCxRRw8A.gif" /><figcaption>A community requested feature: Hide balance.</figcaption></figure><ul><li><strong>A New Language</strong> — We’ve improved translations for many existing languages, we were also able to add <strong>Japanese</strong> as a new language, making Natrium even more accessible.</li><li><strong>Face Unlock/Authentication on Android</strong> — The Google Pixel 4 was recently announced, it is the first Android device with <em>secure</em> face authentication. We’ve added support for this into Natrium 2.1.</li></ul><p>As always, there’s plenty of minor bug fixes and performance improvements — the full progress can be seen on the <a href="https://github.com/appditto/natrium_wallet_flutter/commits"><strong>Natrium GitHub</strong></a>.</p><h3>What’s Next for Natrium?</h3><p>We’ve learned a lot since Natrium was initially unveiled over a year ago. Not just in terms of our skillsets, but also about how people commonly interact with Natrium and cryptocurrency wallets in general. We’ve also learned a lot of new things about <a href="http://flutter.io"><strong>Flutter</strong></a>, and Flutter has evolved since we’ve initially developed Natrium. We have developed a comprehensive plan to rebuild Natrium using all of the new knowledge we have acquired in the codebase and also in the interface. There’s a lot of things we know we can do better, so we’re going to.</p><p>In comes <strong>Natrium 3</strong>, a light re-design and comprehensive rewrite of a large part of Natrium’s code base. Natrium 3 is combination of all of the things we have learned to date — about how people interact with the app and also simply things we can do better in the codebase. Natrium 3 is our next milestone — we want to make Natrium leaner, faster, more efficient, and easier-to-use than ever before. We’re excited to share our progress on Natrium 3 with you in the coming weeks.</p><h3><strong>Support </strong>Natrium Development</h3><p>Natrium is open source and released under the MIT license — it is completely <em>free</em>. If you would like to support the development of Natrium, you can donate using the link below:</p><p><a href="http://natrium.io/donate"><strong>natrium.io/donate</strong></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IWKn9ehAqnfrGnLds9G2YA.png" /></figure><h3>For more info &amp; regular updates:</h3><p>Natrium Twitter: <a href="https://twitter.com/NatriumIO"><strong>@NatriumIO</strong></a></p><p>Natrium Website: <a href="http://natrium.io"><strong>Natrium.io</strong></a></p><p>Appditto Twitter: <a href="http://twitter.com/appditto"><strong>@Appditto</strong></a></p><p>Appditto Website: <a href="http://appditto.com"><strong>Appditto.com</strong></a></p><p>Appditto Github: <a href="http://github.com/appditto"><strong>@Appditto</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=26ebec66bd5b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/natrium-v2-1-security-audit-and-more-26ebec66bd5b">Natrium v2.1 — Security Audit &amp; More</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Meet Blaise — Simple, Sleek, & Secure Pascal Wallet now available on the iOS App Store and Google…]]></title>
            <link>https://medium.com/appditto/meet-blaise-simple-sleek-secure-pascal-wallet-now-available-on-the-ios-app-store-and-google-a1247058c6e5?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/a1247058c6e5</guid>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[pascalcoin]]></category>
            <category><![CDATA[pascal]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Tue, 20 Aug 2019 02:04:05 GMT</pubDate>
            <atom:updated>2020-01-06T15:08:00.353Z</atom:updated>
            <content:encoded><![CDATA[<h3>Meet Blaise — Simple, Sleek, &amp; Secure Pascal Wallet now available on the iOS App Store and Google Play Store</h3><p><a href="https://blaisewallet.com"><strong>Blaise</strong></a> is a next-generation wallet for the <a href="https://pascalcoin.org"><strong>PascalCoin</strong></a> cryptocurrency. PascalCoin is infinitely scalable, decentralized, and offers many advanced features. PascalCoin is capable of zero-fee, instant transactions, storing data on-chain, smart contracts, and more. Blaise is now available on the <a href="https://play.google.com/store/apps/details?id=com.appditto.blaise"><strong>Google Play Store</strong></a> and the <a href="https://apps.apple.com/us/app/blaise-pascal-wallet/id1473011216"><strong>iOS App Store</strong></a>!</p><h3>Blaise 1.0 is Now Available!</h3><p>After a month of <a href="https://medium.com/appditto/meet-blaise-simple-sleek-secure-pascalcoin-wallet-public-beta-now-available-for-ios-and-1f503fc1302d">beta testing</a> and new developments, <a href="https://blaisewallet.com">Blaise</a> is now available on the <a href="https://play.google.com/store/apps/details?id=com.appditto.blaise"><strong>Google Play Store</strong></a> and the <a href="https://apps.apple.com/us/app/blaise-pascal-wallet/id1473011216"><strong>iOS App Store</strong></a>!</p><figure><img alt="Blaise is a simple, sleek &amp; secure Pascal wallet" src="https://cdn-images-1.medium.com/max/1024/1*VdujuD4YNusLbcyHIo1S6w.png" /><figcaption>Blaise is a simple, sleek &amp; secure Pascal wallet</figcaption></figure><h3>PascalCoin &amp; Unique Challenges</h3><p>PascalCoin is an <a href="https://www.pascalcoin.org/whitepapers#wp_6">infinitely scalable</a> cryptocurrency with a lot of innovative features including <a href="https://www.pascalcoin.org/whitepapers#wp_1">zero-fee transactions</a>, on-chain unique <a href="https://www.pascalcoin.org/whitepapers#wp_2">account names</a>, a <a href="https://www.pascalcoin.org/whitepapers#wp_4">community-driven governance structure</a>, and much more.</p><p>PascalCoin’s unique design comes with some unique challenges that many consider a barrier for adoption, including:</p><ol><li>Obtaining an Account— Accounts are “mined” and stored on-chain, they cannot simply be generated through a key derivation function like most other cryptocurrencies. This has numerous benefits including: simple, easy-to-remember account numbers instead of long, complex hex-strings, reducing the “squatting” on account names (as they are stored on-chain), and the ability to trade, sell them (e.g. for vanity purposes, or to sell a name). Unfortunately, the process of getting an account has been confusing and difficult for many users.</li><li>PascalCoin had a lack of wallet options, particularly light wallets. The community wanted an intuitive wallet that would be incredibly quick to setup and use, while still supporting PascalCoin’s numerous and innovative features.</li></ol><h3>Meet Blaise</h3><p>Blaise was developed for PascalCoin by <a href="https://appditto.com"><strong>Appditto</strong></a> as a part of PIP (PascalCoin Improvement Proposal) #35C. Solving these unique challenges were fundamental goals of the Blaise project — and we’ve succeeded. Blaise solves both of these challenges — it’s innovative, unique, and easy to use. The account process has never been easier.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h513ADKRjCLvxko0aY95Ww.png" /><figcaption>With Blaise, you can easily manage all your operations</figcaption></figure><h3>Getting an Account, Made Simple</h3><p>Blaise introduces an innovative “borrow an account” system. After just a couple of taps, you‘ll be given a “borrowed account.” Simply send some Pascal to it and the account will be permanently transferred to your public key. The only cost is a small 0.25 pascal fee (less than $0.04, equivalent), that will be deducted automatically from the funds you send. The account, once transferred, is yours permanently.</p><figure><img alt="With Blaise, getting your first Pascal account is super easy." src="https://cdn-images-1.medium.com/max/337/1*KL0VxUrpuEUdc3WbCfeJfQ.gif" /><figcaption>With Blaise, getting your first Pascal account is super easy.</figcaption></figure><h3>Send Pascal, However You Want</h3><p>Sending Pascal is easier and faster than ever with Blaise. Converting to local currency, scanning a QR code, adding payloads, sending to an on-chain account name, a feature-rich address book. All of these options are bundled into a streamlined, innovative interface.</p><figure><img alt="Blaise makes sending Pascal fast &amp; easy with various options" src="https://cdn-images-1.medium.com/max/337/1*viMsw-e4ePbrdFK9Kk5gog.gif" /><figcaption>Blaise makes sending Pascal fast &amp; easy with various options</figcaption></figure><h3>Blaise Speaks Multiple Languages</h3><p>The entire interface, made to speak your language. Choosing your native language or preferred local currency couldn’t be any easier.</p><figure><img alt="Blaise supports multiple languages" src="https://cdn-images-1.medium.com/max/1024/1*jyvQ_zydlt34Rg0XlHXX5g.png" /><figcaption>Blaise supports multiple languages</figcaption></figure><h3>The Many Faces of Blaise</h3><p>Blaise has multiple looks that have been meticulously crafted down to the finest details — including animations, illustrations, and even the app icon itself.</p><figure><img alt="Blaise has meticulously craBlaise has meticulously crafted themesfted themes" src="https://cdn-images-1.medium.com/max/1024/1*ibco14LKsIE_8AZFf9mchg.png" /><figcaption>Blaise has meticulously crafted themes</figcaption></figure><h3>Receiving Pascal</h3><p>Ding! Blaise will alert you when you receive Pascal to any of your accounts through a push notification. Tired of constantly checking your wallet to see if that exchange withdraw has finally been processed? With Blaise, there’s no guesswork and you’ll know exactly when funds hit your account.</p><figure><img alt="Blaise notifies you when you receive Pascal" src="https://cdn-images-1.medium.com/max/1024/1*puxE28RtCf9dAtzmbNPysg.png" /><figcaption>Blaise notifies you when you receive Pascal</figcaption></figure><h3>The Technology Behind the Blaise Wallet</h3><p>We developed Blaise Wallet using the latest in mobile application frameworks, <a href="https://flutter.io/"><strong>Flutter</strong></a>. Flutter applications are developed using the <a href="https://dartlang.org/"><strong>Dart</strong></a> programming language.</p><p>There’s three primary components that drive the Blaise Wallet:</p><ol><li><a href="https://github.com/appditto/pascaldart"><strong>PascalDart</strong></a> — A 100% dart PascalCoin library, it supports key generation, ecliptic curve cryptography — including ECDH signatures and ECIES encryption, a full JSON-RPC API for interacting with the PascalCoin node, and many other features that are critical to the operation of Blaise.</li><li><a href="https://github.com/appditto/blaise_wallet_flutter"><strong>Blaise Flutter Application</strong></a><strong> </strong>— The user-facing application. It includes everything the users see and interact with, it also is responsible for critical functions such as secure key storage. The business logic lives here.</li><li><a href="https://github.com/appditto/blaise_wallet_server"><strong>Blaise Server</strong></a> — The server that powers Blaise. It is written in <a href="http://python.org">Python</a> — using <a href="https://docs.python.org/3/library/asyncio.html">asyncio</a> and <a href="https://aiohttp.readthedocs.io/en/stable/">AIOHTTP</a> for incredibly high performance and high concurrency. It powers the major “borrow account” feature, it provides a web-socket service so it can push price updates and new transactions to users, it is responsible for sending push notifications using <a href="https://firebase.google.com/docs/cloud-messaging">Firebase Cloud Messaging</a>, it also enhances server security by restricting access to the PascalCoin node.</li></ol><p>All of these are open source and released under the permissive <a href="https://github.com/appditto/blaise_wallet_flutter/blob/master/LICENSE">MIT License</a>.</p><h3>Get Blaise!</h3><p>Blaise is completely free and compatible with most Android and iOS devices.</p><p><a href="https://play.google.com/store/apps/details?id=com.appditto.blaise"><strong>Get it for Android on the Google Play Store</strong></a><strong>!</strong></p><p><a href="https://apps.apple.com/us/app/blaise-pascal-wallet/id1473011216"><strong>Get it for iOS on the App Store</strong></a><strong>!</strong></p><p><a href="https://blaisewallet.com"><strong>Visit the Blaise Website!</strong></a></p><p>Users who do not have the Google Play Store available in their region or on their device can get the latest releases from <a href="https://github.com/appditto/blaise_wallet_flutter/releases"><strong>GitHub</strong></a>.</p><h3>Thanks for reading!</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rXtsy6NDrlGsfah4cU6beQ.png" /></figure><p>Appditto Website: <a href="http://appditto.com/"><strong>appditto.com</strong></a></p><p>Appditto Twitter: <a href="http://twitter.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Github: <a href="http://github.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Instagram: <a href="http://instagram.com/appditto"><strong>@appditto</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a1247058c6e5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/meet-blaise-simple-sleek-secure-pascal-wallet-now-available-on-the-ios-app-store-and-google-a1247058c6e5">Meet Blaise — Simple, Sleek, &amp; Secure Pascal Wallet now available on the iOS App Store and Google…</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Meet Blaise: Simple, Sleek & Secure PascalCoin Wallet — Public Beta now Available for iOS and…]]></title>
            <link>https://medium.com/appditto/meet-blaise-simple-sleek-secure-pascalcoin-wallet-public-beta-now-available-for-ios-and-1f503fc1302d?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/1f503fc1302d</guid>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[pascalcoin]]></category>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Sat, 20 Jul 2019 21:16:10 GMT</pubDate>
            <atom:updated>2020-01-06T15:08:58.731Z</atom:updated>
            <content:encoded><![CDATA[<h3>Meet Blaise: Simple, Sleek &amp; Secure Pascal Wallet — Public Beta now Available for iOS and Android</h3><p>Blaise is a next-generation wallet for the <a href="http://pascalcoin.org">Pascal</a> cryptocurrency. Pascal is infinitely scalable, decentralized, and offers many advanced features. Pascal is capable of zero-fee, instant transactions, storing data on-chain, smart contracts, and more.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BRC5SLbRNtSPL-cQVATDng.png" /><figcaption>Meet with Blaise: Simple, Sleek &amp; Secure Pascal Wallet</figcaption></figure><h3><strong>What is Blaise?</strong></h3><p>Blaise is an all-new wallet developed with Google’s <a href="https://flutter.io">Flutter</a> framework. It is being developed as part of the Pascal Improvement Proposal (PIP) #31. The goal has been to create an intuitive, secure wallet that supports both the essential and advanced features the Pascal blockchain is capable of.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a1ZTSeZZ4tREkYGTjB0XAw.png" /><figcaption>Send &amp; Receive Pascal, Manage Your Operations</figcaption></figure><h3><strong>The Technology Behind the Blaise Wallet</strong></h3><p>We developed Blaise Wallet using the latest in mobile application frameworks, <a href="https://flutter.io">Flutter</a>. Flutter applications are developed using the <a href="https://dartlang.org">Dart</a> programming language.</p><p>The first technological hurdle was to develop an offline-signing library that would allow the app to sign and create operations completely on the device itself, this results in <strong>private keys never being sent to the server</strong>. The library we developed is called <a href="https://github.com/appditto/pascaldart">pascaldart</a> — it implements signing, encryption including ecies encryption for payloads, JSON-RPC, and more. It is available publicly <a href="https://pub.dev/packages/pascaldart">here</a> and is also on <a href="https://github.com/appditto/pascaldart">Github</a>.</p><p>Another major consideration when dealing with private-key security is storage of the private key. The private key needs to be stored securely on the user’s device — we use the native <a href="https://developer.android.com/training/articles/keystore">Android KeyStore</a>, and the <a href="https://developer.apple.com/documentation/security/keychain_services">iOS KeyChain</a> for secure key storage.</p><p>For the application state we are using <a href="https://pub.dev/packages/mobx">mobx</a>. This is a reactive state management system that efficiently maintains the entire state of the application and all of the user’s accounts.</p><h3>User Interface &amp; Experience</h3><p><a href="http://pascalcoin.org">Pascal</a> has a feature rich protocol with a lot of different capabilities. We tried to highlight these features without overwhelming new users. We created a simple &amp; friendly interface that can suit both new users and enthusiasts alike. We made various custom animations and illustrations to create an easily understandable and enjoyable experience for everyone.</p><p>We also developed various different features that would make operation of the wallet faster while feeling familiar to users with different levels of knowledge about the Pascal protocol, such as the contacts feature.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aoKtvuAAb83-VwR6V3fyvg.png" /><figcaption>With contacts, sending &amp; receiving Pascal is easier and more secure</figcaption></figure><p>At Appditto we pride ourselves on using the latest, most innovative technologies in order to provide not only the best product possible — but also the best user experience. Today we’re ready to share Blaise with the public — <strong>Blaise is now available for open beta testing on iOS TestFlight and on the Google Play Store for Android users.</strong></p><h3><strong>How do I try Blaise?</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2pIoKofqNbb4YsEN0kyuYw.png" /><figcaption>Blaise Dark Mode</figcaption></figure><p>Anyone can sign up for the beta as long as they have an iPhone with iOS 10 or newer or an Android device with Android 4.4 or newer.</p><p><a href="https://play.google.com/apps/testing/com.appditto.blaise">Android Users — Sign up by clicking here!</a></p><p><a href="https://testflight.apple.com/join/hd72GGk2">iOS Users — Sign up by clicking here!</a></p><h3><strong>What’s Next?</strong></h3><p>There’s a lot of work to be done still — including translations, currency conversions, easy account acquisition, and a web-socket service that will push new transactions as well as allow for push notifications.</p><p>Pascal accounts are acquired by mining, unlike traditional cryptocurrencies. Users need to acquire one before they can interact with the Pascal network. Our primary focus is streamlining this experience and making it as easy for users as possible.</p><p>We’ll be pushing updates in the coming weeks introducing these new features and improvements, you can follow our progress on the <a href="https://discord.gg/sJqcgtD">Pascal Discord</a>, in the channel <strong>#pip-0031c.</strong></p><h3>Thanks for reading!</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rXtsy6NDrlGsfah4cU6beQ.png" /></figure><p>Appditto Website: <a href="http://appditto.com"><strong>appditto.com</strong></a></p><p>Appditto Twitter: <a href="http://twitter.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Github: <a href="http://github.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Instagram: <a href="http://instagram.com/appditto">@appditto</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1f503fc1302d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/meet-blaise-simple-sleek-secure-pascalcoin-wallet-public-beta-now-available-for-ios-and-1f503fc1302d">Meet Blaise: Simple, Sleek &amp; Secure PascalCoin Wallet — Public Beta now Available for iOS and…</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Natrium’s Next Big Update Released on Android and iOS]]></title>
            <link>https://medium.com/appditto/natriums-next-big-update-released-on-android-and-ios-41e680e00afe?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/41e680e00afe</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[nano]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Sat, 20 Apr 2019 14:05:30 GMT</pubDate>
            <atom:updated>2019-04-20T14:05:30.954Z</atom:updated>
            <content:encoded><![CDATA[<p>A little over a month ago we released <a href="https://medium.com/appditto/natrium-2-0-nano-mobile-wallet-now-available-on-the-ios-app-store-c7d87c0c7b5a">Natrium 2.0</a> — a next-generation mobile wallet for <a href="https://nano.org">NANO</a> . This upgrade has now been fully rolled out to the <a href="https://play.google.com/store/apps/details?id=co.banano.natriumwallet">Google Play Store</a>, and some new features and improvements have been rolled out the the iOS App Store as well.</p><h3>Natrium is a Next-Generation App for a Next-Generation Cryptocurrency</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QD712FC61ml2DBx512roEA.png" /><figcaption>All new Natrium features are now available on Android</figcaption></figure><p>Natrium is a wallet built for NANO that is built using the fast, native cross-platform framework — <a href="https://flutter.io">Flutter</a>. Natrium is <em>fast </em>and it’s full of features: Paper wallet / seed sweeping, push notifications, multiple accounts, contacts, numerous currency conversions and translations, and more.</p><h3>Representatives &amp; Decentralization</h3><p>Decentralization is a key component to making NANO network stronger. Because of this, we started focusing on the things that can speed up this process and make it easier. Today we have the first result of our efforts: We are adding a pre-populated list of representatives that have a relatively small voting-weight — provided by <a href="https://mynano.ninja/">My Nano Ninja</a>. This makes choosing a quality representative incredibly easy — just tap “Pick From a List” button and pick a representative, no need to go search for a representative and copy paste the address. But if you want to do that, you still can with the “Manual Entry” button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WdBd98EljoQX51pZxLQ8og.png" /><figcaption>Easy to use Representative List</figcaption></figure><h3>Nano Prefix</h3><p>Existing Android users using Natrium are already familiar with this. Their address begins with nano_ instead of xrb_. For iOS users, we reverted to using xrb_ due to lack of support with some other services in the Nano ecosystem. However, with the news about the upcoming <a href="https://github.com/nanocurrency/nano-node/pull/1771">Nano V19 emitting </a><a href="https://github.com/nanocurrency/nano-node/pull/1771">nano_</a> prefixes — Natrium is now using nano_ everywhere. You can still send to either type of prefix, but throughout the app addresses will be represented with nano_. For some parts such as account history, it will still display with xrb_ until we upgrade our node to V19. After that, app-wide everything will be using the new prefix.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pjzg9RwzBrqdAp_JJr-yDg.png" /><figcaption>nano_ prefix</figcaption></figure><h3>Natrium, Everywhere</h3><p>When we started, our short term plan was to create a fast, innovative mobile wallet that runs both on iOS &amp; Android natively, from a single code base. Today, we have officially achieved that. This means every update we release from now on, will come to both iOS &amp; Android at the same time.</p><p>But that’s not all, we want our users to have the same great experience everywhere. Mobile, desktop and web. We’re closely following the development of Flutter, and once the tech is there - like we did with Android &amp; iOS — we’ll make sure to be the first ones to implement it.</p><h3>More Than a Wallet</h3><p>As you may now, we have been focused strictly on creating a solid wallet for Nano that everyone would enjoy using everyday, from the most avid Nano enthusiast to someone that just met with Nano.</p><p>Today, we are proud to announce that we are rebranding. Instead of “Natrium Wallet”, the new preferred name is simply “Natrium”. We‘re working on other Nano-related products, many of which will be a vital part of the Natrium app. All these developments will be a part of the Natrium brand — interested in what we’re doing? Follow us on <a href="https://twitter.com/NatriumIO"><strong>twitter</strong></a>.</p><h3><strong>For more info &amp; regular updates:</strong></h3><p>Natrium Twitter: <a href="https://twitter.com/NatriumIO"><strong>@NatriumIO</strong></a></p><p>Natrium Website: <a href="https://natrium.io"><strong>natrium.io</strong></a></p><p>Appditto Twitter: <a href="https://twitter.com/appditto"><strong>@appditto</strong></a></p><p>Appditto Website: <a href="https://appditto.com"><strong>appditto.com</strong></a></p><p>Appditto Github: <a href="https://github.com/appditto"><strong>@appditto</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=41e680e00afe" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/natriums-next-big-update-released-on-android-and-ios-41e680e00afe">Natrium’s Next Big Update Released on Android and iOS</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Natrium 2.0 — NANO Mobile Wallet now Available on the iOS App Store!]]></title>
            <link>https://medium.com/appditto/natrium-2-0-nano-mobile-wallet-now-available-on-the-ios-app-store-c7d87c0c7b5a?source=rss-a230aed74e28------2</link>
            <guid isPermaLink="false">https://medium.com/p/c7d87c0c7b5a</guid>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[nano]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[apps]]></category>
            <category><![CDATA[bitcoin]]></category>
            <dc:creator><![CDATA[Appditto]]></dc:creator>
            <pubDate>Fri, 08 Mar 2019 15:51:24 GMT</pubDate>
            <atom:updated>2020-01-06T15:09:27.188Z</atom:updated>
            <content:encoded><![CDATA[<h3>Natrium 2.0 — NANO Mobile Wallet now Available on the iOS App Store!</h3><p>Natrium — a mobile wallet for the NANO currency — is now available on the <a href="https://itunes.apple.com/us/app/natrium/id1451425707?ls=1&amp;mt=8">iOS App Store</a>!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gpy1fWrXId8OgBUw78OOgA.png" /></figure><p>Natrium is an intuitive, user-friendly mobile wallet for the <a href="https://nano.org">NANO cryptocurrency</a>. Natrium 1.0 was originally released in November on Android and the reaction to the release was overwhelmingly positive. Since then, we’ve been investing hundreds of hours on the next generation of Natrium.</p><p>Natrium 2.0 was rewritten from the ground up using <a href="https://flutter.io">Flutter</a>, a cross-platform framework that allows Android and iOS apps to share the same codebase while also providing native-performance.</p><p>We’ve added many new features since Natrium’s initial release — most notably the ability to redeem paper wallets instantly. We’re excited to announce some big new features that are available today.</p><h3>Multi-accounts, Made Simple</h3><p>Probably the most requested feature of our users has been the ability to manage multiple accounts from within Natrium. The biggest challenge we had to overcome when considering this was, how can we accomplish this without cluttering the interface and obstructing the current flow of the interface?</p><p>Today as part of this release, <strong>multiple accounts are now supported in Natrium!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ETiQCZLz2C7j9_EpUFdkRg.png" /><figcaption>Easy to use &amp; familiar multi-account implementation</figcaption></figure><p>We expanded the interface to allow for multiple accounts by using an account-switching interface that most people are already familiar with — similar to some of the most popular apps people use such as Twitter, eBay, Telegram, and many more. You can add up to 20 accounts, hide them, and rename them. Switching to a different account takes only one tap, then you’re instantly ready to use it. Push notifications work for all 20 accounts, tapping a notification will open the app and automatically switch to the account the notification is for — making the entire experience as seamless as ever.</p><h3>System-wide Themes</h3><p>Natrium 2.0 introduces a comprehensive theme system. From clean and professional to wacky and bright, there’s a style for everyone. These themes customize the entire experience — even down to the app icon itself.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HpY_ZUY71ppz5E2us4P8ZA.png" /><figcaption>System-wide themes</figcaption></figure><p>We plan to add more themes over time, and are considering implementing the concept of un-lockable themes. For example, change your representative to a highly rated-one from <a href="https://mynano.ninja/">My Nano Ninja</a> — then unlock a new theme. This is just one of the possible ways that we can expand the themes in the future to make the experience more interactive and more fun.</p><h3>Near Instant Notifications</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I3LTwUVWlPTOxT7gYz8h1Q.png" /><figcaption>Get notifications when you receive Nano, under a second</figcaption></figure><p>One of Natrium’s most unique features, push notifications, isn’t all that new but it has gotten even better since we upgraded our backend to the new <a href="https://medium.com/nanocurrency/the-dolphin-release-has-arrived-6df21c4f06a8">Nano v18 Dolphin</a> release. We’ve seen notifications arrive in <strong>less than a second</strong> after the NANO has been sent. This is an incredible step forward for NANO and the future of cryptocurrency payments.</p><iframe src="https://cdn.embedly.com/widgets/media.html?type=text%2Fhtml&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;schema=reddit&amp;url=https%3A//www.reddit.com/r/nanocurrency/comments/atgozh/testing_nanos_speed_and_natriums_responsive/&amp;image=https%3A//i.embed.ly/1/image%3Furl%3Dhttps%253A%252F%252Fexternal-preview.redd.it%252FAUe10YRDq8binxC2TF9sFfDSM888eAJFJAi6o344N0k.png%253Fformat%253Dpjpg%2526auto%253Dwebp%2526s%253Db346d207fa4328bec8c65f3c96fab6f0d12e72a5%26key%3Da19fcc184b9711e1b4764040d3dc5c07" width="600" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/42fe5136695e9c3b1f648dad8c948d4b/href">https://medium.com/media/42fe5136695e9c3b1f648dad8c948d4b/href</a></iframe><h3>Other Features</h3><p>Full list/documentation at <a href="https://github.com/appditto/natrium_wallet_flutter"><strong>Github</strong></a>:</p><ul><li>Send/Receive NANO securely</li><li>View your entire transaction history</li><li>View transaction details using <a href="https://nanocrawler.cc">NanoCrawler</a></li><li>Share a personalized card with your QR code and address as a PNG image</li><li>Manage multiple accounts on a seed</li><li>Fully featured contacts/address book</li><li>Change your representative</li><li>Biometric authentication (FaceID+TouchID)</li><li>QR scanning</li><li>Deep link/URI support)</li><li>Paper wallet loader/Seed sweeper</li><li>Push notifications</li><li>30+ currency conversions, more than 20 languages supported</li></ul><h3>What’s next?</h3><p>We’re going to continue our commitment to NANO and Natrium — Android users will be receiving the Natrium 2.0 update initially <em>as a BETA </em>within the next week or two.</p><p>We have a new support channel on Discord at <a href="https://support.natrium.io">https://support.natrium.io</a> — feel free to stop in to report any feedback you may have.</p><h3>Follow us for updates</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rXtsy6NDrlGsfah4cU6beQ.png" /></figure><p>Follow <a href="https://medium.com/u/a230aed74e28"><strong>Appditto</strong></a> on social media to stay up to date with news and updates. Looking for a cross-platform app for your business?</p><p>Reach out at <a href="https://appditto.com"><strong>appditto.com</strong></a></p><p>Twitter: <a href="https://twitter.com/appditto"><strong>@appditto</strong></a></p><p>Github: <a href="https://github.com/appditto"><strong>@appditto</strong></a></p><p>Reddit: <a href="http://reddit.com/u/appditto"><strong>@appditto</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7d87c0c7b5a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/appditto/natrium-2-0-nano-mobile-wallet-now-available-on-the-ios-app-store-c7d87c0c7b5a">Natrium 2.0 — NANO Mobile Wallet now Available on the iOS App Store!</a> was originally published in <a href="https://medium.com/appditto">Appditto</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>