Difference between revisions of "Mojo Wallet"

From Mochimo Wiki
Jump to: navigation, search
(Activate an address)
 
(26 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
The Mojo wallet is the official wallet of the Mochimo cryptocurrency. It was released for open beta on December 25, 2018.
 
The Mojo wallet is the official wallet of the Mochimo cryptocurrency. It was released for open beta on December 25, 2018.
 
It is build in Java 8, making it available for all major operating system (Windows, Linux, OS X).
 
It is build in Java 8, making it available for all major operating system (Windows, Linux, OS X).
 +
 +
A quick start [[Mojo Quick Start Guide|guide]] is also available
  
 
__TOC__
 
__TOC__
Line 6: Line 8:
  
 
==Installation==
 
==Installation==
Mojo itself is a portable application that does not need to be installed, but requires at least [https://www.java.com/en/download/ Java version 8] to be installed in order to run. In most cases, double clicking the ''JAR'' file suffice to run the application. If this failed, it can be started by entering the following command into a CMD or Shell terminal: <code> java -jar [Mojo jar file]</code>.
+
Mojo itself is a portable application that does not need to be installed, but requires at least [https://www.java.com/en/download/ Java version 8] to be installed in order to run. In most cases, double clicking the ''JAR'' file is sufficient to run the application. If this fails, it can be started by entering the following command into a CMD or Shell terminal: <code> java -jar [Mojo jar file]</code>.
 
===Create a wallet file===
 
===Create a wallet file===
 
# Start Mojo and click on ''New''
 
# Start Mojo and click on ''New''
 
# Enter a name for the wallet (optional) and a password
 
# Enter a name for the wallet (optional) and a password
# [https://en.wikipedia.org/wiki/PBKDF2 PBKDF2] value can be change for faster loading of the wallet (at a cost of a lower resistance to brute force attack)
+
# [https://en.wikipedia.org/wiki/PBKDF2 PBKDF2] value can be change for faster loading of the wallet (at the cost of a lower resistance to a brute force attack)
 
# Default compression [https://en.wikipedia.org/wiki/Gzip GZIP] reduce the size of the wallet file
 
# Default compression [https://en.wikipedia.org/wiki/Gzip GZIP] reduce the size of the wallet file
 +
#  '''Make sure to write down the seed sphrase (and pass passphrase if any)'''. They will be needed to restore your wallet.
  
===Import addresses===
 
'''Mojo cannot read the legacy ''*.wal'' file but allows importing legacy address file ''*.maddr'''''
 
  
# Export the desired address from the legacy CLI wallet. To export the secret along with the address, select ''yes'' when prompted <code>Export balance ? y/n</code> and again ''yes'' on <code>Export secret? y/n</code>
 
# Open Mojo and navigate to the ''Import'' tab
 
# Select the appropriate import (''Legacy'' for legacy address file, [https://en.wikipedia.org/wiki/QR_code QR code] or default [https://en.wikipedia.org/wiki/JSON JSON])
 
# Click ''Add'' to add the address to the wallet. Use ''Add offline'' to skip tag resolution
 
# If you imported a secret, backup the wallet file
 
  
===Manage addresses===
+
===Address management===
 
====Address pool====
 
====Address pool====
 
The wallet file contains a pool of addresses which are used during operation (creating a new address, rolling a source address into a change address, etc).
 
The wallet file contains a pool of addresses which are used during operation (creating a new address, rolling a source address into a change address, etc).
'''This pool must be expanded before any operation can happen'''.
+
When the size of the pool goes to zero '''it must be expanded before an address can be spent again'''.
  
 
# Under tab ''New'', click on ''Expand'' and select the number of addresses to generate
 
# Under tab ''New'', click on ''Expand'' and select the number of addresses to generate
 
# Backup the wallet file after the expand is completed
 
# Backup the wallet file after the expand is completed
  
The Mojo wallet will use these addresses as needed to process user requests. Once you ran out of addresses, just expand the pool and backup your wallet.
+
The Mojo wallet will use these addresses as needed to process user requests. Once the pool is exhausted a new expand must be performed (note: expand can be done at any time and certainly before the pool dries out).
  
 
====Activate an address====
 
====Activate an address====
Address can be activated from the pool under the tab ''New''. Use ''Register'' to activate a tagged address through a fountain. The fountain will register the tag in the network by sending a specific transaction. Depending on the fountain and the network state, the registration can take several block to be processed. Until the registration is completed, the account will displayed <code>Tag not found</code> status. Once the address is funded, the status will show <code>Active</code> and will hold a small amount of Mochimo (currently 0.000000501 MCM which is the smallest possible amount for an address to exist on the network).
+
Address can be activated from the pool under the tab ''New''. Use ''Register'' to activate a tagged address through a fountain. The fountain will register the tag in the network by sending a specific transaction. Depending on the fountain and the network state, the registration can take several block to be processed. Until the registration is completed, the account will display status <code>Activation pending</code> (or <code>Tag not found</code> if the wallet has been closed in the meantime). Once the address is funded, the status will show <code>Active</code>. By default, tag address will show 0 MCM even though the actual balance is 0.000000501 MCM. That is because 0.000000501 MCM is smallest possible amount for an address to exist on the network. Therefore, it is not be possible to spent the totality of a tag address without loosing the tag. For this reason, all tag balance are discounted by 0.000000501 MCM when mode ''Advanced'' is not selected.
  
Use ''Create without registration'' if you do not want to use a fountain service or that you are not using a tag.
+
Use ''Create without tag'' if you do not want to use a fountain service or that you are not using a tag.
 
Use ''Offline registration'' to skip network checks.
 
Use ''Offline registration'' to skip network checks.
  
 
====Account dashboard====
 
====Account dashboard====
 
All addresses can be found under the ''Accounts'' tab. By default, only <code>Active</code> and <code>Spent</code> address are being displayed. You can displayed all address by setting the ''Search'' field (on the top) to <code>*</code>.
 
All addresses can be found under the ''Accounts'' tab. By default, only <code>Active</code> and <code>Spent</code> address are being displayed. You can displayed all address by setting the ''Search'' field (on the top) to <code>*</code>.
You can remove an address (for example a ''Spent'' address) from the default dashboard by deleting the address (see [[http://mochiwiki.com/mediawiki/mediawiki/index.php?title=Mojo_wallet&action=submit#Account_window|Account window]]).
+
You can remove an address (for example a ''Spent'' address) from the default dashboard by archiving the address (see [[Mojo_Wallet#Account_window|Account window]]).
  
 
====Account window====
 
====Account window====
 
Double click add account from the dashboard to open the Account window. This window is account specific and contain all the info about an account.
 
Double click add account from the dashboard to open the Account window. This window is account specific and contain all the info about an account.
You can copy the name, tag or address of an account into the clipboard by double clicking it. Use the various export option to share and address.
+
You can copy the name, tag or address of an account into the clipboard by double clicking it. Use the various export option to share an address.
The ''Delete'' button will flag the account and remove it from the default dashboard.
+
The ''Archive'' button will flag the account and remove it from the default dashboard.
 +
 
 +
====Import address====
 +
'''Mojo cannot read the CLI legacy ''*.wal'' file but allows importing legacy address file ''*.maddr'''''
 +
 
 +
''You can jump to step 4 to import from a tag''
 +
 
 +
# Export the desired address from the legacy CLI wallet. To export the secret along with the address, select ''yes'' when prompted <code>Export balance ? y/n</code> and again ''yes'' on <code>Export secret? y/n</code>
 +
# Open Mojo and navigate to the ''Import'' tab
 +
# Select the appropriate import (''Legacy'' for legacy address file, [https://en.wikipedia.org/wiki/QR_code QR code] or default [https://en.wikipedia.org/wiki/JSON JSON])
 +
# Use tag resolve icon to resolve the tag if needed
 +
# Click ''Add'' to add the address to the wallet. Use ''Add offline'' to skip tag check
 +
# If you imported a secret, backup the wallet file
 +
 
 +
====Export address====
 +
Account address and secret can be export from the [[Mojo_Wallet#Account_window|Account window]].
 +
Different type of export are available:
 +
# [https://en.wikipedia.org/wiki/JSON JSON] export (text file)
 +
# [https://en.wikipedia.org/wiki/QR_code QR code] export ([[https://en.wikipedia.org/wiki/Portable_Network_Graphics PNG]] file). Note: that QR code holding secrets are colored (instead of black and white)
 +
# [[Command_Line_Wallet|Legacy ]] export (binary file)
 +
 
 +
'''Be careful not to export the secret of an account when sharing your export file with a third party'''
 +
 
 +
 
 +
===Receive Mochimo===
  
 +
In order to receive Mochimo, the recipient must provide the sender with an address for which he/she holds the secret. Export the recipient address (see [[Mojo_Wallet#Export_address|Export address]]) '''without the secret''' and share the export file with the sender. A tag can also be shared in place of a full address.
  
 
===Send Mochimo===
 
===Send Mochimo===
 +
 +
# Import the recipient address into the wallet (see [[Mojo_Wallet#Import_address|Import address]])
 +
# Make sure there is at least one address available in the pool. If not, ''Expand'' the pool (see [[Mojo_Wallet#Address_pool|Address pool]])
 +
# Navigate to tab ''Send''
 +
# Select the source address to spend
 +
# Select the destination address
 +
# By default, the wallet will automatically activate a new address from the pool as the change address of the transaction. You can specify a change address by unticking the checkbox ''Roll source address''
 +
# Input the amount to send. By default, the amount is set in MCM but can be change to Satochi (SMCM) by ticking the checkbox ''SatoChi''
 +
# Click ''Send'' to send the transaction to the network
 +
 +
 +
===Restore from seed phrase===
 +
# Select ''Restore from seed phrase'' from the login frame
 +
# Enter a new password for the restored wallet
 +
# Enter the original seed phrase (and passphrase if any)
 +
# Click ''Restore''
 +
# Select the size of the batch of addresses to recover
 +
# You can repeat the recovery batch until all balances are recovered
 +
  
 
===Restore from backup file===
 
===Restore from backup file===
 +
# Create a new wallet (see [[Mojo_Wallet#Create_a_wallet_file|Create a wallet file]])
 +
# Navigate to tab ''Restore''
 +
# Select the backup file and input the password
 +
# Click ''Restore''
 +
# After a while, the restored address will be available on ''Accounts'' tab
 +
 +
 +
==One-Time-Signature WOTS+ & Tag paradigm==
 +
 +
Mochimo uses the quantum proof WOTS+ algorithm to secure transactions. Because this is a One-Time-Signature scheme, the same WOTS+ should never be used more than once in order to remain secured. In order to avoid the burden of exchanging raw WOTS+ of over 4000 character that cannot be reused, Mochimo uses a system of ''Tag'' that can be used as a unique identifier to receive and send coin. '''Unlike the underlying WOTS+, the ''Tag'' will never changes and can receive and spent MCM an unlimited amount of times without comprising the security of the funds. '''When spending a ''Tag'', the Mojo wallet will generate a new address on the ''Account'' tab. This new address have the same tag and will received the change balance (Change balance = Original balance - Payment amount - Fee). Once the transaction is completed, the old address (marked <code>Spent</code>) can be archived (from the ''Account'' window) and wont be shown in the ''Account'' tab anymore.
 +
 +
Payment scenario: send 1 MCM from Tag xxxxxxxxxxxxxxxxxxxxxxxx
 +
# Account tag xxxxxxxxxxxxxxxxxxxxxxxx holds balance of 3 MCM
 +
# Send 1 MCM from account tag xxxxxxxxxxxxxxxxxxxxxxxx to any address
 +
# The original account tag xxxxxxxxxxxxxxxxxxxxxxxx is marked <code>Spent</code> and the balance is 3 MCM
 +
# A new account is created with tag xxxxxxxxxxxxxxxxxxxxxxxx. This is the change account. It is marked <code>Transaction pending</code> (or <code>Tag mismatch</code>) and the balance is 0 MCM
 +
# The transaction gets included in a block
 +
# The original account tag xxxxxxxxxxxxxxxxxxxxxxxx is marked <code>Spent</code> and the balance is 0 MCM
 +
# The change account tag xxxxxxxxxxxxxxxxxxxxxxxx is marked <code>Active</code> and the balance is 1.999999500 (3 MCM - 1 MCM - 0.000000500 MCM)
 +
# The original account can be archived
  
 
==Advanced==
 
==Advanced==
  
 
===Offline transaction===
 
===Offline transaction===
 +
On cold wallet:
 +
# Navigate to tab ''Send''
 +
# Input source, destination and change address (see [[Mojo_Wallet#Send_Mochimo|Send Mochimo]])
 +
# Tick the checkbox ''Offline''
 +
# Input the balance of source address and the amount to send
 +
# Click on ''Sign only''
 +
# Save the transaction file
 +
 +
On hot wallet:
 +
# Navigate to tab ''Push''
 +
# Use ''Import TX'' to import the transaction file
 +
# Click ''Send'' to send the transaction to the network
 +
 
===Tor Network===
 
===Tor Network===
 +
Mojo can be used through the [https://en.wikipedia.org/wiki/Tor_(anonymity_network) Tor Network] .
 +
# Install and start [https://www.torproject.org/projects/torbrowser.html.en Tor Browser]
 +
# Open a CMD/Shell terminal
 +
# Start Mojo with <code>java -Dsocket.proxyHost=localhost -Dsocket.proxyPort=9005 -jar [Mojo jar file]</code>
 +
 +
Note: Mojo have been successfully used on [https://en.wikipedia.org/wiki/Tails_(operating_system) Tails] OS with the same command
 +
 
===Settings===
 
===Settings===
 +
====Wallet====
 +
* Update heartbeat: how often does the wallet check the height of the network and start an "Update task" for each wallet entry
 +
* Update timeout: max duration of the "Update task"
 +
* Update threads: number of threads to process pending "Update task"
 +
* Resolve timeout: max duration of "Tag resolution" routine
 +
* Send timeout: max duration of "Send" routine
 +
* Advanced Mode: activate the advanced features of the wallet (not recommended)
 +
====Network====
 +
* Nodes: semi colon separated list of peer's IP
 +
* Coreip file: file path of peer's IP
 +
* Providers: semi colon separated list of "Coreip file" provider
 +
* Port: the port of the network
 +
* Connect timeout: maximum allowed time to establish a connection to a node
 +
* Read timeout: maximum allowed time between data reception
 +
* Retries on timeout: number of retries if a timeout occurs
 +
* Qorum: number of node to be used when requesting data
 +
* Map max depth: maximum number of jump when mapping the network
 +
* Map max size: maximum number nodes to map
 +
* Map timeout: maximum time allowed to mapping
 +
* Map heartbeat: how often does the wallet map the network
 +
 +
 +
 +
===Command-line interface===
 +
Mojo offer a command-line interface (CLI) with features similar to the GUI. The complete list of CLI operations can be seen with the command <code>java -jar [Mojo jar file] -h</code>
 +
The CLI interface offers much more flexibility than the GUI and should be used carefully.
 +
  
 
==Implementation==
 
==Implementation==
 +
The Mojo wallet has been developed following the principle of [https://en.wikipedia.org/wiki/Abstraction_principle_(computer_programming) abstraction] making it highly flexible and easier to be reviewed.
 +
The code is split in several [https://en.wikipedia.org/wiki/Apache_Maven MAVEN] modules:
 +
* mojo-core: the core engine of the wallet responsible for all access to the wallet file
 +
* mojo-gui-swing: a [https://en.wikipedia.org/wiki/Graphical_user_interface GUI] implementation using [https://en.wikipedia.org/wiki/Swing_(Java) JAVA Swing]
 +
* mojo-gui-jfx: a proof of concept GUI implementation using [https://en.wikipedia.org/wiki/JavaFX JAVA FX]
 +
* mojo-cli: a CLI implementation
 +
* mojo-api: a set of [https://en.wikipedia.org/wiki/Interface_(computing)#Software_interfaces interfaces] allowing low coupling between the core and the GUI
 +
* mojo-app: the final Mojo application

Latest revision as of 20:26, 31 July 2019

The Mojo wallet is the official wallet of the Mochimo cryptocurrency. It was released for open beta on December 25, 2018. It is build in Java 8, making it available for all major operating system (Windows, Linux, OS X).

A quick start guide is also available


Installation

Mojo itself is a portable application that does not need to be installed, but requires at least Java version 8 to be installed in order to run. In most cases, double clicking the JAR file is sufficient to run the application. If this fails, it can be started by entering the following command into a CMD or Shell terminal: java -jar [Mojo jar file].

Create a wallet file

  1. Start Mojo and click on New
  2. Enter a name for the wallet (optional) and a password
  3. PBKDF2 value can be change for faster loading of the wallet (at the cost of a lower resistance to a brute force attack)
  4. Default compression GZIP reduce the size of the wallet file
  5. Make sure to write down the seed sphrase (and pass passphrase if any). They will be needed to restore your wallet.


Address management

Address pool

The wallet file contains a pool of addresses which are used during operation (creating a new address, rolling a source address into a change address, etc). When the size of the pool goes to zero it must be expanded before an address can be spent again.

  1. Under tab New, click on Expand and select the number of addresses to generate
  2. Backup the wallet file after the expand is completed

The Mojo wallet will use these addresses as needed to process user requests. Once the pool is exhausted a new expand must be performed (note: expand can be done at any time and certainly before the pool dries out).

Activate an address

Address can be activated from the pool under the tab New. Use Register to activate a tagged address through a fountain. The fountain will register the tag in the network by sending a specific transaction. Depending on the fountain and the network state, the registration can take several block to be processed. Until the registration is completed, the account will display status Activation pending (or Tag not found if the wallet has been closed in the meantime). Once the address is funded, the status will show Active. By default, tag address will show 0 MCM even though the actual balance is 0.000000501 MCM. That is because 0.000000501 MCM is smallest possible amount for an address to exist on the network. Therefore, it is not be possible to spent the totality of a tag address without loosing the tag. For this reason, all tag balance are discounted by 0.000000501 MCM when mode Advanced is not selected.

Use Create without tag if you do not want to use a fountain service or that you are not using a tag. Use Offline registration to skip network checks.

Account dashboard

All addresses can be found under the Accounts tab. By default, only Active and Spent address are being displayed. You can displayed all address by setting the Search field (on the top) to *. You can remove an address (for example a Spent address) from the default dashboard by archiving the address (see Account window).

Account window

Double click add account from the dashboard to open the Account window. This window is account specific and contain all the info about an account. You can copy the name, tag or address of an account into the clipboard by double clicking it. Use the various export option to share an address. The Archive button will flag the account and remove it from the default dashboard.

Import address

Mojo cannot read the CLI legacy *.wal file but allows importing legacy address file *.maddr

You can jump to step 4 to import from a tag

  1. Export the desired address from the legacy CLI wallet. To export the secret along with the address, select yes when prompted Export balance ? y/n and again yes on Export secret? y/n
  2. Open Mojo and navigate to the Import tab
  3. Select the appropriate import (Legacy for legacy address file, QR code or default JSON)
  4. Use tag resolve icon to resolve the tag if needed
  5. Click Add to add the address to the wallet. Use Add offline to skip tag check
  6. If you imported a secret, backup the wallet file

Export address

Account address and secret can be export from the Account window. Different type of export are available:

  1. JSON export (text file)
  2. QR code export ([PNG] file). Note: that QR code holding secrets are colored (instead of black and white)
  3. Legacy export (binary file)

Be careful not to export the secret of an account when sharing your export file with a third party


Receive Mochimo

In order to receive Mochimo, the recipient must provide the sender with an address for which he/she holds the secret. Export the recipient address (see Export address) without the secret and share the export file with the sender. A tag can also be shared in place of a full address.

Send Mochimo

  1. Import the recipient address into the wallet (see Import address)
  2. Make sure there is at least one address available in the pool. If not, Expand the pool (see Address pool)
  3. Navigate to tab Send
  4. Select the source address to spend
  5. Select the destination address
  6. By default, the wallet will automatically activate a new address from the pool as the change address of the transaction. You can specify a change address by unticking the checkbox Roll source address
  7. Input the amount to send. By default, the amount is set in MCM but can be change to Satochi (SMCM) by ticking the checkbox SatoChi
  8. Click Send to send the transaction to the network


Restore from seed phrase

  1. Select Restore from seed phrase from the login frame
  2. Enter a new password for the restored wallet
  3. Enter the original seed phrase (and passphrase if any)
  4. Click Restore
  5. Select the size of the batch of addresses to recover
  6. You can repeat the recovery batch until all balances are recovered


Restore from backup file

  1. Create a new wallet (see Create a wallet file)
  2. Navigate to tab Restore
  3. Select the backup file and input the password
  4. Click Restore
  5. After a while, the restored address will be available on Accounts tab


One-Time-Signature WOTS+ & Tag paradigm

Mochimo uses the quantum proof WOTS+ algorithm to secure transactions. Because this is a One-Time-Signature scheme, the same WOTS+ should never be used more than once in order to remain secured. In order to avoid the burden of exchanging raw WOTS+ of over 4000 character that cannot be reused, Mochimo uses a system of Tag that can be used as a unique identifier to receive and send coin. Unlike the underlying WOTS+, the Tag will never changes and can receive and spent MCM an unlimited amount of times without comprising the security of the funds. When spending a Tag, the Mojo wallet will generate a new address on the Account tab. This new address have the same tag and will received the change balance (Change balance = Original balance - Payment amount - Fee). Once the transaction is completed, the old address (marked Spent) can be archived (from the Account window) and wont be shown in the Account tab anymore.

Payment scenario: send 1 MCM from Tag xxxxxxxxxxxxxxxxxxxxxxxx

  1. Account tag xxxxxxxxxxxxxxxxxxxxxxxx holds balance of 3 MCM
  2. Send 1 MCM from account tag xxxxxxxxxxxxxxxxxxxxxxxx to any address
  3. The original account tag xxxxxxxxxxxxxxxxxxxxxxxx is marked Spent and the balance is 3 MCM
  4. A new account is created with tag xxxxxxxxxxxxxxxxxxxxxxxx. This is the change account. It is marked Transaction pending (or Tag mismatch) and the balance is 0 MCM
  5. The transaction gets included in a block
  6. The original account tag xxxxxxxxxxxxxxxxxxxxxxxx is marked Spent and the balance is 0 MCM
  7. The change account tag xxxxxxxxxxxxxxxxxxxxxxxx is marked Active and the balance is 1.999999500 (3 MCM - 1 MCM - 0.000000500 MCM)
  8. The original account can be archived

Advanced

Offline transaction

On cold wallet:

  1. Navigate to tab Send
  2. Input source, destination and change address (see Send Mochimo)
  3. Tick the checkbox Offline
  4. Input the balance of source address and the amount to send
  5. Click on Sign only
  6. Save the transaction file

On hot wallet:

  1. Navigate to tab Push
  2. Use Import TX to import the transaction file
  3. Click Send to send the transaction to the network

Tor Network

Mojo can be used through the Tor Network .

  1. Install and start Tor Browser
  2. Open a CMD/Shell terminal
  3. Start Mojo with java -Dsocket.proxyHost=localhost -Dsocket.proxyPort=9005 -jar [Mojo jar file]

Note: Mojo have been successfully used on Tails OS with the same command

Settings

Wallet

  • Update heartbeat: how often does the wallet check the height of the network and start an "Update task" for each wallet entry
  • Update timeout: max duration of the "Update task"
  • Update threads: number of threads to process pending "Update task"
  • Resolve timeout: max duration of "Tag resolution" routine
  • Send timeout: max duration of "Send" routine
  • Advanced Mode: activate the advanced features of the wallet (not recommended)

Network

  • Nodes: semi colon separated list of peer's IP
  • Coreip file: file path of peer's IP
  • Providers: semi colon separated list of "Coreip file" provider
  • Port: the port of the network
  • Connect timeout: maximum allowed time to establish a connection to a node
  • Read timeout: maximum allowed time between data reception
  • Retries on timeout: number of retries if a timeout occurs
  • Qorum: number of node to be used when requesting data
  • Map max depth: maximum number of jump when mapping the network
  • Map max size: maximum number nodes to map
  • Map timeout: maximum time allowed to mapping
  • Map heartbeat: how often does the wallet map the network


Command-line interface

Mojo offer a command-line interface (CLI) with features similar to the GUI. The complete list of CLI operations can be seen with the command java -jar [Mojo jar file] -h The CLI interface offers much more flexibility than the GUI and should be used carefully.


Implementation

The Mojo wallet has been developed following the principle of abstraction making it highly flexible and easier to be reviewed. The code is split in several MAVEN modules:

  • mojo-core: the core engine of the wallet responsible for all access to the wallet file
  • mojo-gui-swing: a GUI implementation using JAVA Swing
  • mojo-gui-jfx: a proof of concept GUI implementation using JAVA FX
  • mojo-cli: a CLI implementation
  • mojo-api: a set of interfaces allowing low coupling between the core and the GUI
  • mojo-app: the final Mojo application