Borsellino is the first multi-chain, easy-to-use and multiplatform Cosmos Hub wallet.
Entirely made with Flutter, it fetches the data about the supported chains
from a remote source. This means that adding a new supported chain is no harder than submitting a PR to the proper
This project was born as Commercio.network's entry at the Seoul HackAtom 2019.
Currently supported chains are:
In order to run the this project you must satisfy the given pre-requisites:
Having an Android or iOS emulator setup (alternatively, an Android or iOS physical device connected to your pc).
Note. For Android-based systems, the application will only work on devices running Android 4.3 (API 18) or later.
1. Switch to the master branch of Flutter by running:
flutter channel master flutter upgrade
2.. Download all the project dependencies by running:
flutter pub get
3. Complete the setup by running
flutter pub run build_runner build
4. Run the project:
Working with Flutter means that we had to rely on third-party code in order to manage some security-related parts of the
application. In particular, we used the
library to manage the private keys saving and reading. If you want to know more on how we interact with those high-risk
cryptographic parts, you can take a look at our source code, especially at the file
where all the keys are saved and read when creating a new account or signing a transaction.
The whole project is based on the BLoC Library.
Using it we can ensure separation of concerns between the logic and the presentation part. BLoC are all found inside the
lib/bloc folder and all act as a middle layer between the logic part and the view part, representing the
presentation layer themselves.
We tried to follow the architecture idea that is described on the BLoC library page. This means we have the following code dependencies:
Page -> BLoC -> Repository -> Source
And the following data flow:
Page -> BLoC -> Repository -> Source | Data is fetched from internet, saved on the device or manipulated | V Page <- BLoC <- Repository <- Source
In order to prevent having a lot of dependencies into the
main function, we used the
dependency injection pattern.
In order to do so, we used the dependencies_flutter Dart library following the Medium article made by its creator.
We've put all the modules that provide the different components into the
The main class that acts as a singleton to get the dependencies is located into the
That class is used inside the BLoC implementations in order to get a reference to the repositories that each one uses to fetch or save the data.