# Tari Wallet FFI
Foreign Function interface for the Tari Android and Tari iOS Wallets.
This crate is part of the [Tari Cryptocurrency](https://tari.com) project.
# Build setup (Mac)
## Homebrew
Install Brew
```Shell Script
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
Run the following to install the needed bottles
```Shell Script
brew install pkgconfig
brew install git
brew install make
brew install cmake
brew install autoconf
brew install automake
brew install libtool
```
## iOS Dependencies
Install [XCode](https://apps.apple.com/za/app/xcode/id497799835?mt=12) and then the XCode Command Line Tools with the following command
```Shell Script
xcode-select --install
```
For macOS Mojave additional headers need to be installed, run
```Shell Script
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
```
and follow the prompts.
For Catalina, if you get compilation errors such as these:
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: unable to lookup item 'Path' in SDK 'iphoneos'
Switch the XCode app defaults with:
sudo xcode-select --switch /Applications/Xcode.app
**Note:** If this command fails, XCode was not found and needs to be installed/re-installed.
## Android Dependencies
Install [Android Studio](https://developer.android.com/studio) and then use the SDK Manager to install the Android NDK
along with the SDK of your choice (Android Q is recommended). Not all of these tools are required, but will come in
handy during Rust / Android development:
* LLDB
* NDK (Side by side)
* Android SDK Command-line Tools (latest)
* Android SDK Platform Tools
* Android SDK Tools
* CMake
When setting up an AVD (Android Virtual Device) please note that a 64-bit image (x86_64) needs to be used and not a
32-bit image (x86). This is to run the application on the simulator with these libraries.
Alternatively, download the [Android NDK Bundle](https://developer.android.com/ndk/downloads) directly.
## Enable Hidden Files
Run the following to show hidden files and folders
```Shell Script
defaults write com.apple.finder AppleShowAllFiles -bool YES
killall Finder
```
## The Code
Clone the following git repositories
1. [Tari](https://github.com/tari-project/tari.git)
2. [Wallet-Android](https://github.com/tari-project/wallet-android.git)
3. [Wallet-iOS](https://github.com/tari-project/wallet-ios.git)
Afterwards ```cd``` into the Tari repository and run the following
```Shell Script
git submodule init
git config submodule.recurse true
git submodule update --recursive --remote
```
## Rust
Install [Rust](https://www.rust-lang.org/tools/install)
Install the following tools and system images
```Shell Script
rustup toolchain add nightly-2020-01-08
rustup default nightly-2020-01-08
rustup component add rustfmt --toolchain nightly
rustup component add clippy
rustup target add x86_64-apple-ios aarch64-apple-ios # iPhone and emulator cross compiling
rustup target add x86_64-linux-android aarch64-linux-android armv7-linux-androideabi # Android device cross compiling
```
## Build Configuration
To configure the build, ```cd``` to the Tari repository and then
```Shell Script
cd base_layer/wallet_ffi
open build.sample.config
```
Which will present you with the file contents as follows
```text
BUILD_ANDROID=1
BUILD_IOS=1
CARGO_CLEAN=1
SQLITE_SOURCE=https://www.sqlite.org/snapshot/sqlite-snapshot-201911192122.tar.gz
NDK_PATH=$HOME/android-ndk-r20
PKG_PATH=
ANDROID_WALLET_PATH=$HOME/wallet-android
IOS_WALLET_PATH=$HOME/wallet-ios
TARI_REPO_PATH=$HOME/tari-main
```
The following changes need to be made to the file
1. ```NDK_PATH``` needs to be changed to the directory of the Android NDK Bundle.
1. ```ANDROID_WALLET``` needs to be changed to the path of the Android-Wallet repository
1. ```IOS_WALLET_PATH``` needs to be changed to the path of the Wallet-iOS repository
1. ```CARGO_CLEAN``` if set to 1, the cargo clean command will be run before the build
1. ```TARI_REPO_PATH``` needs to be changed to the path of the Tari repository (Optional - defaults to current repo)
1. ```BUILD_ANDROID``` can be set to ```0``` to disable Android library build
1. ```BUILD_IOS``` can be set to ```0``` to disable iOS library build
Save the file and rename it to ```build.config```
## Building the Libraries
To build the libraries, ```cd``` to the Tari repository and then
```Shell Script
cd base_layer/wallet_ffi
sh mobile_build.sh
```
The relevant libraries will then be built and placed in the appropriate directories of the Wallet-iOS and Wallet-Android repositories.
# Setup (Windows)
## Test
1. Download SQL Lite (https://www.sqlite.org/index.html - 64bit) and unzip
2. `sqlite3.dll` must be accessible via the session path
## Build
ToDo - Android only