Wownero (#1485)
* fix: scanning issues * fix: sync, storing silent unspents * chore: deps * fix: label issues, clear spent utxo * chore: deps * fix: build * fix: missing types * feat: new electrs API & changes, fixes for last block scanning * feat: Scan Silent Payments homepage toggle * chore: build configure * feat: generic fixes, testnet UI improvements, useSSL on bitcoin nodes * fix: invalid Object in sendData * feat: improve addresses page & address book displays * feat: silent payments labeled addresses disclaimer * fix: missing i18n * chore: print * feat: single block scan, rescan by date working for btc mainnet * feat: new cake features page replace market page, move sp scan toggle, auto switch node pop up alert * feat: delete silent addresses * fix: red dot in non ssl nodes * fix: inconsistent connection states, fix tx history * fix: tx & balance displays, cpfp sending * feat: new rust lib * chore: node path * fix: check node based on network * fix: missing txcount from addresses * style: padding in feature page cards * fix: restore not getting all wallet addresses by type * fix: auto switch node broken * fix: silent payment txs not being restored * feat: change scanning to subscription model, sync improvements * fix: scan re-subscription * fix: default nodes * fix: improve scanning by date, fix single block scan * refactor: common function for input tx selection * various fixes for build issues * initial monero.dart implementation * ... * multiple wallets new lib minor fixes * other fixes from monero.dart and monero_c * fix: nodes & build * update build scripts fix polyseed * remove unnecessary code * Add windows app, build scripts and build guide for it. * Minor fix in generated monero configs * fix: send all with multiple outs * add missing monero_c command * add android build script * Merge and fix main * undo android ndk removal * Fix modified exception_handler.dart * Temporarily remove haven * fix build issues * fix pr script * Fixes for build monero.dart (monero_c) for windows. * monero build script * wip: ios build script * refactor: unchanged file * Added build guides for iOS and macOS. Replaced nproc call on macOS. Added macOS configuration for configure_cake_wallet.sh script. * Update monero.dart and monero_c versions. * Add missed windows build scripts * Update the application configuration for windows build script. * Update cw_monero pubspec lock file for monero.dart * Update pr_test_build.yml * chore: upgrade * chore: merge changes * refactor: unchanged files [skip ci] * Fix conflicts with main * fix for multiple wallets * Add tron to windows application configuration. * Add macOS option for description message in configure_cake_wallet.sh * Include missed monero dll for windows. * fix conflicts with main * Disable haven configuration for iOS as default. Add ability to configure cakewallet for iOS with for configuration script. Remove cw_shared configuration for cw_monero. * fix: scan fixes, add date, allow sending while scanning * add missing nano secrets file [skip ci] * ios library * don't pull prebuilds android * Add auto generation of manifest file for android project even for iOS, macOS, Windows. * feat: sync fixes, sp settings * feat: fix resyncing * store crash fix * make init async so it won't lag disable print starts * fix monero_c build issues * libstdc++ * Fix MacOS saving wallet file issue Fix Secure Storage issue (somehow) * update pubspec.lock * fix build script * Use dylib as iOS framework. Use custom path for loading of iOS framework for monero.dart. Add script for generate iOS framework for monero wallet. * fix: date from height logic, status disconnected & chain tip get * fix: params * feat: electrum migration if using cake electrum * fix nodes update versions * re-enable tron * update sp_scanner to work on iOS [skip ci] * bump monero_c hash * bump monero_c commit * bump moneroc version * bump monero_c commit * Add ability to build monero wallet lib as universal lib. Update macOS build guide. Change default arch for macOS project to . * fix: wrong socket for old electrum nodes * Fix unchecked wallet type call * get App Dir correctly in default_settings_migration.dart * handle previous issue with fetching linux documents directory [skip ci] * backup fix * fix NTFS issues * Close the wallet when the wallet gets changed * fix: double balance * feat: node domain * fix: menu name * bump monero_c commit * fix: update tip on set scanning * fix: connection switching back and forth * feat: check if node is electrs, and supports sp * chore: fix build * minor enhancements * fixes and enhancements * solve conflicts with main * Only stop wallet on rename and delete * fix: status toggle * minor enhancement * Monero.com fixes * bump monero_c commit * update sp_scanner to include windows and linux * Update macOS build guide. Change brew dependencies for build unbound locally. * fix conflicts and update macos build guide * remove build cache when on gh actions * update secure storage * free up even more storage * free up more storage * Add initial wownero * fix conflicts * fix workflow issue * build wownero * ios and windows changes * macos * complete wownero flow (app side) * add keychain group entitlement and update script for RunnerBase on macos * update secure_storage version to 8.1.0 in configure.dart * add wownero framework * update ios builds * proper path for wownero and monero * finalizing wownero * finalizing wownero * free up even more storage * revert commenting of build gradle configs * revert commenting of secrets [skip ci] * free more storage * minor fixes * link android wownero libraries * bump monero_c commit * wownero fixes * rename target * build_single.sh using clean env * bump monero_c commit * minor fix * Add wownero polyseed * fix conflicts with main * fix: wallet seed display fix: wownero not refreshing * fix: wallet seed display fix: wownero not refreshing * bump monero_c commit * minor fixes * fix: incorrectly displaying XMR instead of WOW * fix: incorrect restore height in wownero * bump monero_c commit * Add Inno Setup Script for windows exe installer * drop libc++_shared.so * fixes from comments * Fix CMake for windows * Merge latest monero dart changes [skip ci] * bump monero_c commit * add wownero to build scripts for macos [skip ci] * add 14 word seed support to wownero * UI fixes for wownero seed restore * minor fixes * reformat code to pass lints * wownero: fixes haven: removal popup * minor iOS fix [skip ci] * fix: wownero confirmation count (it is spendable after 3 confirms) fix: transaction history not displaying in WOW and XMR when tx has 0 confirms, This is more of a workaround, because I have no idea why would the cpp code not return pending transaction. * Update preferences_key.dart [skip ci] * minor fixes --------- Co-authored-by: Rafael Saes <git@rafael.saes.dev> Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net> Co-authored-by: M <m@cakewallet.com> Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com> Co-authored-by: Matthew Fosse <matt@fosse.co>
1
.github/workflows/cache_dependencies.yml
vendored
|
@ -46,6 +46,7 @@ jobs:
|
||||||
/opt/android/cake_wallet/cw_monero/android/.cxx
|
/opt/android/cake_wallet/cw_monero/android/.cxx
|
||||||
/opt/android/cake_wallet/cw_monero/ios/External
|
/opt/android/cake_wallet/cw_monero/ios/External
|
||||||
/opt/android/cake_wallet/cw_shared_external/ios/External
|
/opt/android/cake_wallet/cw_shared_external/ios/External
|
||||||
|
/opt/android/cake_wallet/scripts/monero_c/release
|
||||||
key: ${{ hashFiles('**/build_monero.sh', '**/build_haven.sh', '**/monero_api.cpp') }}
|
key: ${{ hashFiles('**/build_monero.sh', '**/build_haven.sh', '**/monero_api.cpp') }}
|
||||||
|
|
||||||
- if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
- if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
||||||
|
|
24
.github/workflows/pr_test_build.yml
vendored
|
@ -27,18 +27,25 @@ jobs:
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
run: echo "BRANCH_NAME=${{ github.event.inputs.branch }}" >> $GITHUB_ENV
|
run: echo "BRANCH_NAME=${{ github.event.inputs.branch }}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Free Up GitHub Actions Ubuntu Runner Disk Space
|
- name: Free Disk Space (Ubuntu)
|
||||||
run: |
|
uses: insightsengineering/disk-space-reclaimer@v1
|
||||||
sudo rm -rf /usr/share/dotnet
|
with:
|
||||||
sudo rm -rf /opt/ghc
|
tools-cache: true
|
||||||
sudo rm -rf "/usr/local/share/boost"
|
android: false
|
||||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
dotnet: true
|
||||||
|
haskell: true
|
||||||
|
large-packages: true
|
||||||
|
swap-storage: true
|
||||||
|
docker-images: true
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-java@v1
|
- uses: actions/setup-java@v1
|
||||||
with:
|
with:
|
||||||
java-version: "11.x"
|
java-version: "11.x"
|
||||||
|
- name: Configure placeholder git details
|
||||||
|
run: |
|
||||||
|
git config --global user.email "CI@cakewallet.com"
|
||||||
|
git config --global user.name "Cake Github Actions"
|
||||||
- name: Flutter action
|
- name: Flutter action
|
||||||
uses: subosito/flutter-action@v1
|
uses: subosito/flutter-action@v1
|
||||||
with:
|
with:
|
||||||
|
@ -72,7 +79,8 @@ jobs:
|
||||||
/opt/android/cake_wallet/cw_monero/android/.cxx
|
/opt/android/cake_wallet/cw_monero/android/.cxx
|
||||||
/opt/android/cake_wallet/cw_monero/ios/External
|
/opt/android/cake_wallet/cw_monero/ios/External
|
||||||
/opt/android/cake_wallet/cw_shared_external/ios/External
|
/opt/android/cake_wallet/cw_shared_external/ios/External
|
||||||
key: ${{ hashFiles('**/build_monero.sh', '**/build_haven.sh', '**/monero_api.cpp') }}
|
/opt/android/cake_wallet/scripts/monero_c/release
|
||||||
|
key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh', '**/build_haven.sh', '**/monero_api.cpp') }}
|
||||||
|
|
||||||
- if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
- if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
||||||
name: Generate Externals
|
name: Generate Externals
|
||||||
|
|
8
.gitignore
vendored
|
@ -136,6 +136,7 @@ lib/nano/nano.dart
|
||||||
lib/polygon/polygon.dart
|
lib/polygon/polygon.dart
|
||||||
lib/solana/solana.dart
|
lib/solana/solana.dart
|
||||||
lib/tron/tron.dart
|
lib/tron/tron.dart
|
||||||
|
lib/wownero/wownero.dart
|
||||||
|
|
||||||
ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_180.png
|
ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_180.png
|
||||||
ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_120.png
|
ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_120.png
|
||||||
|
@ -156,6 +157,7 @@ assets/images/app_logo.png
|
||||||
macos/Runner/Info.plist
|
macos/Runner/Info.plist
|
||||||
macos/Runner/DebugProfile.entitlements
|
macos/Runner/DebugProfile.entitlements
|
||||||
macos/Runner/Release.entitlements
|
macos/Runner/Release.entitlements
|
||||||
|
macos/Runner/Runner.entitlements
|
||||||
lib/core/secure_storage.dart
|
lib/core/secure_storage.dart
|
||||||
|
|
||||||
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
|
||||||
|
@ -166,3 +168,9 @@ macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
|
||||||
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
|
||||||
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
|
||||||
macos/Runner/Configs/AppInfo.xcconfig
|
macos/Runner/Configs/AppInfo.xcconfig
|
||||||
|
|
||||||
|
# Monero.dart (Monero_C)
|
||||||
|
scripts/monero_c
|
||||||
|
# iOS generated framework bin
|
||||||
|
ios/MoneroWallet.framework/MoneroWallet
|
||||||
|
ios/WowneroWallet.framework/WowneroWallet
|
||||||
|
|
16
.metadata
|
@ -1,11 +1,11 @@
|
||||||
# This file tracks properties of this Flutter project.
|
# This file tracks properties of this Flutter project.
|
||||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
#
|
#
|
||||||
# This file should be version controlled.
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
version:
|
version:
|
||||||
revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
|
revision: "367f9ea16bfae1ca451b9cc27c1366870b187ae2"
|
||||||
channel: stable
|
channel: "stable"
|
||||||
|
|
||||||
project_type: app
|
project_type: app
|
||||||
|
|
||||||
|
@ -13,11 +13,11 @@ project_type: app
|
||||||
migration:
|
migration:
|
||||||
platforms:
|
platforms:
|
||||||
- platform: root
|
- platform: root
|
||||||
create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
|
create_revision: 367f9ea16bfae1ca451b9cc27c1366870b187ae2
|
||||||
base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
|
base_revision: 367f9ea16bfae1ca451b9cc27c1366870b187ae2
|
||||||
- platform: macos
|
- platform: windows
|
||||||
create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
|
create_revision: 367f9ea16bfae1ca451b9cc27c1366870b187ae2
|
||||||
base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
|
base_revision: 367f9ea16bfae1ca451b9cc27c1366870b187ae2
|
||||||
|
|
||||||
# User provided section
|
# User provided section
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,8 @@
|
||||||
android:fullBackupContent="false"
|
android:fullBackupContent="false"
|
||||||
android:versionCode="__versionCode__"
|
android:versionCode="__versionCode__"
|
||||||
android:versionName="__versionName__"
|
android:versionName="__versionName__"
|
||||||
android:requestLegacyExternalStorage="true">
|
android:requestLegacyExternalStorage="true"
|
||||||
|
android:extractNativeLibs="true">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:launchMode="singleInstance"
|
android:launchMode="singleInstance"
|
||||||
|
@ -90,6 +91,9 @@
|
||||||
<data android:scheme="tron" />
|
<data android:scheme="tron" />
|
||||||
<data android:scheme="tron-wallet" />
|
<data android:scheme="tron-wallet" />
|
||||||
<data android:scheme="tron_wallet" />
|
<data android:scheme="tron_wallet" />
|
||||||
|
<data android:scheme="wownero" />
|
||||||
|
<data android:scheme="wownero-wallet" />
|
||||||
|
<data android:scheme="wownero_wallet" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<!-- nano-gpt link scheme -->
|
<!-- nano-gpt link scheme -->
|
||||||
<intent-filter android:autoVerify="true">
|
<intent-filter android:autoVerify="true">
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../scripts/monero_c/release/monero/aarch64-linux-android_libwallet2_api_c.so
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../scripts/monero_c/release/wownero/aarch64-linux-android_libwallet2_api_c.so
|
0
android/app/src/main/jniLibs/armeabi-v7a/.gitkeep
Normal file
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../scripts/monero_c/release/monero/armv7a-linux-androideabi_libwallet2_api_c.so
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../scripts/monero_c/release/wownero/armv7a-linux-androideabi_libwallet2_api_c.so
|
0
android/app/src/main/jniLibs/x86/.gitkeep
Normal file
0
android/app/src/main/jniLibs/x86_64/.gitkeep
Normal file
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../scripts/monero_c/release/monero/x86_64-linux-android_libwallet2_api_c.so
|
|
@ -0,0 +1 @@
|
||||||
|
../../../../../../scripts/monero_c/release/wownero/x86_64-linux-android_libwallet2_api_c.so
|
|
@ -1,2 +1,8 @@
|
||||||
-
|
-
|
||||||
uri: electrum.cakewallet.com:50002
|
uri: electrum.cakewallet.com:50002
|
||||||
|
useSSL: true
|
||||||
|
-
|
||||||
|
uri: btc-electrum.cakewallet.com:50002
|
||||||
|
isDefault: true
|
||||||
|
-
|
||||||
|
uri: electrs.cakewallet.com:50001
|
||||||
|
|
BIN
assets/images/wownero_icon.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
assets/images/wownero_menu.png
Normal file
After Width: | Height: | Size: 49 KiB |
|
@ -1,2 +1,2 @@
|
||||||
In-app Cake Pay is Back
|
Monero enhancements
|
||||||
Bug fixes and generic enhancements
|
Bug fixes
|
|
@ -1,3 +1,2 @@
|
||||||
In-app Cake Pay is Back
|
Monero enhancements
|
||||||
Bitcoin nodes stability enhancements
|
Bug fixes
|
||||||
Bug fixes and generic enhancements
|
|
12
assets/wownero_node_list.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
-
|
||||||
|
uri: node3.monerodevs.org:34568
|
||||||
|
is_default: true
|
||||||
|
useSSL: false
|
||||||
|
-
|
||||||
|
uri: node2.monerodevs.org:34568
|
||||||
|
is_default: false
|
||||||
|
useSSL: false
|
||||||
|
-
|
||||||
|
uri: node.monerodevs.org:34568
|
||||||
|
is_default: false
|
||||||
|
useSSL: false
|
38
build-guide-win.md
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
# Building CakeWallet for Windows
|
||||||
|
|
||||||
|
## Requirements and Setup
|
||||||
|
|
||||||
|
The following are the system requirements to build CakeWallet for your Windows PC.
|
||||||
|
|
||||||
|
```
|
||||||
|
Windows 10 or later (64-bit), x86-64 based
|
||||||
|
Flutter 3 or above
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building CakeWallet on Windows
|
||||||
|
|
||||||
|
These steps will help you configure and execute a build of CakeWallet from its source code.
|
||||||
|
|
||||||
|
### 1. Installing Package Dependencies
|
||||||
|
|
||||||
|
For build CakeWallet windows application from sources you will be needed to have:
|
||||||
|
> [Install Flutter]Follow installation guide (https://docs.flutter.dev/get-started/install/windows) and install do not miss to dev tools (install https://docs.flutter.dev/get-started/install/windows/desktop#development-tools) which are required for windows desktop development (need to install Git for Windows and Visual Studio 2022). Then install `Desktop development with C++` packages via GUI Visual Studio 2022, or Visual Studio Build Tools 2022 including: `C++ Build Tools core features`, `C++ 2022 Redistributable Update`, `C++ core desktop features`, `MVC v143 - VS 2022 C++ x64/x86 build tools`, `C++ CMake tools for Windwos`, `Testing tools core features - Build Tools`, `C++ AddressSanitizer`.
|
||||||
|
> [Install WSL] for building monero dependencies need to install Windows WSL (https://learn.microsoft.com/en-us/windows/wsl/install) and required packages for WSL (Ubuntu):
|
||||||
|
`$ sudo apt update `
|
||||||
|
`$ sudo apt build-essential cmake gcc-mingw-w64 g++-mingw-w64 autoconf libtool pkg-config`
|
||||||
|
|
||||||
|
### 2. Pull CakeWallet source code
|
||||||
|
|
||||||
|
You can downlaod CakeWallet source code from our [GitHub repository](github.com/cake-tech/cake_wallet) via git by following next command:
|
||||||
|
`$ git clone https://github.com/cake-tech/cake_wallet.git --branch MrCyjaneK-cyjan-monerodart`
|
||||||
|
OR you can download it as [Zip archive](https://github.com/cake-tech/cake_wallet/archive/refs/heads/MrCyjaneK-cyjan-monerodart.zip)
|
||||||
|
|
||||||
|
### 3. Build Monero, Monero_c and their dependencies
|
||||||
|
|
||||||
|
For use monero in the application need to build Monero wrapper - Monero_C which will be used by monero.dart package. For that need to run shell (bash - typically same named utility should be available after WSL is enabled in your system) with previously installed WSL, then change current directory to the application project directory with your used shell and then change current directory to `scripts/windows`: `$ cd scripts/windows`. Run build script: `$ ./build_all.sh`.
|
||||||
|
|
||||||
|
### 4. Configure and build CakeWallet application
|
||||||
|
|
||||||
|
To configure the application open directory where you have downloaded or unarchived CakeWallet sources and run `cakewallet.bat`.
|
||||||
|
Or if you used WSL and have active shell session you can run `$ ./cakewallet.sh` script in `scripts/windows` which will run `cakewallet.bat` in WSL.
|
||||||
|
After execution of `cakewallet.bat` you should to get `Cake Wallet.zip` in project root directory which will contains `CakeWallet.exe` file and another needed files for run the application. Now you can extract files from `Cake Wallet.zip` archive and run the application.
|
51
cakewallet.bat
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
@echo off
|
||||||
|
set cw_win_app_config=--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron
|
||||||
|
set cw_root=%cd%
|
||||||
|
set cw_archive_name=Cake Wallet.zip
|
||||||
|
set cw_archive_path=%cw_root%\%cw_archive_name%
|
||||||
|
set secrets_file_path=lib\.secrets.g.dart
|
||||||
|
set release_dir=build\windows\x64\runner\Release
|
||||||
|
@REM Path could be different
|
||||||
|
if [%~1]==[] (set tools_root=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.38.33135\x64\Microsoft.VC143.CRT) else (set tools_root=%1)
|
||||||
|
@REM Generate android manifest file
|
||||||
|
cd scripts
|
||||||
|
bash.exe gen_android_manifest.sh
|
||||||
|
cd /d %cw_root%
|
||||||
|
echo === Generating pubspec.yaml ===
|
||||||
|
copy /Y pubspec_description.yaml pubspec.yaml > nul
|
||||||
|
call flutter pub get > nul
|
||||||
|
call dart run tool\generate_pubspec.dart
|
||||||
|
call flutter pub get > nul
|
||||||
|
call dart run tool\configure.dart %cw_win_app_config%
|
||||||
|
|
||||||
|
IF NOT EXIST "%secrets_file_path%" (
|
||||||
|
echo === Generating new secrets file ===
|
||||||
|
call dart run tool\generate_new_secrets.dart
|
||||||
|
) ELSE (echo === Using previously/already generated secrets file: %secrets_file_path% ===)
|
||||||
|
|
||||||
|
echo === Generating mobx models ===
|
||||||
|
for /d %%i in (cw_core cw_monero cw_bitcoin cw_ethereum cw_evm cw_polygon cw_nano cw_bitcoin_cash cw_solana cw_tron .) do (
|
||||||
|
cd %%i
|
||||||
|
call flutter pub get > nul
|
||||||
|
call dart run build_runner build --delete-conflicting-outputs > nul
|
||||||
|
cd /d %cw_root%
|
||||||
|
)
|
||||||
|
|
||||||
|
echo === Generating localization files ===
|
||||||
|
call dart run tool\generate_localization.dart
|
||||||
|
|
||||||
|
echo === Building the application executable file ===
|
||||||
|
call flutter build windows --dart-define-from-file=env.json --release
|
||||||
|
|
||||||
|
echo === Prepare distribution actions. Copy needed files to the application bundle ===
|
||||||
|
copy /Y "%tools_root%\msvcp140.dll" "%release_dir%\" > nul
|
||||||
|
copy /Y "%tools_root%\vcruntime140.dll" "%release_dir%\" > nul
|
||||||
|
copy /Y "%tools_root%\vcruntime140_1.dll" "%release_dir%\" > nul
|
||||||
|
|
||||||
|
echo === Generate the application archive ===
|
||||||
|
xcopy /s /e /v /Y "%release_dir%\*.*" "build\Cake Wallet\" > nul
|
||||||
|
tar acf "%cw_archive_name%" -C build\ "Cake Wallet"
|
||||||
|
|
||||||
|
echo === Open Explorer with the application archive ===
|
||||||
|
echo Cake Wallet created archive at: %cw_archive_path%
|
||||||
|
%SystemRoot%\explorer.exe /select, %cw_archive_path%
|
|
@ -1,11 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
IOS="ios"
|
IOS="ios"
|
||||||
ANDROID="android"
|
ANDROID="android"
|
||||||
|
MACOS="macos"
|
||||||
|
|
||||||
PLATFORMS=($IOS $ANDROID)
|
PLATFORMS=($IOS $ANDROID $MACOS)
|
||||||
PLATFORM=$1
|
PLATFORM=$1
|
||||||
|
|
||||||
if ! [[ " ${PLATFORMS[*]} " =~ " ${PLATFORM} " ]]; then
|
if ! [[ " ${PLATFORMS[*]} " =~ " ${PLATFORM} " ]]; then
|
||||||
echo "specify platform: ./configure_cake_wallet.sh ios|android"
|
echo "specify platform: ./configure_cake_wallet.sh ios|android|macos"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -14,6 +17,11 @@ if [ "$PLATFORM" == "$IOS" ]; then
|
||||||
cd scripts/ios
|
cd scripts/ios
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$PLATFORM" == "$MACOS" ]; then
|
||||||
|
echo "Configuring for macOS"
|
||||||
|
cd scripts/macos
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$PLATFORM" == "$ANDROID" ]; then
|
if [ "$PLATFORM" == "$ANDROID" ]; then
|
||||||
echo "Configuring for Android"
|
echo "Configuring for Android"
|
||||||
cd scripts/android
|
cd scripts/android
|
||||||
|
@ -22,5 +30,6 @@ fi
|
||||||
source ./app_env.sh cakewallet
|
source ./app_env.sh cakewallet
|
||||||
./app_config.sh
|
./app_config.sh
|
||||||
cd ../.. && flutter pub get
|
cd ../.. && flutter pub get
|
||||||
flutter packages pub run tool/generate_localization.dart
|
#flutter packages pub run tool/generate_localization.dart
|
||||||
./model_generator.sh
|
./model_generator.sh
|
||||||
|
#cd macos && pod install
|
|
@ -4,10 +4,8 @@ import 'package:cw_core/crypto_currency.dart';
|
||||||
class AmountConverter {
|
class AmountConverter {
|
||||||
static const _moneroAmountLength = 12;
|
static const _moneroAmountLength = 12;
|
||||||
static const _moneroAmountDivider = 1000000000000;
|
static const _moneroAmountDivider = 1000000000000;
|
||||||
static const _litecoinAmountDivider = 100000000;
|
static const _wowneroAmountLength = 11;
|
||||||
static const _ethereumAmountDivider = 1000000000000000000;
|
static const _wowneroAmountDivider = 100000000000;
|
||||||
static const _dashAmountDivider = 100000000;
|
|
||||||
static const _bitcoinCashAmountDivider = 100000000;
|
|
||||||
static const _bitcoinAmountDivider = 100000000;
|
static const _bitcoinAmountDivider = 100000000;
|
||||||
static const _bitcoinAmountLength = 8;
|
static const _bitcoinAmountLength = 8;
|
||||||
static final _bitcoinAmountFormat = NumberFormat()
|
static final _bitcoinAmountFormat = NumberFormat()
|
||||||
|
@ -16,69 +14,16 @@ class AmountConverter {
|
||||||
static final _moneroAmountFormat = NumberFormat()
|
static final _moneroAmountFormat = NumberFormat()
|
||||||
..maximumFractionDigits = _moneroAmountLength
|
..maximumFractionDigits = _moneroAmountLength
|
||||||
..minimumFractionDigits = 1;
|
..minimumFractionDigits = 1;
|
||||||
|
static final _wowneroAmountFormat = NumberFormat()
|
||||||
static double amountIntToDouble(CryptoCurrency cryptoCurrency, int amount) {
|
..maximumFractionDigits = _wowneroAmountLength
|
||||||
switch (cryptoCurrency) {
|
..minimumFractionDigits = 1;
|
||||||
case CryptoCurrency.xmr:
|
|
||||||
return _moneroAmountToDouble(amount);
|
|
||||||
case CryptoCurrency.btc:
|
|
||||||
return _bitcoinAmountToDouble(amount);
|
|
||||||
case CryptoCurrency.bch:
|
|
||||||
return _bitcoinCashAmountToDouble(amount);
|
|
||||||
case CryptoCurrency.dash:
|
|
||||||
return _dashAmountToDouble(amount);
|
|
||||||
case CryptoCurrency.eth:
|
|
||||||
return _ethereumAmountToDouble(amount);
|
|
||||||
case CryptoCurrency.ltc:
|
|
||||||
return _litecoinAmountToDouble(amount);
|
|
||||||
case CryptoCurrency.xhv:
|
|
||||||
case CryptoCurrency.xag:
|
|
||||||
case CryptoCurrency.xau:
|
|
||||||
case CryptoCurrency.xaud:
|
|
||||||
case CryptoCurrency.xbtc:
|
|
||||||
case CryptoCurrency.xcad:
|
|
||||||
case CryptoCurrency.xchf:
|
|
||||||
case CryptoCurrency.xcny:
|
|
||||||
case CryptoCurrency.xeur:
|
|
||||||
case CryptoCurrency.xgbp:
|
|
||||||
case CryptoCurrency.xjpy:
|
|
||||||
case CryptoCurrency.xnok:
|
|
||||||
case CryptoCurrency.xnzd:
|
|
||||||
case CryptoCurrency.xusd:
|
|
||||||
return _moneroAmountToDouble(amount);
|
|
||||||
default:
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int amountStringToInt(CryptoCurrency cryptoCurrency, String amount) {
|
|
||||||
switch (cryptoCurrency) {
|
|
||||||
case CryptoCurrency.xmr:
|
|
||||||
return _moneroParseAmount(amount);
|
|
||||||
case CryptoCurrency.xhv:
|
|
||||||
case CryptoCurrency.xag:
|
|
||||||
case CryptoCurrency.xau:
|
|
||||||
case CryptoCurrency.xaud:
|
|
||||||
case CryptoCurrency.xbtc:
|
|
||||||
case CryptoCurrency.xcad:
|
|
||||||
case CryptoCurrency.xchf:
|
|
||||||
case CryptoCurrency.xcny:
|
|
||||||
case CryptoCurrency.xeur:
|
|
||||||
case CryptoCurrency.xgbp:
|
|
||||||
case CryptoCurrency.xjpy:
|
|
||||||
case CryptoCurrency.xnok:
|
|
||||||
case CryptoCurrency.xnzd:
|
|
||||||
case CryptoCurrency.xusd:
|
|
||||||
return _moneroParseAmount(amount);
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static String amountIntToString(CryptoCurrency cryptoCurrency, int amount) {
|
static String amountIntToString(CryptoCurrency cryptoCurrency, int amount) {
|
||||||
switch (cryptoCurrency) {
|
switch (cryptoCurrency) {
|
||||||
case CryptoCurrency.xmr:
|
case CryptoCurrency.xmr:
|
||||||
return _moneroAmountToString(amount);
|
return _moneroAmountToString(amount);
|
||||||
|
case CryptoCurrency.wow:
|
||||||
|
return _wowneroAmountToString(amount);
|
||||||
case CryptoCurrency.btc:
|
case CryptoCurrency.btc:
|
||||||
case CryptoCurrency.bch:
|
case CryptoCurrency.bch:
|
||||||
case CryptoCurrency.ltc:
|
case CryptoCurrency.ltc:
|
||||||
|
@ -106,34 +51,12 @@ class AmountConverter {
|
||||||
static double cryptoAmountToDouble({required num amount, required num divider}) =>
|
static double cryptoAmountToDouble({required num amount, required num divider}) =>
|
||||||
amount / divider;
|
amount / divider;
|
||||||
|
|
||||||
static String _moneroAmountToString(int amount) => _moneroAmountFormat.format(
|
static String _moneroAmountToString(int amount) => _moneroAmountFormat
|
||||||
cryptoAmountToDouble(amount: amount, divider: _moneroAmountDivider));
|
.format(cryptoAmountToDouble(amount: amount, divider: _moneroAmountDivider));
|
||||||
|
|
||||||
static double _moneroAmountToDouble(int amount) =>
|
static String _bitcoinAmountToString(int amount) => _bitcoinAmountFormat
|
||||||
cryptoAmountToDouble(amount: amount, divider: _moneroAmountDivider);
|
.format(cryptoAmountToDouble(amount: amount, divider: _bitcoinAmountDivider));
|
||||||
|
|
||||||
static int _moneroParseAmount(String amount) =>
|
static String _wowneroAmountToString(int amount) => _wowneroAmountFormat
|
||||||
_moneroAmountFormat.parse(amount).toInt();
|
.format(cryptoAmountToDouble(amount: amount, divider: _wowneroAmountDivider));
|
||||||
|
|
||||||
static String _bitcoinAmountToString(int amount) =>
|
|
||||||
_bitcoinAmountFormat.format(
|
|
||||||
cryptoAmountToDouble(amount: amount, divider: _bitcoinAmountDivider));
|
|
||||||
|
|
||||||
static double _bitcoinAmountToDouble(int amount) =>
|
|
||||||
cryptoAmountToDouble(amount: amount, divider: _bitcoinAmountDivider);
|
|
||||||
|
|
||||||
static int _doubleToBitcoinAmount(double amount) =>
|
|
||||||
(amount * _bitcoinAmountDivider).toInt();
|
|
||||||
|
|
||||||
static double _bitcoinCashAmountToDouble(int amount) =>
|
|
||||||
cryptoAmountToDouble(amount: amount, divider: _bitcoinCashAmountDivider);
|
|
||||||
|
|
||||||
static double _dashAmountToDouble(int amount) =>
|
|
||||||
cryptoAmountToDouble(amount: amount, divider: _dashAmountDivider);
|
|
||||||
|
|
||||||
static double _ethereumAmountToDouble(num amount) =>
|
|
||||||
cryptoAmountToDouble(amount: amount, divider: _ethereumAmountDivider);
|
|
||||||
|
|
||||||
static double _litecoinAmountToDouble(int amount) =>
|
|
||||||
cryptoAmountToDouble(amount: amount, divider: _litecoinAmountDivider);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
|
||||||
CryptoCurrency.usdtSol,
|
CryptoCurrency.usdtSol,
|
||||||
CryptoCurrency.usdcTrc20,
|
CryptoCurrency.usdcTrc20,
|
||||||
CryptoCurrency.tbtc,
|
CryptoCurrency.tbtc,
|
||||||
|
CryptoCurrency.wow,
|
||||||
];
|
];
|
||||||
|
|
||||||
static const havenCurrencies = [
|
static const havenCurrencies = [
|
||||||
|
@ -221,6 +222,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
|
||||||
static const usdtSol = CryptoCurrency(title: 'USDT', tag: 'SOL', fullName: 'USDT Tether', raw: 91, name: 'usdtsol', iconPath: 'assets/images/usdt_icon.png', decimals: 6);
|
static const usdtSol = CryptoCurrency(title: 'USDT', tag: 'SOL', fullName: 'USDT Tether', raw: 91, name: 'usdtsol', iconPath: 'assets/images/usdt_icon.png', decimals: 6);
|
||||||
static const usdcTrc20 = CryptoCurrency(title: 'USDC', tag: 'TRX', fullName: 'USDC Coin', raw: 92, name: 'usdctrc20', iconPath: 'assets/images/usdc_icon.png', decimals: 6);
|
static const usdcTrc20 = CryptoCurrency(title: 'USDC', tag: 'TRX', fullName: 'USDC Coin', raw: 92, name: 'usdctrc20', iconPath: 'assets/images/usdc_icon.png', decimals: 6);
|
||||||
static const tbtc = CryptoCurrency(title: 'tBTC', fullName: 'Testnet Bitcoin', raw: 93, name: 'tbtc', iconPath: 'assets/images/tbtc.png', decimals: 8);
|
static const tbtc = CryptoCurrency(title: 'tBTC', fullName: 'Testnet Bitcoin', raw: 93, name: 'tbtc', iconPath: 'assets/images/tbtc.png', decimals: 8);
|
||||||
|
static const wow = CryptoCurrency(title: 'WOW', fullName: 'Wownero', raw: 94, name: 'wow', iconPath: 'assets/images/wownero_icon.png', decimals: 11);
|
||||||
|
|
||||||
|
|
||||||
static final Map<int, CryptoCurrency> _rawCurrencyMap =
|
static final Map<int, CryptoCurrency> _rawCurrencyMap =
|
||||||
|
|
|
@ -28,7 +28,9 @@ CryptoCurrency currencyForWalletType(WalletType type, {bool? isTestnet}) {
|
||||||
return CryptoCurrency.sol;
|
return CryptoCurrency.sol;
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return CryptoCurrency.trx;
|
return CryptoCurrency.trx;
|
||||||
default:
|
case WalletType.wownero:
|
||||||
|
return CryptoCurrency.wow;
|
||||||
|
case WalletType.none:
|
||||||
throw Exception(
|
throw Exception(
|
||||||
'Unexpected wallet type: ${type.toString()} for CryptoCurrency currencyForWalletType');
|
'Unexpected wallet type: ${type.toString()} for CryptoCurrency currencyForWalletType');
|
||||||
}
|
}
|
||||||
|
|
|
@ -297,3 +297,81 @@ DateTime getDateByBitcoinHeight(int height) {
|
||||||
|
|
||||||
return estimatedDate;
|
return estimatedDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: enhance all of this global const lists
|
||||||
|
const wowDates = {
|
||||||
|
"2023-12": 583048,
|
||||||
|
"2023-11": 575048,
|
||||||
|
"2023-10": 566048,
|
||||||
|
"2023-09": 558048,
|
||||||
|
"2023-08": 549048,
|
||||||
|
"2023-07": 540048,
|
||||||
|
"2023-06": 532048,
|
||||||
|
"2023-05": 523048,
|
||||||
|
"2023-04": 514048,
|
||||||
|
"2023-03": 505048,
|
||||||
|
"2023-02": 497048,
|
||||||
|
"2023-01": 488048,
|
||||||
|
"2022-12": 479048,
|
||||||
|
"2022-11": 471048,
|
||||||
|
"2022-10": 462048,
|
||||||
|
"2022-09": 453048,
|
||||||
|
"2022-08": 444048,
|
||||||
|
"2022-07": 435048,
|
||||||
|
"2022-06": 427048,
|
||||||
|
"2022-05": 418048,
|
||||||
|
"2022-04": 410048,
|
||||||
|
"2022-03": 401048,
|
||||||
|
"2022-02": 393048,
|
||||||
|
"2022-01": 384048,
|
||||||
|
"2021-12": 375048,
|
||||||
|
"2021-11": 367048,
|
||||||
|
"2021-10": 358048,
|
||||||
|
"2021-09": 349048,
|
||||||
|
"2021-08": 340048,
|
||||||
|
"2021-07": 331048,
|
||||||
|
"2021-06": 322048,
|
||||||
|
"2021-05": 313048,
|
||||||
|
"2021-04": 305048,
|
||||||
|
"2021-03": 295048,
|
||||||
|
"2021-02": 287048,
|
||||||
|
"2021-01": 279148,
|
||||||
|
"2020-10": 252000,
|
||||||
|
"2020-09": 243000,
|
||||||
|
"2020-08": 234000,
|
||||||
|
"2020-07": 225000,
|
||||||
|
"2020-06": 217500,
|
||||||
|
"2020-05": 208500,
|
||||||
|
"2020-04": 199500,
|
||||||
|
"2020-03": 190500,
|
||||||
|
"2020-02": 183000,
|
||||||
|
"2020-01": 174000,
|
||||||
|
"2019-12": 165000,
|
||||||
|
"2019-11": 156000,
|
||||||
|
"2019-10": 147000,
|
||||||
|
"2019-09": 138000,
|
||||||
|
"2019-08": 129000,
|
||||||
|
"2019-07": 120000,
|
||||||
|
"2019-06": 112500,
|
||||||
|
"2019-05": 103500,
|
||||||
|
"2019-04": 94500,
|
||||||
|
"2019-03": 85500,
|
||||||
|
"2019-02": 79500,
|
||||||
|
"2019-01": 73500,
|
||||||
|
"2018-12": 67500,
|
||||||
|
"2018-11": 61500,
|
||||||
|
"2018-10": 52500,
|
||||||
|
"2018-09": 45000,
|
||||||
|
"2018-08": 36000,
|
||||||
|
"2018-07": 27000,
|
||||||
|
"2018-06": 18000,
|
||||||
|
"2018-05": 9000,
|
||||||
|
"2018-04": 1
|
||||||
|
};
|
||||||
|
|
||||||
|
int getWowneroHeightByDate({required DateTime date}) {
|
||||||
|
String closestKey =
|
||||||
|
wowDates.keys.firstWhere((key) => formatMapKey(key).isBefore(date), orElse: () => '');
|
||||||
|
|
||||||
|
return wowDates[closestKey] ?? 0;
|
||||||
|
}
|
|
@ -79,6 +79,7 @@ class Node extends HiveObject with Keyable {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case WalletType.monero:
|
case WalletType.monero:
|
||||||
case WalletType.haven:
|
case WalletType.haven:
|
||||||
|
case WalletType.wownero:
|
||||||
return Uri.http(uriRaw, '');
|
return Uri.http(uriRaw, '');
|
||||||
case WalletType.bitcoin:
|
case WalletType.bitcoin:
|
||||||
case WalletType.litecoin:
|
case WalletType.litecoin:
|
||||||
|
@ -96,7 +97,7 @@ class Node extends HiveObject with Keyable {
|
||||||
case WalletType.solana:
|
case WalletType.solana:
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return Uri.https(uriRaw, path ?? '');
|
return Uri.https(uriRaw, path ?? '');
|
||||||
default:
|
case WalletType.none:
|
||||||
throw Exception('Unexpected type ${type.toString()} for Node uri');
|
throw Exception('Unexpected type ${type.toString()} for Node uri');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,6 +144,7 @@ class Node extends HiveObject with Keyable {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case WalletType.monero:
|
case WalletType.monero:
|
||||||
case WalletType.haven:
|
case WalletType.haven:
|
||||||
|
case WalletType.wownero:
|
||||||
return requestMoneroNode();
|
return requestMoneroNode();
|
||||||
case WalletType.nano:
|
case WalletType.nano:
|
||||||
case WalletType.banano:
|
case WalletType.banano:
|
||||||
|
@ -155,7 +157,7 @@ class Node extends HiveObject with Keyable {
|
||||||
case WalletType.solana:
|
case WalletType.solana:
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return requestElectrumServer();
|
return requestElectrumServer();
|
||||||
default:
|
case WalletType.none:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'package:cw_core/root_dir.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
import 'package:cw_core/wallet_type.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
Future<String> pathForWalletDir({required String name, required WalletType type}) async {
|
Future<String> pathForWalletDir({required String name, required WalletType type}) async {
|
||||||
final root = await getApplicationDocumentsDirectory();
|
final root = await getAppDir();
|
||||||
final prefix = walletTypeToString(type).toLowerCase();
|
final prefix = walletTypeToString(type).toLowerCase();
|
||||||
final walletsDir = Directory('${root.path}/wallets');
|
final walletsDir = Directory('${root.path}/wallets');
|
||||||
final walletDire = Directory('${walletsDir.path}/$prefix/$name');
|
final walletDire = Directory('${walletsDir.path}/$prefix/$name');
|
||||||
|
@ -20,7 +21,7 @@ Future<String> pathForWallet({required String name, required WalletType type}) a
|
||||||
.then((path) => path + '/$name');
|
.then((path) => path + '/$name');
|
||||||
|
|
||||||
Future<String> outdatedAndroidPathForWalletDir({required String name}) async {
|
Future<String> outdatedAndroidPathForWalletDir({required String name}) async {
|
||||||
final directory = await getApplicationDocumentsDirectory();
|
final directory = await getAppDir();
|
||||||
final pathDir = directory.path + '/$name';
|
final pathDir = directory.path + '/$name';
|
||||||
|
|
||||||
return pathDir;
|
return pathDir;
|
||||||
|
|
35
cw_core/lib/root_dir.dart
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import 'dart:io';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
|
String? _rootDirPath;
|
||||||
|
|
||||||
|
void setRootDirFromEnv() => _rootDirPath = Platform.environment['CAKE_WALLET_DIR'];
|
||||||
|
|
||||||
|
Future<Directory> getAppDir({String appName = 'cake_wallet'}) async {
|
||||||
|
Directory dir;
|
||||||
|
|
||||||
|
if (_rootDirPath != null && _rootDirPath!.isNotEmpty) {
|
||||||
|
dir = Directory.fromUri(Uri.file(_rootDirPath!));
|
||||||
|
dir.create(recursive: true);
|
||||||
|
} else {
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
dir = await getApplicationSupportDirectory();
|
||||||
|
} else if (Platform.isLinux) {
|
||||||
|
String appDirPath;
|
||||||
|
|
||||||
|
try {
|
||||||
|
dir = await getApplicationDocumentsDirectory();
|
||||||
|
appDirPath = '${dir.path}/$appName';
|
||||||
|
} catch (e) {
|
||||||
|
appDirPath = '/home/${Platform.environment['USER']}/.$appName';
|
||||||
|
}
|
||||||
|
|
||||||
|
dir = Directory.fromUri(Uri.file(appDirPath));
|
||||||
|
await dir.create(recursive: true);
|
||||||
|
} else {
|
||||||
|
dir = await getApplicationDocumentsDirectory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dir;
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
import 'dart:io';
|
||||||
|
import 'dart:math';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
@ -6,6 +8,12 @@ const utils = const MethodChannel('com.cake_wallet/native_utils');
|
||||||
|
|
||||||
Future<Uint8List> secRandom(int count) async {
|
Future<Uint8List> secRandom(int count) async {
|
||||||
try {
|
try {
|
||||||
|
if (Platform.isWindows || Platform.isLinux) {
|
||||||
|
// Used method to get securely generated random bytes from cake backups
|
||||||
|
const byteSize = 256;
|
||||||
|
final rng = Random.secure();
|
||||||
|
return Uint8List.fromList(List<int>.generate(count, (_) => rng.nextInt(byteSize)));
|
||||||
|
}
|
||||||
return await utils.invokeMethod<Uint8List>('sec_random', {'count': count}) ?? Uint8List.fromList([]);
|
return await utils.invokeMethod<Uint8List>('sec_random', {'count': count}) ?? Uint8List.fromList([]);
|
||||||
} on PlatformException catch (_) {
|
} on PlatformException catch (_) {
|
||||||
return Uint8List.fromList([]);
|
return Uint8List.fromList([]);
|
||||||
|
|
|
@ -54,7 +54,10 @@ enum WalletType {
|
||||||
solana,
|
solana,
|
||||||
|
|
||||||
@HiveField(11)
|
@HiveField(11)
|
||||||
tron
|
tron,
|
||||||
|
|
||||||
|
@HiveField(12)
|
||||||
|
wownero,
|
||||||
}
|
}
|
||||||
|
|
||||||
int serializeToInt(WalletType type) {
|
int serializeToInt(WalletType type) {
|
||||||
|
@ -81,7 +84,9 @@ int serializeToInt(WalletType type) {
|
||||||
return 9;
|
return 9;
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return 10;
|
return 10;
|
||||||
default:
|
case WalletType.wownero:
|
||||||
|
return 11;
|
||||||
|
case WalletType.none:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,6 +115,8 @@ WalletType deserializeFromInt(int raw) {
|
||||||
return WalletType.solana;
|
return WalletType.solana;
|
||||||
case 10:
|
case 10:
|
||||||
return WalletType.tron;
|
return WalletType.tron;
|
||||||
|
case 11:
|
||||||
|
return WalletType.wownero;
|
||||||
default:
|
default:
|
||||||
throw Exception('Unexpected token: $raw for WalletType deserializeFromInt');
|
throw Exception('Unexpected token: $raw for WalletType deserializeFromInt');
|
||||||
}
|
}
|
||||||
|
@ -139,7 +146,9 @@ String walletTypeToString(WalletType type) {
|
||||||
return 'Solana';
|
return 'Solana';
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return 'Tron';
|
return 'Tron';
|
||||||
default:
|
case WalletType.wownero:
|
||||||
|
return 'Wownero';
|
||||||
|
case WalletType.none:
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -168,7 +177,9 @@ String walletTypeToDisplayName(WalletType type) {
|
||||||
return 'Solana (SOL)';
|
return 'Solana (SOL)';
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return 'Tron (TRX)';
|
return 'Tron (TRX)';
|
||||||
default:
|
case WalletType.wownero:
|
||||||
|
return 'Wownero (WOW)';
|
||||||
|
case WalletType.none:
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,7 +211,9 @@ CryptoCurrency walletTypeToCryptoCurrency(WalletType type, {bool isTestnet = fal
|
||||||
return CryptoCurrency.sol;
|
return CryptoCurrency.sol;
|
||||||
case WalletType.tron:
|
case WalletType.tron:
|
||||||
return CryptoCurrency.trx;
|
return CryptoCurrency.trx;
|
||||||
default:
|
case WalletType.wownero:
|
||||||
|
return CryptoCurrency.wow;
|
||||||
|
case WalletType.none:
|
||||||
throw Exception(
|
throw Exception(
|
||||||
'Unexpected wallet type: ${type.toString()} for CryptoCurrency walletTypeToCryptoCurrency');
|
'Unexpected wallet type: ${type.toString()} for CryptoCurrency walletTypeToCryptoCurrency');
|
||||||
}
|
}
|
||||||
|
|
18
cw_core/lib/wownero_amount_format.dart
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:cw_core/crypto_amount_format.dart';
|
||||||
|
|
||||||
|
const wowneroAmountLength = 11;
|
||||||
|
const wowneroAmountDivider = 100000000000;
|
||||||
|
final wowneroAmountFormat = NumberFormat()
|
||||||
|
..maximumFractionDigits = wowneroAmountLength
|
||||||
|
..minimumFractionDigits = 1;
|
||||||
|
|
||||||
|
String wowneroAmountToString({required int amount}) => wowneroAmountFormat
|
||||||
|
.format(cryptoAmountToDouble(amount: amount, divider: wowneroAmountDivider))
|
||||||
|
.replaceAll(',', '');
|
||||||
|
|
||||||
|
double wowneroAmountToDouble({required int amount}) =>
|
||||||
|
cryptoAmountToDouble(amount: amount, divider: wowneroAmountDivider);
|
||||||
|
|
||||||
|
int wowneroParseAmount({required String amount}) =>
|
||||||
|
(double.parse(amount) * wowneroAmountDivider).round();
|
38
cw_core/lib/wownero_balance.dart
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
import 'package:cw_core/balance.dart';
|
||||||
|
import 'package:cw_core/wownero_amount_format.dart';
|
||||||
|
|
||||||
|
class WowneroBalance extends Balance {
|
||||||
|
WowneroBalance({required this.fullBalance, required this.unlockedBalance, this.frozenBalance = 0})
|
||||||
|
: formattedFullBalance = wowneroAmountToString(amount: fullBalance),
|
||||||
|
formattedUnlockedBalance = wowneroAmountToString(amount: unlockedBalance - frozenBalance),
|
||||||
|
formattedLockedBalance =
|
||||||
|
wowneroAmountToString(amount: frozenBalance + fullBalance - unlockedBalance),
|
||||||
|
super(unlockedBalance, fullBalance);
|
||||||
|
|
||||||
|
WowneroBalance.fromString(
|
||||||
|
{required this.formattedFullBalance,
|
||||||
|
required this.formattedUnlockedBalance,
|
||||||
|
this.formattedLockedBalance = '0.0'})
|
||||||
|
: fullBalance = wowneroParseAmount(amount: formattedFullBalance),
|
||||||
|
unlockedBalance = wowneroParseAmount(amount: formattedUnlockedBalance),
|
||||||
|
frozenBalance = wowneroParseAmount(amount: formattedLockedBalance),
|
||||||
|
super(wowneroParseAmount(amount: formattedUnlockedBalance),
|
||||||
|
wowneroParseAmount(amount: formattedFullBalance));
|
||||||
|
|
||||||
|
final int fullBalance;
|
||||||
|
final int unlockedBalance;
|
||||||
|
final int frozenBalance;
|
||||||
|
final String formattedFullBalance;
|
||||||
|
final String formattedUnlockedBalance;
|
||||||
|
final String formattedLockedBalance;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get formattedUnAvailableBalance =>
|
||||||
|
formattedLockedBalance == '0.0' ? '' : formattedLockedBalance;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get formattedAvailableBalance => formattedUnlockedBalance;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get formattedAdditionalBalance => formattedFullBalance;
|
||||||
|
}
|
|
@ -660,10 +660,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: unorm_dart
|
name: unorm_dart
|
||||||
sha256: "5b35bff83fce4d76467641438f9e867dc9bcfdb8c1694854f230579d68cd8f4b"
|
sha256: "23d8bf65605401a6a32cff99435fed66ef3dab3ddcad3454059165df46496a3b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.0"
|
version: "0.3.0"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -4,7 +4,6 @@ import 'package:cw_haven/api/signatures.dart';
|
||||||
import 'package:cw_haven/api/types.dart';
|
import 'package:cw_haven/api/types.dart';
|
||||||
import 'package:cw_haven/api/haven_api.dart';
|
import 'package:cw_haven/api/haven_api.dart';
|
||||||
import 'package:cw_haven/api/structs/account_row.dart';
|
import 'package:cw_haven/api/structs/account_row.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:cw_haven/api/wallet.dart';
|
import 'package:cw_haven/api/wallet.dart';
|
||||||
|
|
||||||
final accountSizeNative = havenApi
|
final accountSizeNative = havenApi
|
||||||
|
@ -72,12 +71,11 @@ void _setLabelForAccount(Map<String, dynamic> args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addAccount({required String label}) async {
|
Future<void> addAccount({required String label}) async {
|
||||||
await compute(_addAccount, label);
|
_addAccount(label);
|
||||||
await store();
|
await store();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setLabelForAccount({required int accountIndex, required String label}) async {
|
Future<void> setLabelForAccount({required int accountIndex, required String label}) async {
|
||||||
await compute(
|
_setLabelForAccount({'accountIndex': accountIndex, 'label': label});
|
||||||
_setLabelForAccount, {'accountIndex': accountIndex, 'label': label});
|
|
||||||
await store();
|
await store();
|
||||||
}
|
}
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11/"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
|
|
||||||
<classpathentry kind="output" path="bin/default"/>
|
|
||||||
</classpath>
|
|
8
cw_monero/android/.gitignore
vendored
|
@ -1,8 +0,0 @@
|
||||||
*.iml
|
|
||||||
.gradle
|
|
||||||
/local.properties
|
|
||||||
/.idea/workspace.xml
|
|
||||||
/.idea/libraries
|
|
||||||
.DS_Store
|
|
||||||
/build
|
|
||||||
/captures
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>cw_monero</name>
|
|
||||||
<comment>Project android created by Buildship.</comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
|
@ -1,13 +0,0 @@
|
||||||
arguments=
|
|
||||||
auto.sync=false
|
|
||||||
build.scans.enabled=false
|
|
||||||
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.0-20191016123526+0000))
|
|
||||||
connection.project.dir=../../android
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
gradle.user.home=
|
|
||||||
java.home=
|
|
||||||
jvm.arguments=
|
|
||||||
offline.mode=false
|
|
||||||
override.workspace.settings=true
|
|
||||||
show.console.view=true
|
|
||||||
show.executions.view=true
|
|
|
@ -1,232 +0,0 @@
|
||||||
cmake_minimum_required(VERSION 3.4.1)
|
|
||||||
|
|
||||||
add_library( cw_monero
|
|
||||||
SHARED
|
|
||||||
./jni/monero_jni.cpp
|
|
||||||
../ios/Classes/monero_api.cpp)
|
|
||||||
|
|
||||||
find_library( log-lib log )
|
|
||||||
|
|
||||||
set(EXTERNAL_LIBS_DIR ${CMAKE_SOURCE_DIR}/../../cw_shared_external/ios/External/android)
|
|
||||||
|
|
||||||
############
|
|
||||||
# libsodium
|
|
||||||
############
|
|
||||||
|
|
||||||
add_library(sodium STATIC IMPORTED)
|
|
||||||
set_target_properties(sodium PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libsodium.a)
|
|
||||||
|
|
||||||
############
|
|
||||||
# OpenSSL
|
|
||||||
############
|
|
||||||
|
|
||||||
add_library(crypto STATIC IMPORTED)
|
|
||||||
set_target_properties(crypto PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libcrypto.a)
|
|
||||||
|
|
||||||
add_library(ssl STATIC IMPORTED)
|
|
||||||
set_target_properties(ssl PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libssl.a)
|
|
||||||
|
|
||||||
############
|
|
||||||
# Boost
|
|
||||||
############
|
|
||||||
|
|
||||||
add_library(boost_chrono STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_chrono PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_chrono.a)
|
|
||||||
|
|
||||||
add_library(boost_date_time STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_date_time PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_date_time.a)
|
|
||||||
|
|
||||||
add_library(boost_filesystem STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_filesystem PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_filesystem.a)
|
|
||||||
|
|
||||||
add_library(boost_program_options STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_program_options PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_program_options.a)
|
|
||||||
|
|
||||||
add_library(boost_regex STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_regex PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_regex.a)
|
|
||||||
|
|
||||||
add_library(boost_serialization STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_serialization PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_serialization.a)
|
|
||||||
|
|
||||||
add_library(boost_system STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_system PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_system.a)
|
|
||||||
|
|
||||||
add_library(boost_thread STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_thread PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_thread.a)
|
|
||||||
|
|
||||||
add_library(boost_wserialization STATIC IMPORTED)
|
|
||||||
set_target_properties(boost_wserialization PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/libboost_wserialization.a)
|
|
||||||
|
|
||||||
#############
|
|
||||||
# Monero
|
|
||||||
#############
|
|
||||||
|
|
||||||
add_library(wallet_api STATIC IMPORTED)
|
|
||||||
set_target_properties(wallet_api PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libwallet_api.a)
|
|
||||||
|
|
||||||
add_library(wallet STATIC IMPORTED)
|
|
||||||
set_target_properties(wallet PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libwallet.a)
|
|
||||||
|
|
||||||
add_library(cryptonote_core STATIC IMPORTED)
|
|
||||||
set_target_properties(cryptonote_core PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libcryptonote_core.a)
|
|
||||||
|
|
||||||
add_library(cryptonote_basic STATIC IMPORTED)
|
|
||||||
set_target_properties(cryptonote_basic PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libcryptonote_basic.a)
|
|
||||||
|
|
||||||
add_library(cryptonote_format_utils_basic STATIC IMPORTED)
|
|
||||||
set_target_properties(cryptonote_format_utils_basic PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libcryptonote_format_utils_basic.a)
|
|
||||||
|
|
||||||
add_library(mnemonics STATIC IMPORTED)
|
|
||||||
set_target_properties(mnemonics PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libmnemonics.a)
|
|
||||||
|
|
||||||
add_library(common STATIC IMPORTED)
|
|
||||||
set_target_properties(common PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libcommon.a)
|
|
||||||
|
|
||||||
add_library(cncrypto STATIC IMPORTED)
|
|
||||||
set_target_properties(cncrypto PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libcncrypto.a)
|
|
||||||
|
|
||||||
add_library(ringct STATIC IMPORTED)
|
|
||||||
set_target_properties(ringct PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libringct.a)
|
|
||||||
|
|
||||||
add_library(ringct_basic STATIC IMPORTED)
|
|
||||||
set_target_properties(ringct_basic PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libringct_basic.a)
|
|
||||||
|
|
||||||
add_library(blockchain_db STATIC IMPORTED)
|
|
||||||
set_target_properties(blockchain_db PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libblockchain_db.a)
|
|
||||||
|
|
||||||
add_library(lmdb STATIC IMPORTED)
|
|
||||||
set_target_properties(lmdb PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/liblmdb.a)
|
|
||||||
|
|
||||||
add_library(easylogging STATIC IMPORTED)
|
|
||||||
set_target_properties(easylogging PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libeasylogging.a)
|
|
||||||
|
|
||||||
add_library(unbound STATIC IMPORTED)
|
|
||||||
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libunbound.a)
|
|
||||||
|
|
||||||
add_library(epee STATIC IMPORTED)
|
|
||||||
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libepee.a)
|
|
||||||
|
|
||||||
add_library(blocks STATIC IMPORTED)
|
|
||||||
set_target_properties(blocks PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libblocks.a)
|
|
||||||
|
|
||||||
add_library(checkpoints STATIC IMPORTED)
|
|
||||||
set_target_properties(checkpoints PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libcheckpoints.a)
|
|
||||||
|
|
||||||
add_library(device STATIC IMPORTED)
|
|
||||||
set_target_properties(device PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libdevice.a)
|
|
||||||
|
|
||||||
add_library(device_trezor STATIC IMPORTED)
|
|
||||||
set_target_properties(device_trezor PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libdevice_trezor.a)
|
|
||||||
|
|
||||||
add_library(multisig STATIC IMPORTED)
|
|
||||||
set_target_properties(multisig PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libmultisig.a)
|
|
||||||
|
|
||||||
add_library(version STATIC IMPORTED)
|
|
||||||
set_target_properties(version PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libversion.a)
|
|
||||||
|
|
||||||
add_library(net STATIC IMPORTED)
|
|
||||||
set_target_properties(net PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libnet.a)
|
|
||||||
|
|
||||||
add_library(hardforks STATIC IMPORTED)
|
|
||||||
set_target_properties(hardforks PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libhardforks.a)
|
|
||||||
|
|
||||||
add_library(randomx STATIC IMPORTED)
|
|
||||||
set_target_properties(randomx PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/librandomx.a)
|
|
||||||
|
|
||||||
add_library(rpc_base STATIC IMPORTED)
|
|
||||||
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/librpc_base.a)
|
|
||||||
|
|
||||||
add_library(wallet-crypto STATIC IMPORTED)
|
|
||||||
set_target_properties(wallet-crypto PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/lib/monero/libwallet-crypto.a)
|
|
||||||
|
|
||||||
set(WALLET_CRYPTO "")
|
|
||||||
|
|
||||||
if(${ANDROID_ABI} STREQUAL "x86_64")
|
|
||||||
set(WALLET_CRYPTO "wallet-crypto")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories( ${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/include )
|
|
||||||
|
|
||||||
target_link_libraries( cw_monero
|
|
||||||
|
|
||||||
wallet_api
|
|
||||||
wallet
|
|
||||||
cryptonote_core
|
|
||||||
cryptonote_basic
|
|
||||||
cryptonote_format_utils_basic
|
|
||||||
mnemonics
|
|
||||||
ringct
|
|
||||||
ringct_basic
|
|
||||||
net
|
|
||||||
common
|
|
||||||
cncrypto
|
|
||||||
blockchain_db
|
|
||||||
lmdb
|
|
||||||
easylogging
|
|
||||||
unbound
|
|
||||||
epee
|
|
||||||
blocks
|
|
||||||
checkpoints
|
|
||||||
device
|
|
||||||
device_trezor
|
|
||||||
multisig
|
|
||||||
version
|
|
||||||
randomx
|
|
||||||
hardforks
|
|
||||||
rpc_base
|
|
||||||
${WALLET_CRYPTO}
|
|
||||||
|
|
||||||
boost_chrono
|
|
||||||
boost_date_time
|
|
||||||
boost_filesystem
|
|
||||||
boost_program_options
|
|
||||||
boost_regex
|
|
||||||
boost_serialization
|
|
||||||
boost_system
|
|
||||||
boost_thread
|
|
||||||
boost_wserialization
|
|
||||||
|
|
||||||
ssl
|
|
||||||
crypto
|
|
||||||
|
|
||||||
sodium
|
|
||||||
|
|
||||||
${log-lib} )
|
|
|
@ -1,49 +0,0 @@
|
||||||
group 'com.cakewallet.monero'
|
|
||||||
version '1.0-SNAPSHOT'
|
|
||||||
|
|
||||||
buildscript {
|
|
||||||
ext.kotlin_version = '1.7.10'
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
jcenter()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
classpath 'com.android.tools.build:gradle:7.3.0'
|
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rootProject.allprojects {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
jcenter()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
apply plugin: 'com.android.library'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdkVersion 28
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main.java.srcDirs += 'src/main/kotlin'
|
|
||||||
}
|
|
||||||
defaultConfig {
|
|
||||||
minSdkVersion 21
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
||||||
}
|
|
||||||
lintOptions {
|
|
||||||
disable 'InvalidPackage'
|
|
||||||
}
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
path "CMakeLists.txt"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
org.gradle.jvmargs=-Xmx1536M
|
|
||||||
android.enableR8=true
|
|
||||||
android.useAndroidX=true
|
|
||||||
android.enableJetifier=true
|
|
|
@ -1,5 +0,0 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
|
||||||
distributionPath=wrapper/dists
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
|
|
|
@ -1,74 +0,0 @@
|
||||||
#include <string.h>
|
|
||||||
#include <jni.h>
|
|
||||||
#include "../../ios/Classes/monero_api.h"
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_com_cakewallet_monero_MoneroApi_setNodeAddressJNI(
|
|
||||||
JNIEnv *env,
|
|
||||||
jobject inst,
|
|
||||||
jstring uri,
|
|
||||||
jstring login,
|
|
||||||
jstring password,
|
|
||||||
jboolean use_ssl,
|
|
||||||
jboolean is_light_wallet) {
|
|
||||||
const char *_uri = env->GetStringUTFChars(uri, 0);
|
|
||||||
const char *_login = "";
|
|
||||||
const char *_password = "";
|
|
||||||
char *error;
|
|
||||||
|
|
||||||
if (login != NULL) {
|
|
||||||
_login = env->GetStringUTFChars(login, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (password != NULL) {
|
|
||||||
_password = env->GetStringUTFChars(password, 0);
|
|
||||||
}
|
|
||||||
char *__uri = (char*) _uri;
|
|
||||||
char *__login = (char*) _login;
|
|
||||||
char *__password = (char*) _password;
|
|
||||||
bool inited = setup_node(__uri, __login, __password, false, false, error);
|
|
||||||
|
|
||||||
if (!inited) {
|
|
||||||
env->ThrowNew(env->FindClass("java/lang/Exception"), error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_com_cakewallet_monero_MoneroApi_connectToNodeJNI(
|
|
||||||
JNIEnv *env,
|
|
||||||
jobject inst) {
|
|
||||||
char *error;
|
|
||||||
bool is_connected = connect_to_node(error);
|
|
||||||
|
|
||||||
if (!is_connected) {
|
|
||||||
env->ThrowNew(env->FindClass("java/lang/Exception"), error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_com_cakewallet_monero_MoneroApi_startSyncJNI(
|
|
||||||
JNIEnv *env,
|
|
||||||
jobject inst) {
|
|
||||||
start_refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_com_cakewallet_monero_MoneroApi_loadWalletJNI(
|
|
||||||
JNIEnv *env,
|
|
||||||
jobject inst,
|
|
||||||
jstring path,
|
|
||||||
jstring password) {
|
|
||||||
char *_path = (char *) env->GetStringUTFChars(path, 0);
|
|
||||||
char *_password = (char *) env->GetStringUTFChars(password, 0);
|
|
||||||
|
|
||||||
load_wallet(_path, _password, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1 +0,0 @@
|
||||||
rootProject.name = 'cw_monero'
|
|
|
@ -1,4 +0,0 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.cakewallet.monero">
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
|
||||||
</manifest>
|
|
|
@ -1,74 +0,0 @@
|
||||||
package com.cakewallet.monero
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.os.AsyncTask
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Process
|
|
||||||
|
|
||||||
import io.flutter.plugin.common.MethodCall
|
|
||||||
import io.flutter.plugin.common.MethodChannel
|
|
||||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
|
|
||||||
import io.flutter.plugin.common.MethodChannel.Result
|
|
||||||
import io.flutter.plugin.common.PluginRegistry.Registrar
|
|
||||||
|
|
||||||
class doAsync(val handler: () -> Unit) : AsyncTask<Void, Void, Void>() {
|
|
||||||
override fun doInBackground(vararg params: Void?): Void? {
|
|
||||||
Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);
|
|
||||||
handler()
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CwMoneroPlugin: MethodCallHandler {
|
|
||||||
companion object {
|
|
||||||
// val moneroApi = MoneroApi()
|
|
||||||
val main = Handler(Looper.getMainLooper());
|
|
||||||
|
|
||||||
init {
|
|
||||||
System.loadLibrary("cw_monero")
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun registerWith(registrar: Registrar) {
|
|
||||||
val channel = MethodChannel(registrar.messenger(), "cw_monero")
|
|
||||||
channel.setMethodCallHandler(CwMoneroPlugin())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onMethodCall(call: MethodCall, result: Result) {
|
|
||||||
if (call.method == "setupNode") {
|
|
||||||
val uri = call.argument("address") ?: ""
|
|
||||||
val login = call.argument("login") ?: ""
|
|
||||||
val password = call.argument("password") ?: ""
|
|
||||||
val useSSL = false
|
|
||||||
val isLightWallet = false
|
|
||||||
// doAsync {
|
|
||||||
// try {
|
|
||||||
// moneroApi.setNodeAddressJNI(uri, login, password, useSSL, isLightWallet)
|
|
||||||
// main.post({
|
|
||||||
// result.success(true)
|
|
||||||
// });
|
|
||||||
// } catch(e: Throwable) {
|
|
||||||
// main.post({
|
|
||||||
// result.error("CONNECTION_ERROR", e.message, null)
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// }.execute()
|
|
||||||
}
|
|
||||||
if (call.method == "startSync") {
|
|
||||||
// doAsync {
|
|
||||||
// moneroApi.startSyncJNI()
|
|
||||||
// main.post({
|
|
||||||
// result.success(true)
|
|
||||||
// });
|
|
||||||
// }.execute()
|
|
||||||
}
|
|
||||||
if (call.method == "loadWallet") {
|
|
||||||
val path = call.argument("path") ?: ""
|
|
||||||
val password = call.argument("password") ?: ""
|
|
||||||
// moneroApi.loadWalletJNI(path, password)
|
|
||||||
result.success(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
44
cw_monero/example/.gitignore
vendored
|
@ -1,44 +0,0 @@
|
||||||
# Miscellaneous
|
|
||||||
*.class
|
|
||||||
*.log
|
|
||||||
*.pyc
|
|
||||||
*.swp
|
|
||||||
.DS_Store
|
|
||||||
.atom/
|
|
||||||
.buildlog/
|
|
||||||
.history
|
|
||||||
.svn/
|
|
||||||
migrate_working_dir/
|
|
||||||
|
|
||||||
# IntelliJ related
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
.idea/
|
|
||||||
|
|
||||||
# The .vscode folder contains launch configuration and tasks you configure in
|
|
||||||
# VS Code which you may wish to be included in version control, so this line
|
|
||||||
# is commented out by default.
|
|
||||||
#.vscode/
|
|
||||||
|
|
||||||
# Flutter/Dart/Pub related
|
|
||||||
**/doc/api/
|
|
||||||
**/ios/Flutter/.last_build_id
|
|
||||||
.dart_tool/
|
|
||||||
.flutter-plugins
|
|
||||||
.flutter-plugins-dependencies
|
|
||||||
.packages
|
|
||||||
.pub-cache/
|
|
||||||
.pub/
|
|
||||||
/build/
|
|
||||||
|
|
||||||
# Symbolication related
|
|
||||||
app.*.symbols
|
|
||||||
|
|
||||||
# Obfuscation related
|
|
||||||
app.*.map.json
|
|
||||||
|
|
||||||
# Android Studio will place build artifacts here
|
|
||||||
/android/app/debug
|
|
||||||
/android/app/profile
|
|
||||||
/android/app/release
|
|
|
@ -1,16 +0,0 @@
|
||||||
# cw_monero_example
|
|
||||||
|
|
||||||
Demonstrates how to use the cw_monero plugin.
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
This project is a starting point for a Flutter application.
|
|
||||||
|
|
||||||
A few resources to get you started if this is your first Flutter project:
|
|
||||||
|
|
||||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
|
||||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
|
||||||
|
|
||||||
For help getting started with Flutter development, view the
|
|
||||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
|
||||||
samples, guidance on mobile development, and a full API reference.
|
|
|
@ -1,29 +0,0 @@
|
||||||
# This file configures the analyzer, which statically analyzes Dart code to
|
|
||||||
# check for errors, warnings, and lints.
|
|
||||||
#
|
|
||||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
|
||||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
|
||||||
# invoked from the command line by running `flutter analyze`.
|
|
||||||
|
|
||||||
# The following line activates a set of recommended lints for Flutter apps,
|
|
||||||
# packages, and plugins designed to encourage good coding practices.
|
|
||||||
include: package:flutter_lints/flutter.yaml
|
|
||||||
|
|
||||||
linter:
|
|
||||||
# The lint rules applied to this project can be customized in the
|
|
||||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
|
||||||
# included above or to enable additional rules. A list of all available lints
|
|
||||||
# and their documentation is published at
|
|
||||||
# https://dart-lang.github.io/linter/lints/index.html.
|
|
||||||
#
|
|
||||||
# Instead of disabling a lint rule for the entire project in the
|
|
||||||
# section below, it can also be suppressed for a single line of code
|
|
||||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
|
||||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
|
||||||
# producing the lint.
|
|
||||||
rules:
|
|
||||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
|
||||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
|
||||||
|
|
||||||
# Additional information about this file can be found at
|
|
||||||
# https://dart.dev/guides/language/analysis-options
|
|
|
@ -1,63 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:cw_monero/cw_monero.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatefulWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<MyApp> createState() => _MyAppState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _MyAppState extends State<MyApp> {
|
|
||||||
String _platformVersion = 'Unknown';
|
|
||||||
final _cwMoneroPlugin = CwMonero();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
initPlatformState();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Platform messages are asynchronous, so we initialize in an async method.
|
|
||||||
Future<void> initPlatformState() async {
|
|
||||||
String platformVersion;
|
|
||||||
// Platform messages may fail, so we use a try/catch PlatformException.
|
|
||||||
// We also handle the message potentially returning null.
|
|
||||||
try {
|
|
||||||
platformVersion =
|
|
||||||
await _cwMoneroPlugin.getPlatformVersion() ?? 'Unknown platform version';
|
|
||||||
} on PlatformException {
|
|
||||||
platformVersion = 'Failed to get platform version.';
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the widget was removed from the tree while the asynchronous platform
|
|
||||||
// message was in flight, we want to discard the reply rather than calling
|
|
||||||
// setState to update our non-existent appearance.
|
|
||||||
if (!mounted) return;
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
_platformVersion = platformVersion;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
home: Scaffold(
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('Plugin example app'),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: Text('Running on: $_platformVersion\n'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
7
cw_monero/example/macos/.gitignore
vendored
|
@ -1,7 +0,0 @@
|
||||||
# Flutter-related
|
|
||||||
**/Flutter/ephemeral/
|
|
||||||
**/Pods/
|
|
||||||
|
|
||||||
# Xcode-related
|
|
||||||
**/dgph
|
|
||||||
**/xcuserdata/
|
|
|
@ -1,2 +0,0 @@
|
||||||
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
|
||||||
#include "ephemeral/Flutter-Generated.xcconfig"
|
|
|
@ -1,2 +0,0 @@
|
||||||
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
|
||||||
#include "ephemeral/Flutter-Generated.xcconfig"
|
|
|
@ -1,14 +0,0 @@
|
||||||
//
|
|
||||||
// Generated file. Do not edit.
|
|
||||||
//
|
|
||||||
|
|
||||||
import FlutterMacOS
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
import cw_monero
|
|
||||||
import path_provider_foundation
|
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|
||||||
CwMoneroPlugin.register(with: registry.registrar(forPlugin: "CwMoneroPlugin"))
|
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
platform :osx, '10.11'
|
|
||||||
|
|
||||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
|
||||||
|
|
||||||
project 'Runner', {
|
|
||||||
'Debug' => :debug,
|
|
||||||
'Profile' => :release,
|
|
||||||
'Release' => :release,
|
|
||||||
}
|
|
||||||
|
|
||||||
def flutter_root
|
|
||||||
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
|
|
||||||
unless File.exist?(generated_xcode_build_settings_path)
|
|
||||||
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
|
|
||||||
end
|
|
||||||
|
|
||||||
File.foreach(generated_xcode_build_settings_path) do |line|
|
|
||||||
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
|
||||||
return matches[1].strip if matches
|
|
||||||
end
|
|
||||||
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
|
|
||||||
end
|
|
||||||
|
|
||||||
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
|
||||||
|
|
||||||
flutter_macos_podfile_setup
|
|
||||||
|
|
||||||
target 'Runner' do
|
|
||||||
use_frameworks!
|
|
||||||
use_modular_headers!
|
|
||||||
|
|
||||||
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
|
|
||||||
end
|
|
||||||
|
|
||||||
post_install do |installer|
|
|
||||||
installer.pods_project.targets.each do |target|
|
|
||||||
flutter_additional_macos_build_settings(target)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,22 +0,0 @@
|
||||||
PODS:
|
|
||||||
- FlutterMacOS (1.0.0)
|
|
||||||
- path_provider_macos (0.0.1):
|
|
||||||
- FlutterMacOS
|
|
||||||
|
|
||||||
DEPENDENCIES:
|
|
||||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
|
||||||
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
|
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
|
||||||
FlutterMacOS:
|
|
||||||
:path: Flutter/ephemeral
|
|
||||||
path_provider_macos:
|
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
|
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
|
||||||
FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811
|
|
||||||
path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
|
|
||||||
|
|
||||||
PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
|
|
||||||
|
|
||||||
COCOAPODS: 1.11.2
|
|
|
@ -1,632 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 51;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXAggregateTarget section */
|
|
||||||
33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
|
|
||||||
isa = PBXAggregateTarget;
|
|
||||||
buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
|
|
||||||
buildPhases = (
|
|
||||||
33CC111E2044C6BF0003C045 /* ShellScript */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "Flutter Assemble";
|
|
||||||
productName = FLX;
|
|
||||||
};
|
|
||||||
/* End PBXAggregateTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
|
|
||||||
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
|
|
||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
|
||||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
|
||||||
428E7496E2068D0AB138F295 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C29B2253BA962B7A415DBA77 /* Pods_Runner.framework */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = 33CC111A2044C6BA0003C045;
|
|
||||||
remoteInfo = FLX;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */ = {
|
|
||||||
isa = PBXCopyFilesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
dstPath = "";
|
|
||||||
dstSubfolderSpec = 10;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
name = "Bundle Framework";
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
|
||||||
33CC10ED2044A3C60003C045 /* cw_monero_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cw_monero_example.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
|
||||||
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
|
||||||
33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
|
|
||||||
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
|
|
||||||
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
|
||||||
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
|
||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
|
||||||
A9CDA1605413332AB9056C23 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
C29B2253BA962B7A415DBA77 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
E434913D71DC2682EF8E9059 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
EEF09839C86335F78056F812 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
33CC10EA2044A3C60003C045 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
428E7496E2068D0AB138F295 /* Pods_Runner.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
33BA886A226E78AF003329D5 /* Configs */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */,
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
|
|
||||||
);
|
|
||||||
path = Configs;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CC10E42044A3C60003C045 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33FAB671232836740065AC1E /* Runner */,
|
|
||||||
33CEB47122A05771004F2AC0 /* Flutter */,
|
|
||||||
33CC10EE2044A3C60003C045 /* Products */,
|
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
|
||||||
77870A4C94A9AB6EEC2EE261 /* Pods */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CC10EE2044A3C60003C045 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33CC10ED2044A3C60003C045 /* cw_monero_example.app */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CC11242044D66E0003C045 /* Resources */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */,
|
|
||||||
33CC10F42044A3C60003C045 /* MainMenu.xib */,
|
|
||||||
33CC10F72044A3C60003C045 /* Info.plist */,
|
|
||||||
);
|
|
||||||
name = Resources;
|
|
||||||
path = ..;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CEB47122A05771004F2AC0 /* Flutter */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
|
|
||||||
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
|
|
||||||
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
|
|
||||||
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
|
|
||||||
);
|
|
||||||
path = Flutter;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33FAB671232836740065AC1E /* Runner */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */,
|
|
||||||
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
|
|
||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */,
|
|
||||||
33E51914231749380026EE4D /* Release.entitlements */,
|
|
||||||
33CC11242044D66E0003C045 /* Resources */,
|
|
||||||
33BA886A226E78AF003329D5 /* Configs */,
|
|
||||||
);
|
|
||||||
path = Runner;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
77870A4C94A9AB6EEC2EE261 /* Pods */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
EEF09839C86335F78056F812 /* Pods-Runner.debug.xcconfig */,
|
|
||||||
A9CDA1605413332AB9056C23 /* Pods-Runner.release.xcconfig */,
|
|
||||||
E434913D71DC2682EF8E9059 /* Pods-Runner.profile.xcconfig */,
|
|
||||||
);
|
|
||||||
name = Pods;
|
|
||||||
path = Pods;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
C29B2253BA962B7A415DBA77 /* Pods_Runner.framework */,
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
33CC10EC2044A3C60003C045 /* Runner */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
|
|
||||||
buildPhases = (
|
|
||||||
0A239C1738C005E3F6E4DFC6 /* [CP] Check Pods Manifest.lock */,
|
|
||||||
33CC10E92044A3C60003C045 /* Sources */,
|
|
||||||
33CC10EA2044A3C60003C045 /* Frameworks */,
|
|
||||||
33CC10EB2044A3C60003C045 /* Resources */,
|
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */,
|
|
||||||
3399D490228B24CF009A79C7 /* ShellScript */,
|
|
||||||
0CEAA82AE8A029C31B39F234 /* [CP] Embed Pods Frameworks */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = Runner;
|
|
||||||
productName = Runner;
|
|
||||||
productReference = 33CC10ED2044A3C60003C045 /* cw_monero_example.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
33CC10E52044A3C60003C045 /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastSwiftUpdateCheck = 0920;
|
|
||||||
LastUpgradeCheck = 1300;
|
|
||||||
ORGANIZATIONNAME = "";
|
|
||||||
TargetAttributes = {
|
|
||||||
33CC10EC2044A3C60003C045 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
LastSwiftMigration = 1100;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
SystemCapabilities = {
|
|
||||||
com.apple.Sandbox = {
|
|
||||||
enabled = 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
33CC111A2044C6BA0003C045 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Manual;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
|
|
||||||
compatibilityVersion = "Xcode 9.3";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = 33CC10E42044A3C60003C045;
|
|
||||||
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
33CC10EC2044A3C60003C045 /* Runner */,
|
|
||||||
33CC111A2044C6BA0003C045 /* Flutter Assemble */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
33CC10EB2044A3C60003C045 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
|
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
0A239C1738C005E3F6E4DFC6 /* [CP] Check Pods Manifest.lock */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
|
||||||
"${PODS_ROOT}/Manifest.lock",
|
|
||||||
);
|
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
0CEAA82AE8A029C31B39F234 /* [CP] Embed Pods Frameworks */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
|
||||||
);
|
|
||||||
name = "[CP] Embed Pods Frameworks";
|
|
||||||
outputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
3399D490228B24CF009A79C7 /* ShellScript */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
|
|
||||||
};
|
|
||||||
33CC111E2044C6BF0003C045 /* ShellScript */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
Flutter/ephemeral/FlutterInputs.xcfilelist,
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
Flutter/ephemeral/tripwire,
|
|
||||||
);
|
|
||||||
outputFileListPaths = (
|
|
||||||
Flutter/ephemeral/FlutterOutputs.xcfilelist,
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
33CC10E92044A3C60003C045 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
|
|
||||||
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
|
|
||||||
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
|
|
||||||
targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
33CC10F52044A3C60003C045 /* Base */,
|
|
||||||
);
|
|
||||||
name = MainMenu.xib;
|
|
||||||
path = Runner;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
338D0CE9231458BD00FA5F75 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "-";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
338D0CEA231458BD00FA5F75 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
338D0CEB231458BD00FA5F75 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Manual;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
33CC10F92044A3C60003C045 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "-";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
33CC10FA2044A3C60003C045 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "-";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
33CC10FC2044A3C60003C045 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
33CC10FD2044A3C60003C045 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
33CC111C2044C6BA0003C045 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Manual;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
33CC111D2044C6BA0003C045 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
33CC10F92044A3C60003C045 /* Debug */,
|
|
||||||
33CC10FA2044A3C60003C045 /* Release */,
|
|
||||||
338D0CE9231458BD00FA5F75 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
33CC10FC2044A3C60003C045 /* Debug */,
|
|
||||||
33CC10FD2044A3C60003C045 /* Release */,
|
|
||||||
338D0CEA231458BD00FA5F75 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
33CC111C2044C6BA0003C045 /* Debug */,
|
|
||||||
33CC111D2044C6BA0003C045 /* Release */,
|
|
||||||
338D0CEB231458BD00FA5F75 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = 33CC10E52044A3C60003C045 /* Project object */;
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,87 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "1300"
|
|
||||||
version = "1.3">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "cw_monero_example.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "cw_monero_example.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
<Testables>
|
|
||||||
</Testables>
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "cw_monero_example.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Profile"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "cw_monero_example.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
|
@ -1,10 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "group:Runner.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
<FileRef
|
|
||||||
location = "group:Pods/Pods.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,9 +0,0 @@
|
||||||
import Cocoa
|
|
||||||
import FlutterMacOS
|
|
||||||
|
|
||||||
@NSApplicationMain
|
|
||||||
class AppDelegate: FlutterAppDelegate {
|
|
||||||
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"size" : "16x16",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_16.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "16x16",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_32.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "32x32",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_32.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "32x32",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_64.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "128x128",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_128.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "128x128",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_256.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "256x256",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_256.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "256x256",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_512.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "512x512",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_512.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "512x512",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_1024.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 520 B |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 2.2 KiB |
|
@ -1,343 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
|
||||||
<dependencies>
|
|
||||||
<deployment identifier="macosx"/>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
|
||||||
</dependencies>
|
|
||||||
<objects>
|
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
|
||||||
<connections>
|
|
||||||
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
|
||||||
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target">
|
|
||||||
<connections>
|
|
||||||
<outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
|
|
||||||
<outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
|
||||||
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
|
||||||
<items>
|
|
||||||
<menuItem title="APP_NAME" id="1Xt-HY-uBw">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
|
|
||||||
<items>
|
|
||||||
<menuItem title="About APP_NAME" id="5kV-Vb-QxS">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
|
|
||||||
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
|
|
||||||
<menuItem title="Services" id="NMo-om-nkz">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
|
|
||||||
<menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
|
|
||||||
<connections>
|
|
||||||
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Show All" id="Kd2-mp-pUS">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
|
|
||||||
<menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
|
|
||||||
<connections>
|
|
||||||
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Edit" id="5QF-Oa-p0T">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
|
|
||||||
<connections>
|
|
||||||
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
|
|
||||||
<connections>
|
|
||||||
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
|
|
||||||
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
|
|
||||||
<connections>
|
|
||||||
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
|
|
||||||
<connections>
|
|
||||||
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
|
|
||||||
<connections>
|
|
||||||
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Delete" id="pa3-QI-u2k">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
|
|
||||||
<connections>
|
|
||||||
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
|
|
||||||
<menuItem title="Find" id="4EN-yA-p0u">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Find" id="1b7-l0-nxx">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
|
|
||||||
<connections>
|
|
||||||
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
|
|
||||||
<connections>
|
|
||||||
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
|
|
||||||
<connections>
|
|
||||||
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
|
|
||||||
<connections>
|
|
||||||
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
|
|
||||||
<connections>
|
|
||||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
|
|
||||||
<connections>
|
|
||||||
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
|
|
||||||
<connections>
|
|
||||||
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
|
|
||||||
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Substitutions" id="9ic-FL-obx">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
|
|
||||||
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Smart Links" id="cwL-P1-jid">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Data Detectors" id="tRr-pd-1PS">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Transformations" id="2oI-Rn-ZJC">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Speech" id="xrE-MZ-jX0">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="View" id="H8h-7b-M4v">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="View" id="HyV-fh-RgO">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Window" id="aUF-d1-5bR">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
|
|
||||||
<connections>
|
|
||||||
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Zoom" id="R4o-n2-Eq4">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
|
|
||||||
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
|
|
||||||
</connections>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Help" id="EPT-qC-fAb">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Help" systemMenu="help" id="rJ0-wn-3NY"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
<point key="canvasLocation" x="142" y="-258"/>
|
|
||||||
</menu>
|
|
||||||
<window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target">
|
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
|
||||||
<rect key="contentRect" x="335" y="390" width="800" height="600"/>
|
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/>
|
|
||||||
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="800" height="600"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
</view>
|
|
||||||
</window>
|
|
||||||
</objects>
|
|
||||||
</document>
|
|
|
@ -1,14 +0,0 @@
|
||||||
// Application-level settings for the Runner target.
|
|
||||||
//
|
|
||||||
// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
|
|
||||||
// future. If not, the values below would default to using the project name when this becomes a
|
|
||||||
// 'flutter create' template.
|
|
||||||
|
|
||||||
// The application's name. By default this is also the title of the Flutter window.
|
|
||||||
PRODUCT_NAME = cw_monero_example
|
|
||||||
|
|
||||||
// The application's bundle identifier
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.cwMoneroExample
|
|
||||||
|
|
||||||
// The copyright displayed in application information
|
|
||||||
PRODUCT_COPYRIGHT = Copyright © 2022 com.cakewallet. All rights reserved.
|
|
|
@ -1,2 +0,0 @@
|
||||||
#include "../../Flutter/Flutter-Debug.xcconfig"
|
|
||||||
#include "Warnings.xcconfig"
|
|
|
@ -1,2 +0,0 @@
|
||||||
#include "../../Flutter/Flutter-Release.xcconfig"
|
|
||||||
#include "Warnings.xcconfig"
|
|
|
@ -1,13 +0,0 @@
|
||||||
WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES
|
|
||||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
|
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
|
|
||||||
CLANG_WARN_PRAGMA_PACK = YES
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES
|
|
||||||
CLANG_WARN_COMMA = YES
|
|
||||||
GCC_WARN_STRICT_SELECTOR_MATCH = YES
|
|
||||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
|
|
||||||
GCC_WARN_SHADOW = YES
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES
|
|
|
@ -1,32 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string></string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>$(PRODUCT_NAME)</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>$(PRODUCT_COPYRIGHT)</string>
|
|
||||||
<key>NSMainNibFile</key>
|
|
||||||
<string>MainMenu</string>
|
|
||||||
<key>NSPrincipalClass</key>
|
|
||||||
<string>NSApplication</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,15 +0,0 @@
|
||||||
import Cocoa
|
|
||||||
import FlutterMacOS
|
|
||||||
|
|
||||||
class MainFlutterWindow: NSWindow {
|
|
||||||
override func awakeFromNib() {
|
|
||||||
let flutterViewController = FlutterViewController.init()
|
|
||||||
let windowFrame = self.frame
|
|
||||||
self.contentViewController = flutterViewController
|
|
||||||
self.setFrame(windowFrame, display: true)
|
|
||||||
|
|
||||||
RegisterGeneratedPlugins(registry: flutterViewController)
|
|
||||||
|
|
||||||
super.awakeFromNib()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>com.apple.security.app-sandbox</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,84 +0,0 @@
|
||||||
name: cw_monero_example
|
|
||||||
description: Demonstrates how to use the cw_monero plugin.
|
|
||||||
|
|
||||||
# The following line prevents the package from being accidentally published to
|
|
||||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
|
||||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|
||||||
|
|
||||||
environment:
|
|
||||||
sdk: '>=2.18.1 <3.0.0'
|
|
||||||
|
|
||||||
# Dependencies specify other packages that your package needs in order to work.
|
|
||||||
# To automatically upgrade your package dependencies to the latest versions
|
|
||||||
# consider running `flutter pub upgrade --major-versions`. Alternatively,
|
|
||||||
# dependencies can be manually updated by changing the version numbers below to
|
|
||||||
# the latest version available on pub.dev. To see which dependencies have newer
|
|
||||||
# versions available, run `flutter pub outdated`.
|
|
||||||
dependencies:
|
|
||||||
flutter:
|
|
||||||
sdk: flutter
|
|
||||||
|
|
||||||
cw_monero:
|
|
||||||
# When depending on this package from a real application you should use:
|
|
||||||
# cw_monero: ^x.y.z
|
|
||||||
# See https://dart.dev/tools/pub/dependencies#version-constraints
|
|
||||||
# The example app is bundled with the plugin so we use a path dependency on
|
|
||||||
# the parent directory to use the current plugin's version.
|
|
||||||
path: ../
|
|
||||||
|
|
||||||
# The following adds the Cupertino Icons font to your application.
|
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
|
||||||
cupertino_icons: ^1.0.2
|
|
||||||
|
|
||||||
dev_dependencies:
|
|
||||||
flutter_test:
|
|
||||||
sdk: flutter
|
|
||||||
|
|
||||||
# The "flutter_lints" package below contains a set of recommended lints to
|
|
||||||
# encourage good coding practices. The lint set provided by the package is
|
|
||||||
# activated in the `analysis_options.yaml` file located at the root of your
|
|
||||||
# package. See that file for information about deactivating specific lint
|
|
||||||
# rules and activating additional ones.
|
|
||||||
flutter_lints: ^2.0.0
|
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
|
||||||
# following page: https://dart.dev/tools/pub/pubspec
|
|
||||||
|
|
||||||
# The following section is specific to Flutter packages.
|
|
||||||
flutter:
|
|
||||||
|
|
||||||
# The following line ensures that the Material Icons font is
|
|
||||||
# included with your application, so that you can use the icons in
|
|
||||||
# the material Icons class.
|
|
||||||
uses-material-design: true
|
|
||||||
|
|
||||||
# To add assets to your application, add an assets section, like this:
|
|
||||||
# assets:
|
|
||||||
# - images/a_dot_burr.jpeg
|
|
||||||
# - images/a_dot_ham.jpeg
|
|
||||||
|
|
||||||
# An image asset can refer to one or more resolution-specific "variants", see
|
|
||||||
# https://flutter.dev/assets-and-images/#resolution-aware
|
|
||||||
|
|
||||||
# For details regarding adding assets from package dependencies, see
|
|
||||||
# https://flutter.dev/assets-and-images/#from-packages
|
|
||||||
|
|
||||||
# To add custom fonts to your application, add a fonts section here,
|
|
||||||
# in this "flutter" section. Each entry in this list should have a
|
|
||||||
# "family" key with the font family name, and a "fonts" key with a
|
|
||||||
# list giving the asset and other descriptors for the font. For
|
|
||||||
# example:
|
|
||||||
# fonts:
|
|
||||||
# - family: Schyler
|
|
||||||
# fonts:
|
|
||||||
# - asset: fonts/Schyler-Regular.ttf
|
|
||||||
# - asset: fonts/Schyler-Italic.ttf
|
|
||||||
# style: italic
|
|
||||||
# - family: Trajan Pro
|
|
||||||
# fonts:
|
|
||||||
# - asset: fonts/TrajanPro.ttf
|
|
||||||
# - asset: fonts/TrajanPro_Bold.ttf
|
|
||||||
# weight: 700
|
|
||||||
#
|
|
||||||
# For details regarding fonts from package dependencies,
|
|
||||||
# see https://flutter.dev/custom-fonts/#from-packages
|
|
|
@ -1,27 +0,0 @@
|
||||||
// This is a basic Flutter widget test.
|
|
||||||
//
|
|
||||||
// To perform an interaction with a widget in your test, use the WidgetTester
|
|
||||||
// utility in the flutter_test package. For example, you can send tap and scroll
|
|
||||||
// gestures. You can also use WidgetTester to find child widgets in the widget
|
|
||||||
// tree, read text, and verify that the values of widget properties are correct.
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
|
|
||||||
import 'package:cw_monero_example/main.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
testWidgets('Verify Platform version', (WidgetTester tester) async {
|
|
||||||
// Build our app and trigger a frame.
|
|
||||||
await tester.pumpWidget(const MyApp());
|
|
||||||
|
|
||||||
// Verify that platform version is retrieved.
|
|
||||||
expect(
|
|
||||||
find.byWidgetPredicate(
|
|
||||||
(Widget widget) => widget is Text &&
|
|
||||||
widget.data!.startsWith('Running on:'),
|
|
||||||
),
|
|
||||||
findsOneWidget,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
37
cw_monero/ios/.gitignore
vendored
|
@ -1,37 +0,0 @@
|
||||||
.idea/
|
|
||||||
.vagrant/
|
|
||||||
.sconsign.dblite
|
|
||||||
.svn/
|
|
||||||
|
|
||||||
.DS_Store
|
|
||||||
*.swp
|
|
||||||
profile
|
|
||||||
|
|
||||||
DerivedData/
|
|
||||||
build/
|
|
||||||
GeneratedPluginRegistrant.h
|
|
||||||
GeneratedPluginRegistrant.m
|
|
||||||
|
|
||||||
.generated/
|
|
||||||
|
|
||||||
*.pbxuser
|
|
||||||
*.mode1v3
|
|
||||||
*.mode2v3
|
|
||||||
*.perspectivev3
|
|
||||||
|
|
||||||
!default.pbxuser
|
|
||||||
!default.mode1v3
|
|
||||||
!default.mode2v3
|
|
||||||
!default.perspectivev3
|
|
||||||
|
|
||||||
xcuserdata
|
|
||||||
|
|
||||||
*.moved-aside
|
|
||||||
|
|
||||||
*.pyc
|
|
||||||
*sync/
|
|
||||||
Icon?
|
|
||||||
.tags*
|
|
||||||
|
|
||||||
/Flutter/Generated.xcconfig
|
|
||||||
/Flutter/flutter_export_environment.sh
|
|
|
@ -1,4 +0,0 @@
|
||||||
#import <Flutter/Flutter.h>
|
|
||||||
|
|
||||||
@interface CwMoneroPlugin : NSObject<FlutterPlugin>
|
|
||||||
@end
|
|
|
@ -1,8 +0,0 @@
|
||||||
#import "CwMoneroPlugin.h"
|
|
||||||
#import <cw_monero/cw_monero-Swift.h>
|
|
||||||
|
|
||||||
@implementation CwMoneroPlugin
|
|
||||||
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
|
|
||||||
[SwiftCwMoneroPlugin registerWithRegistrar:registrar];
|
|
||||||
}
|
|
||||||
@end
|
|
|
@ -1,23 +0,0 @@
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
struct CWMoneroWalletListener;
|
|
||||||
|
|
||||||
typedef int8_t (*on_new_block_callback)(uint64_t height);
|
|
||||||
typedef int8_t (*on_need_to_refresh_callback)();
|
|
||||||
|
|
||||||
typedef struct CWMoneroWalletListener
|
|
||||||
{
|
|
||||||
// on_money_spent_callback *on_money_spent;
|
|
||||||
// on_money_received_callback *on_money_received;
|
|
||||||
// on_unconfirmed_money_received_callback *on_unconfirmed_money_received;
|
|
||||||
// on_new_block_callback *on_new_block;
|
|
||||||
// on_updated_callback *on_updated;
|
|
||||||
// on_refreshed_callback *on_refreshed;
|
|
||||||
|
|
||||||
on_new_block_callback on_new_block;
|
|
||||||
} CWMoneroWalletListener;
|
|
||||||
|
|
||||||
struct TestListener {
|
|
||||||
// int8_t x;
|
|
||||||
on_new_block_callback on_new_block;
|
|
||||||
};
|
|
|
@ -1,14 +0,0 @@
|
||||||
import Flutter
|
|
||||||
import UIKit
|
|
||||||
|
|
||||||
public class SwiftCwMoneroPlugin: NSObject, FlutterPlugin {
|
|
||||||
public static func register(with registrar: FlutterPluginRegistrar) {
|
|
||||||
let channel = FlutterMethodChannel(name: "cw_monero", binaryMessenger: registrar.messenger())
|
|
||||||
let instance = SwiftCwMoneroPlugin()
|
|
||||||
registrar.addMethodCallDelegate(instance, channel: channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
|
||||||
result("iOS " + UIDevice.current.systemVersion)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "CwWalletListener.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool create_wallet(char *path, char *password, char *language, int32_t networkType, char *error);
|
|
||||||
bool restore_wallet_from_seed(char *path, char *password, char *seed, int32_t networkType, uint64_t restoreHeight, char *error);
|
|
||||||
bool restore_wallet_from_keys(char *path, char *password, char *language, char *address, char *viewKey, char *spendKey, int32_t networkType, uint64_t restoreHeight, char *error);
|
|
||||||
void load_wallet(char *path, char *password, int32_t nettype);
|
|
||||||
bool is_wallet_exist(char *path);
|
|
||||||
|
|
||||||
char *get_filename();
|
|
||||||
const char *seed();
|
|
||||||
char *get_address(uint32_t account_index, uint32_t address_index);
|
|
||||||
uint64_t get_full_balance(uint32_t account_index);
|
|
||||||
uint64_t get_unlocked_balance(uint32_t account_index);
|
|
||||||
uint64_t get_current_height();
|
|
||||||
uint64_t get_node_height();
|
|
||||||
|
|
||||||
bool is_connected();
|
|
||||||
|
|
||||||
bool setup_node(char *address, char *login, char *password, bool use_ssl, bool is_light_wallet, char *error);
|
|
||||||
bool connect_to_node(char *error);
|
|
||||||
void start_refresh();
|
|
||||||
void set_refresh_from_block_height(uint64_t height);
|
|
||||||
void set_recovering_from_seed(bool is_recovery);
|
|
||||||
void store(char *path);
|
|
||||||
|
|
||||||
void set_trusted_daemon(bool arg);
|
|
||||||
bool trusted_daemon();
|
|
||||||
char *sign_message(char *message, char *address);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,62 +0,0 @@
|
||||||
#
|
|
||||||
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
|
|
||||||
# Run `pod lib lint cw_monero.podspec' to validate before publishing.
|
|
||||||
#
|
|
||||||
Pod::Spec.new do |s|
|
|
||||||
s.name = 'cw_monero'
|
|
||||||
s.version = '0.0.2'
|
|
||||||
s.summary = 'CW Monero'
|
|
||||||
s.description = 'Cake Wallet wrapper over Monero project.'
|
|
||||||
s.homepage = 'http://cakewallet.com'
|
|
||||||
s.license = { :file => '../LICENSE' }
|
|
||||||
s.author = { 'CakeWallet' => 'support@cakewallet.com' }
|
|
||||||
s.source = { :path => '.' }
|
|
||||||
s.source_files = 'Classes/**/*'
|
|
||||||
s.public_header_files = 'Classes/**/*.h, Classes/*.h, External/ios/libs/monero/include/External/ios/**/*.h'
|
|
||||||
s.dependency 'Flutter'
|
|
||||||
s.dependency 'cw_shared_external'
|
|
||||||
s.platform = :ios, '10.0'
|
|
||||||
s.swift_version = '4.0'
|
|
||||||
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => 'arm64', 'ENABLE_BITCODE' => 'NO' }
|
|
||||||
s.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/Classes/*.h" }
|
|
||||||
|
|
||||||
s.subspec 'OpenSSL' do |openssl|
|
|
||||||
openssl.preserve_paths = '../../../../../cw_shared_external/ios/External/ios/include/**/*.h'
|
|
||||||
openssl.vendored_libraries = '../../../../../cw_shared_external/ios/External/ios/lib/libcrypto.a', '../../../../../cw_shared_external/ios/External/ios/lib/libssl.a'
|
|
||||||
openssl.libraries = 'ssl', 'crypto'
|
|
||||||
openssl.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/ios/include/**" }
|
|
||||||
end
|
|
||||||
|
|
||||||
s.subspec 'Sodium' do |sodium|
|
|
||||||
sodium.preserve_paths = '../../../../../cw_shared_external/ios/External/ios/include/**/*.h'
|
|
||||||
sodium.vendored_libraries = '../../../../../cw_shared_external/ios/External/ios/lib/libsodium.a'
|
|
||||||
sodium.libraries = 'sodium'
|
|
||||||
sodium.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/ios/include/**" }
|
|
||||||
end
|
|
||||||
|
|
||||||
s.subspec 'Unbound' do |unbound|
|
|
||||||
unbound.preserve_paths = '../../../../../cw_shared_external/ios/External/ios/include/**/*.h'
|
|
||||||
unbound.vendored_libraries = '../../../../../cw_shared_external/ios/External/ios/lib/libunbound.a'
|
|
||||||
unbound.libraries = 'unbound'
|
|
||||||
unbound.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/ios/include/**" }
|
|
||||||
end
|
|
||||||
|
|
||||||
s.subspec 'Boost' do |boost|
|
|
||||||
boost.preserve_paths = '../../../../../cw_shared_external/ios/External/ios/include/**/*.h',
|
|
||||||
boost.vendored_libraries = '../../../../../cw_shared_external/ios/External/ios/lib/libboost.a',
|
|
||||||
boost.libraries = 'boost'
|
|
||||||
boost.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/ios/include/**" }
|
|
||||||
end
|
|
||||||
|
|
||||||
s.subspec 'Monero' do |monero|
|
|
||||||
monero.preserve_paths = 'External/ios/include/**/*.h'
|
|
||||||
monero.vendored_libraries = 'External/ios/lib/libmonero.a'
|
|
||||||
monero.libraries = 'monero'
|
|
||||||
monero.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/ios/include" }
|
|
||||||
end
|
|
||||||
|
|
||||||
# s.subspec 'lmdb' do |lmdb|
|
|
||||||
# lmdb.vendored_libraries = 'External/ios/lib/liblmdb.a'
|
|
||||||
# lmdb.libraries = 'lmdb'
|
|
||||||
# end
|
|
||||||
end
|
|
|
@ -1,38 +1,28 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'package:ffi/ffi.dart';
|
|
||||||
import 'package:cw_monero/api/signatures.dart';
|
|
||||||
import 'package:cw_monero/api/types.dart';
|
|
||||||
import 'package:cw_monero/api/monero_api.dart';
|
|
||||||
import 'package:cw_monero/api/structs/account_row.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:cw_monero/api/wallet.dart';
|
import 'package:cw_monero/api/wallet.dart';
|
||||||
|
import 'package:monero/monero.dart' as monero;
|
||||||
|
|
||||||
final accountSizeNative = moneroApi
|
monero.wallet? wptr = null;
|
||||||
.lookup<NativeFunction<account_size>>('account_size')
|
|
||||||
.asFunction<SubaddressSize>();
|
|
||||||
|
|
||||||
final accountRefreshNative = moneroApi
|
int _wlptrForW = 0;
|
||||||
.lookup<NativeFunction<account_refresh>>('account_refresh')
|
monero.WalletListener? _wlptr = null;
|
||||||
.asFunction<AccountRefresh>();
|
|
||||||
|
|
||||||
final accountGetAllNative = moneroApi
|
monero.WalletListener getWlptr() {
|
||||||
.lookup<NativeFunction<account_get_all>>('account_get_all')
|
if (wptr!.address == _wlptrForW) return _wlptr!;
|
||||||
.asFunction<AccountGetAll>();
|
_wlptrForW = wptr!.address;
|
||||||
|
_wlptr = monero.MONERO_cw_getWalletListener(wptr!);
|
||||||
|
return _wlptr!;
|
||||||
|
}
|
||||||
|
|
||||||
final accountAddNewNative = moneroApi
|
|
||||||
.lookup<NativeFunction<account_add_new>>('account_add_row')
|
|
||||||
.asFunction<AccountAddNew>();
|
|
||||||
|
|
||||||
final accountSetLabelNative = moneroApi
|
monero.SubaddressAccount? subaddressAccount;
|
||||||
.lookup<NativeFunction<account_set_label>>('account_set_label_row')
|
|
||||||
.asFunction<AccountSetLabel>();
|
|
||||||
|
|
||||||
bool isUpdating = false;
|
bool isUpdating = false;
|
||||||
|
|
||||||
void refreshAccounts() {
|
void refreshAccounts() {
|
||||||
try {
|
try {
|
||||||
isUpdating = true;
|
isUpdating = true;
|
||||||
accountRefreshNative();
|
subaddressAccount = monero.Wallet_subaddressAccount(wptr!);
|
||||||
|
monero.SubaddressAccount_refresh(subaddressAccount!);
|
||||||
isUpdating = false;
|
isUpdating = false;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
isUpdating = false;
|
isUpdating = false;
|
||||||
|
@ -40,26 +30,27 @@ void refreshAccounts() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<AccountRow> getAllAccount() {
|
List<monero.SubaddressAccountRow> getAllAccount() {
|
||||||
final size = accountSizeNative();
|
// final size = monero.Wallet_numSubaddressAccounts(wptr!);
|
||||||
final accountAddressesPointer = accountGetAllNative();
|
refreshAccounts();
|
||||||
final accountAddresses = accountAddressesPointer.asTypedList(size);
|
int size = monero.SubaddressAccount_getAll_size(subaddressAccount!);
|
||||||
|
print("size: $size");
|
||||||
return accountAddresses
|
if (size == 0) {
|
||||||
.map((addr) => Pointer<AccountRow>.fromAddress(addr).ref)
|
monero.Wallet_addSubaddressAccount(wptr!);
|
||||||
.toList();
|
return getAllAccount();
|
||||||
|
}
|
||||||
|
return List.generate(size, (index) {
|
||||||
|
return monero.SubaddressAccount_getAll_byIndex(subaddressAccount!, index: index);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void addAccountSync({required String label}) {
|
void addAccountSync({required String label}) {
|
||||||
final labelPointer = label.toNativeUtf8();
|
monero.Wallet_addSubaddressAccount(wptr!, label: label);
|
||||||
accountAddNewNative(labelPointer);
|
|
||||||
calloc.free(labelPointer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLabelForAccountSync({required int accountIndex, required String label}) {
|
void setLabelForAccountSync({required int accountIndex, required String label}) {
|
||||||
final labelPointer = label.toNativeUtf8();
|
// TODO(mrcyjanek): this may be wrong function?
|
||||||
accountSetLabelNative(accountIndex, labelPointer);
|
monero.Wallet_setSubaddressLabel(wptr!, accountIndex: accountIndex, addressIndex: 0, label: label);
|
||||||
calloc.free(labelPointer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _addAccount(String label) => addAccountSync(label: label);
|
void _addAccount(String label) => addAccountSync(label: label);
|
||||||
|
@ -72,12 +63,11 @@ void _setLabelForAccount(Map<String, dynamic> args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addAccount({required String label}) async {
|
Future<void> addAccount({required String label}) async {
|
||||||
await compute(_addAccount, label);
|
_addAccount(label);
|
||||||
await store();
|
await store();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setLabelForAccount({required int accountIndex, required String label}) async {
|
Future<void> setLabelForAccount({required int accountIndex, required String label}) async {
|
||||||
await compute(
|
_setLabelForAccount({'accountIndex': accountIndex, 'label': label});
|
||||||
_setLabelForAccount, {'accountIndex': accountIndex, 'label': label});
|
|
||||||
await store();
|
await store();
|
||||||
}
|
}
|
|
@ -1,35 +1,17 @@
|
||||||
import 'dart:ffi';
|
import 'package:cw_monero/api/account_list.dart';
|
||||||
import 'package:cw_monero/api/signatures.dart';
|
import 'package:monero/monero.dart' as monero;
|
||||||
import 'package:cw_monero/api/structs/coins_info_row.dart';
|
|
||||||
import 'package:cw_monero/api/types.dart';
|
|
||||||
import 'package:cw_monero/api/monero_api.dart';
|
|
||||||
|
|
||||||
final refreshCoinsNative = moneroApi
|
monero.Coins? coins = null;
|
||||||
.lookup<NativeFunction<refresh_coins>>('refresh_coins')
|
|
||||||
.asFunction<RefreshCoins>();
|
|
||||||
|
|
||||||
final coinsCountNative = moneroApi
|
void refreshCoins(int accountIndex) {
|
||||||
.lookup<NativeFunction<coins_count>>('coins_count')
|
coins = monero.Wallet_coins(wptr!);
|
||||||
.asFunction<CoinsCount>();
|
monero.Coins_refresh(coins!);
|
||||||
|
}
|
||||||
|
|
||||||
final coinNative = moneroApi
|
int countOfCoins() => monero.Coins_count(coins!);
|
||||||
.lookup<NativeFunction<coin>>('coin')
|
|
||||||
.asFunction<GetCoin>();
|
|
||||||
|
|
||||||
final freezeCoinNative = moneroApi
|
monero.CoinsInfo getCoin(int index) => monero.Coins_coin(coins!, index);
|
||||||
.lookup<NativeFunction<freeze_coin>>('freeze_coin')
|
|
||||||
.asFunction<FreezeCoin>();
|
|
||||||
|
|
||||||
final thawCoinNative = moneroApi
|
void freezeCoin(int index) => monero.Coins_setFrozen(coins!, index: index);
|
||||||
.lookup<NativeFunction<thaw_coin>>('thaw_coin')
|
|
||||||
.asFunction<ThawCoin>();
|
|
||||||
|
|
||||||
void refreshCoins(int accountIndex) => refreshCoinsNative(accountIndex);
|
void thawCoin(int index) => monero.Coins_thaw(coins!, index: index);
|
||||||
|
|
||||||
int countOfCoins() => coinsCountNative();
|
|
||||||
|
|
||||||
CoinsInfoRow getCoin(int index) => coinNative(index).ref;
|
|
||||||
|
|
||||||
void freezeCoin(int index) => freezeCoinNative(index);
|
|
||||||
|
|
||||||
void thawCoin(int index) => thawCoinNative(index);
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'package:ffi/ffi.dart';
|
|
||||||
|
|
||||||
String convertUTF8ToString({required Pointer<Utf8> pointer}) {
|
|
||||||
final str = pointer.toDartString();
|
|
||||||
calloc.free(pointer);
|
|
||||||
return str;
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
final DynamicLibrary moneroApi = Platform.isAndroid
|
|
||||||
? DynamicLibrary.open("libcw_monero.so")
|
|
||||||
: DynamicLibrary.open("cw_monero.framework/cw_monero");
|
|
|
@ -1,160 +0,0 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'package:cw_monero/api/structs/coins_info_row.dart';
|
|
||||||
import 'package:cw_monero/api/structs/pending_transaction.dart';
|
|
||||||
import 'package:cw_monero/api/structs/transaction_info_row.dart';
|
|
||||||
import 'package:cw_monero/api/structs/ut8_box.dart';
|
|
||||||
import 'package:ffi/ffi.dart';
|
|
||||||
|
|
||||||
typedef create_wallet = Int8 Function(
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Int32, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef restore_wallet_from_seed = Int8 Function(
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Int32, Int64, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef restore_wallet_from_keys = Int8 Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>,
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Int32, Int64, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef restore_wallet_from_spend_key = Int8 Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>,
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Int32, Int64, Pointer<Utf8>);
|
|
||||||
|
|
||||||
// typedef restore_wallet_from_device = Int8 Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>,
|
|
||||||
// Int32, Int64, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef is_wallet_exist = Int8 Function(Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef load_wallet = Int8 Function(Pointer<Utf8>, Pointer<Utf8>, Int8);
|
|
||||||
|
|
||||||
typedef error_string = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef get_filename = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef get_seed = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef get_address = Pointer<Utf8> Function(Int32, Int32);
|
|
||||||
|
|
||||||
typedef get_full_balanace = Int64 Function(Int32);
|
|
||||||
|
|
||||||
typedef get_unlocked_balanace = Int64 Function(Int32);
|
|
||||||
|
|
||||||
typedef get_current_height = Int64 Function();
|
|
||||||
|
|
||||||
typedef get_node_height = Int64 Function();
|
|
||||||
|
|
||||||
typedef is_connected = Int8 Function();
|
|
||||||
|
|
||||||
typedef setup_node = Int8 Function(
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>?, Pointer<Utf8>?, Int8, Int8, Pointer<Utf8>?, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef start_refresh = Void Function();
|
|
||||||
|
|
||||||
typedef connect_to_node = Int8 Function();
|
|
||||||
|
|
||||||
typedef set_refresh_from_block_height = Void Function(Int64);
|
|
||||||
|
|
||||||
typedef set_recovering_from_seed = Void Function(Int8);
|
|
||||||
|
|
||||||
typedef store_c = Void Function(Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef set_password = Int8 Function(Pointer<Utf8> password, Pointer<Utf8Box> error);
|
|
||||||
|
|
||||||
typedef set_listener = Void Function();
|
|
||||||
|
|
||||||
typedef get_syncing_height = Int64 Function();
|
|
||||||
|
|
||||||
typedef is_needed_to_refresh = Int8 Function();
|
|
||||||
|
|
||||||
typedef is_new_transaction_exist = Int8 Function();
|
|
||||||
|
|
||||||
typedef subaddrress_size = Int32 Function();
|
|
||||||
|
|
||||||
typedef subaddrress_refresh = Void Function(Int32);
|
|
||||||
|
|
||||||
typedef subaddress_get_all = Pointer<Int64> Function();
|
|
||||||
|
|
||||||
typedef subaddress_add_new = Void Function(Int32 accountIndex, Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef subaddress_set_label = Void Function(
|
|
||||||
Int32 accountIndex, Int32 addressIndex, Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef account_size = Int32 Function();
|
|
||||||
|
|
||||||
typedef account_refresh = Void Function();
|
|
||||||
|
|
||||||
typedef account_get_all = Pointer<Int64> Function();
|
|
||||||
|
|
||||||
typedef account_add_new = Void Function(Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef account_set_label = Void Function(Int32 accountIndex, Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef transactions_refresh = Void Function();
|
|
||||||
|
|
||||||
typedef get_transaction = Pointer<TransactionInfoRow> Function(Pointer<Utf8> txId);
|
|
||||||
|
|
||||||
typedef get_tx_key = Pointer<Utf8>? Function(Pointer<Utf8> txId);
|
|
||||||
|
|
||||||
typedef transactions_count = Int64 Function();
|
|
||||||
|
|
||||||
typedef transactions_get_all = Pointer<Int64> Function();
|
|
||||||
|
|
||||||
typedef transaction_create = Int8 Function(
|
|
||||||
Pointer<Utf8> address,
|
|
||||||
Pointer<Utf8> paymentId,
|
|
||||||
Pointer<Utf8> amount,
|
|
||||||
Int8 priorityRaw,
|
|
||||||
Int32 subaddrAccount,
|
|
||||||
Pointer<Pointer<Utf8>> preferredInputs,
|
|
||||||
Int32 preferredInputsSize,
|
|
||||||
Pointer<Utf8Box> error,
|
|
||||||
Pointer<PendingTransactionRaw> pendingTransaction);
|
|
||||||
|
|
||||||
typedef transaction_create_mult_dest = Int8 Function(
|
|
||||||
Pointer<Pointer<Utf8>> addresses,
|
|
||||||
Pointer<Utf8> paymentId,
|
|
||||||
Pointer<Pointer<Utf8>> amounts,
|
|
||||||
Int32 size,
|
|
||||||
Int8 priorityRaw,
|
|
||||||
Int32 subaddrAccount,
|
|
||||||
Pointer<Pointer<Utf8>> preferredInputs,
|
|
||||||
Int32 preferredInputsSize,
|
|
||||||
Pointer<Utf8Box> error,
|
|
||||||
Pointer<PendingTransactionRaw> pendingTransaction);
|
|
||||||
|
|
||||||
typedef transaction_commit = Int8 Function(Pointer<PendingTransactionRaw>, Pointer<Utf8Box>);
|
|
||||||
|
|
||||||
typedef secret_view_key = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef public_view_key = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef secret_spend_key = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef public_spend_key = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef close_current_wallet = Void Function();
|
|
||||||
|
|
||||||
typedef on_startup = Void Function();
|
|
||||||
|
|
||||||
typedef rescan_blockchain = Void Function();
|
|
||||||
|
|
||||||
typedef get_subaddress_label = Pointer<Utf8> Function(Int32 accountIndex, Int32 addressIndex);
|
|
||||||
|
|
||||||
typedef set_trusted_daemon = Void Function(Int8 trusted);
|
|
||||||
|
|
||||||
typedef trusted_daemon = Int8 Function();
|
|
||||||
|
|
||||||
typedef refresh_coins = Void Function(Int32 accountIndex);
|
|
||||||
|
|
||||||
typedef coins_count = Int64 Function();
|
|
||||||
|
|
||||||
// typedef coins_from_txid = Pointer<CoinsInfoRow> Function(Pointer<Utf8> txid);
|
|
||||||
|
|
||||||
typedef coin = Pointer<CoinsInfoRow> Function(Int32 index);
|
|
||||||
|
|
||||||
typedef freeze_coin = Void Function(Int32 index);
|
|
||||||
|
|
||||||
typedef thaw_coin = Void Function(Int32 index);
|
|
||||||
|
|
||||||
typedef sign_message = Pointer<Utf8> Function(Pointer<Utf8> message, Pointer<Utf8> address);
|
|
||||||
|
|
||||||
typedef get_cache_attribute = Pointer<Utf8> Function(Pointer<Utf8> name);
|
|
||||||
|
|
||||||
typedef set_cache_attribute = Int8 Function(Pointer<Utf8> name, Pointer<Utf8> value);
|
|
|
@ -1,25 +1,3 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'package:ffi/ffi.dart';
|
|
||||||
|
|
||||||
class PendingTransactionRaw extends Struct {
|
|
||||||
@Int64()
|
|
||||||
external int amount;
|
|
||||||
|
|
||||||
@Int64()
|
|
||||||
external int fee;
|
|
||||||
|
|
||||||
external Pointer<Utf8> hash;
|
|
||||||
|
|
||||||
external Pointer<Utf8> hex;
|
|
||||||
|
|
||||||
external Pointer<Utf8> txKey;
|
|
||||||
|
|
||||||
String getHash() => hash.toDartString();
|
|
||||||
|
|
||||||
String getHex() => hex.toDartString();
|
|
||||||
|
|
||||||
String getKey() => txKey.toDartString();
|
|
||||||
}
|
|
||||||
|
|
||||||
class PendingTransactionDescription {
|
class PendingTransactionDescription {
|
||||||
PendingTransactionDescription({
|
PendingTransactionDescription({
|
||||||
|
|
|
@ -1,38 +1,23 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'package:ffi/ffi.dart';
|
import 'package:cw_monero/api/account_list.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:cw_monero/api/signatures.dart';
|
|
||||||
import 'package:cw_monero/api/types.dart';
|
|
||||||
import 'package:cw_monero/api/monero_api.dart';
|
|
||||||
import 'package:cw_monero/api/structs/subaddress_row.dart';
|
|
||||||
import 'package:cw_monero/api/wallet.dart';
|
import 'package:cw_monero/api/wallet.dart';
|
||||||
|
import 'package:monero/monero.dart' as monero;
|
||||||
final subaddressSizeNative = moneroApi
|
|
||||||
.lookup<NativeFunction<subaddrress_size>>('subaddrress_size')
|
|
||||||
.asFunction<SubaddressSize>();
|
|
||||||
|
|
||||||
final subaddressRefreshNative = moneroApi
|
|
||||||
.lookup<NativeFunction<subaddrress_refresh>>('subaddress_refresh')
|
|
||||||
.asFunction<SubaddressRefresh>();
|
|
||||||
|
|
||||||
final subaddrressGetAllNative = moneroApi
|
|
||||||
.lookup<NativeFunction<subaddress_get_all>>('subaddrress_get_all')
|
|
||||||
.asFunction<SubaddressGetAll>();
|
|
||||||
|
|
||||||
final subaddrressAddNewNative = moneroApi
|
|
||||||
.lookup<NativeFunction<subaddress_add_new>>('subaddress_add_row')
|
|
||||||
.asFunction<SubaddressAddNew>();
|
|
||||||
|
|
||||||
final subaddrressSetLabelNative = moneroApi
|
|
||||||
.lookup<NativeFunction<subaddress_set_label>>('subaddress_set_label')
|
|
||||||
.asFunction<SubaddressSetLabel>();
|
|
||||||
|
|
||||||
bool isUpdating = false;
|
bool isUpdating = false;
|
||||||
|
|
||||||
|
class SubaddressInfoMetadata {
|
||||||
|
SubaddressInfoMetadata({
|
||||||
|
required this.accountIndex,
|
||||||
|
});
|
||||||
|
int accountIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubaddressInfoMetadata? subaddress = null;
|
||||||
|
|
||||||
void refreshSubaddresses({required int accountIndex}) {
|
void refreshSubaddresses({required int accountIndex}) {
|
||||||
try {
|
try {
|
||||||
isUpdating = true;
|
isUpdating = true;
|
||||||
subaddressRefreshNative(accountIndex);
|
subaddress = SubaddressInfoMetadata(accountIndex: accountIndex);
|
||||||
isUpdating = false;
|
isUpdating = false;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
isUpdating = false;
|
isUpdating = false;
|
||||||
|
@ -40,28 +25,39 @@ void refreshSubaddresses({required int accountIndex}) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<SubaddressRow> getAllSubaddresses() {
|
class Subaddress {
|
||||||
final size = subaddressSizeNative();
|
Subaddress({
|
||||||
final subaddressAddressesPointer = subaddrressGetAllNative();
|
required this.addressIndex,
|
||||||
final subaddressAddresses = subaddressAddressesPointer.asTypedList(size);
|
required this.accountIndex,
|
||||||
|
});
|
||||||
|
String get address => monero.Wallet_address(
|
||||||
|
wptr!,
|
||||||
|
accountIndex: accountIndex,
|
||||||
|
addressIndex: addressIndex,
|
||||||
|
);
|
||||||
|
final int addressIndex;
|
||||||
|
final int accountIndex;
|
||||||
|
String get label => monero.Wallet_getSubaddressLabel(wptr!, accountIndex: accountIndex, addressIndex: addressIndex);
|
||||||
|
}
|
||||||
|
|
||||||
return subaddressAddresses
|
List<Subaddress> getAllSubaddresses() {
|
||||||
.map((addr) => Pointer<SubaddressRow>.fromAddress(addr).ref)
|
final size = monero.Wallet_numSubaddresses(wptr!, accountIndex: subaddress!.accountIndex);
|
||||||
.toList();
|
return List.generate(size, (index) {
|
||||||
|
return Subaddress(
|
||||||
|
accountIndex: subaddress!.accountIndex,
|
||||||
|
addressIndex: index,
|
||||||
|
);
|
||||||
|
}).reversed.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void addSubaddressSync({required int accountIndex, required String label}) {
|
void addSubaddressSync({required int accountIndex, required String label}) {
|
||||||
final labelPointer = label.toNativeUtf8();
|
monero.Wallet_addSubaddress(wptr!, accountIndex: accountIndex, label: label);
|
||||||
subaddrressAddNewNative(accountIndex, labelPointer);
|
refreshSubaddresses(accountIndex: accountIndex);
|
||||||
calloc.free(labelPointer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLabelForSubaddressSync(
|
void setLabelForSubaddressSync(
|
||||||
{required int accountIndex, required int addressIndex, required String label}) {
|
{required int accountIndex, required int addressIndex, required String label}) {
|
||||||
final labelPointer = label.toNativeUtf8();
|
monero.Wallet_setSubaddressLabel(wptr!, accountIndex: accountIndex, addressIndex: addressIndex, label: label);
|
||||||
|
|
||||||
subaddrressSetLabelNative(accountIndex, addressIndex, labelPointer);
|
|
||||||
calloc.free(labelPointer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _addSubaddress(Map<String, dynamic> args) {
|
void _addSubaddress(Map<String, dynamic> args) {
|
||||||
|
@ -81,14 +77,13 @@ void _setLabelForSubaddress(Map<String, dynamic> args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addSubaddress({required int accountIndex, required String label}) async {
|
Future<void> addSubaddress({required int accountIndex, required String label}) async {
|
||||||
await compute<Map<String, Object>, void>(
|
_addSubaddress({'accountIndex': accountIndex, 'label': label});
|
||||||
_addSubaddress, {'accountIndex': accountIndex, 'label': label});
|
|
||||||
await store();
|
await store();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setLabelForSubaddress(
|
Future<void> setLabelForSubaddress(
|
||||||
{required int accountIndex, required int addressIndex, required String label}) async {
|
{required int accountIndex, required int addressIndex, required String label}) async {
|
||||||
await compute<Map<String, Object>, void>(_setLabelForSubaddress, {
|
_setLabelForSubaddress({
|
||||||
'accountIndex': accountIndex,
|
'accountIndex': accountIndex,
|
||||||
'addressIndex': addressIndex,
|
'addressIndex': addressIndex,
|
||||||
'label': label
|
'label': label
|
||||||
|
|
|
@ -1,138 +1,132 @@
|
||||||
|
|
||||||
import 'dart:ffi';
|
import 'dart:ffi';
|
||||||
|
import 'dart:isolate';
|
||||||
|
|
||||||
import 'package:cw_monero/api/convert_utf8_to_string.dart';
|
import 'package:cw_monero/api/account_list.dart';
|
||||||
import 'package:cw_monero/api/exceptions/creation_transaction_exception.dart';
|
import 'package:cw_monero/api/exceptions/creation_transaction_exception.dart';
|
||||||
import 'package:cw_monero/api/monero_api.dart';
|
|
||||||
import 'package:cw_monero/api/monero_output.dart';
|
import 'package:cw_monero/api/monero_output.dart';
|
||||||
import 'package:cw_monero/api/signatures.dart';
|
|
||||||
import 'package:cw_monero/api/structs/pending_transaction.dart';
|
import 'package:cw_monero/api/structs/pending_transaction.dart';
|
||||||
import 'package:cw_monero/api/structs/transaction_info_row.dart';
|
|
||||||
import 'package:cw_monero/api/structs/ut8_box.dart';
|
|
||||||
import 'package:cw_monero/api/types.dart';
|
|
||||||
import 'package:ffi/ffi.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:monero/monero.dart' as monero;
|
||||||
|
import 'package:monero/src/generated_bindings_monero.g.dart' as monero_gen;
|
||||||
|
|
||||||
final transactionsRefreshNative = moneroApi
|
|
||||||
.lookup<NativeFunction<transactions_refresh>>('transactions_refresh')
|
|
||||||
.asFunction<TransactionsRefresh>();
|
|
||||||
|
|
||||||
final transactionsCountNative = moneroApi
|
|
||||||
.lookup<NativeFunction<transactions_count>>('transactions_count')
|
|
||||||
.asFunction<TransactionsCount>();
|
|
||||||
|
|
||||||
final transactionsGetAllNative = moneroApi
|
|
||||||
.lookup<NativeFunction<transactions_get_all>>('transactions_get_all')
|
|
||||||
.asFunction<TransactionsGetAll>();
|
|
||||||
|
|
||||||
final transactionCreateNative = moneroApi
|
|
||||||
.lookup<NativeFunction<transaction_create>>('transaction_create')
|
|
||||||
.asFunction<TransactionCreate>();
|
|
||||||
|
|
||||||
final transactionCreateMultDestNative = moneroApi
|
|
||||||
.lookup<NativeFunction<transaction_create_mult_dest>>('transaction_create_mult_dest')
|
|
||||||
.asFunction<TransactionCreateMultDest>();
|
|
||||||
|
|
||||||
final transactionCommitNative = moneroApi
|
|
||||||
.lookup<NativeFunction<transaction_commit>>('transaction_commit')
|
|
||||||
.asFunction<TransactionCommit>();
|
|
||||||
|
|
||||||
final getTxKeyNative =
|
|
||||||
moneroApi.lookup<NativeFunction<get_tx_key>>('get_tx_key').asFunction<GetTxKey>();
|
|
||||||
|
|
||||||
final getTransactionNative = moneroApi
|
|
||||||
.lookup<NativeFunction<get_transaction>>('get_transaction')
|
|
||||||
.asFunction<GetTransaction>();
|
|
||||||
|
|
||||||
String getTxKey(String txId) {
|
String getTxKey(String txId) {
|
||||||
final txIdPointer = txId.toNativeUtf8();
|
return monero.Wallet_getTxKey(wptr!, txid: txId);
|
||||||
final keyPointer = getTxKeyNative(txIdPointer);
|
}
|
||||||
|
|
||||||
calloc.free(txIdPointer);
|
monero.TransactionHistory? txhistory;
|
||||||
|
|
||||||
if (keyPointer != null) {
|
void refreshTransactions() {
|
||||||
return convertUTF8ToString(pointer: keyPointer);
|
txhistory = monero.Wallet_history(wptr!);
|
||||||
|
monero.TransactionHistory_refresh(txhistory!);
|
||||||
|
}
|
||||||
|
|
||||||
|
int countOfTransactions() => monero.TransactionHistory_count(txhistory!);
|
||||||
|
|
||||||
|
List<Transaction> getAllTransactions() {
|
||||||
|
List<Transaction> dummyTxs = [];
|
||||||
|
|
||||||
|
txhistory = monero.Wallet_history(wptr!);
|
||||||
|
monero.TransactionHistory_refresh(txhistory!);
|
||||||
|
int size = countOfTransactions();
|
||||||
|
final list = List.generate(size, (index) => Transaction(txInfo: monero.TransactionHistory_transaction(txhistory!, index: index)))..addAll(dummyTxs);
|
||||||
|
|
||||||
|
final accts = monero.Wallet_numSubaddressAccounts(wptr!);
|
||||||
|
for (var i = 0; i < accts; i++) {
|
||||||
|
final fullBalance = monero.Wallet_balance(wptr!, accountIndex: i);
|
||||||
|
final availBalance = monero.Wallet_unlockedBalance(wptr!, accountIndex: i);
|
||||||
|
if (fullBalance > availBalance) {
|
||||||
|
if (list.where((element) => element.accountIndex == i && element.isConfirmed == false).isNotEmpty) {
|
||||||
|
dummyTxs.add(
|
||||||
|
Transaction.dummy(
|
||||||
|
displayLabel: "",
|
||||||
|
description: "",
|
||||||
|
fee: 0,
|
||||||
|
confirmations: 0,
|
||||||
|
blockheight: 0,
|
||||||
|
accountIndex: i,
|
||||||
|
paymentId: "",
|
||||||
|
amount: fullBalance - availBalance,
|
||||||
|
isSpend: false,
|
||||||
|
hash: "pending",
|
||||||
|
key: "pending",
|
||||||
|
txInfo: Pointer.fromAddress(0),
|
||||||
|
)..timeStamp = DateTime.now()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return '';
|
}
|
||||||
|
list.addAll(dummyTxs);
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
void refreshTransactions() => transactionsRefreshNative();
|
Transaction getTransaction(String txId) {
|
||||||
|
return Transaction(txInfo: monero.TransactionHistory_transactionById(txhistory!, txid: txId));
|
||||||
int countOfTransactions() => transactionsCountNative();
|
|
||||||
|
|
||||||
List<TransactionInfoRow> getAllTransactions() {
|
|
||||||
final size = transactionsCountNative();
|
|
||||||
final transactionsPointer = transactionsGetAllNative();
|
|
||||||
final transactionsAddresses = transactionsPointer.asTypedList(size);
|
|
||||||
|
|
||||||
return transactionsAddresses
|
|
||||||
.map((addr) => Pointer<TransactionInfoRow>.fromAddress(addr).ref)
|
|
||||||
.toList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TransactionInfoRow getTransaction(String txId) {
|
Future<PendingTransactionDescription> createTransactionSync(
|
||||||
final txIdPointer = txId.toNativeUtf8();
|
|
||||||
return getTransactionNative(txIdPointer).ref;
|
|
||||||
}
|
|
||||||
|
|
||||||
PendingTransactionDescription createTransactionSync(
|
|
||||||
{required String address,
|
{required String address,
|
||||||
required String paymentId,
|
required String paymentId,
|
||||||
required int priorityRaw,
|
required int priorityRaw,
|
||||||
String? amount,
|
String? amount,
|
||||||
int accountIndex = 0,
|
int accountIndex = 0,
|
||||||
List<String> preferredInputs = const []}) {
|
List<String> preferredInputs = const []}) async {
|
||||||
final addressPointer = address.toNativeUtf8();
|
|
||||||
final paymentIdPointer = paymentId.toNativeUtf8();
|
|
||||||
final amountPointer = amount != null ? amount.toNativeUtf8() : nullptr;
|
|
||||||
|
|
||||||
final int preferredInputsSize = preferredInputs.length;
|
final amt = amount == null ? 0 : monero.Wallet_amountFromString(amount);
|
||||||
final List<Pointer<Utf8>> preferredInputsPointers =
|
|
||||||
preferredInputs.map((output) => output.toNativeUtf8()).toList();
|
|
||||||
final Pointer<Pointer<Utf8>> preferredInputsPointerPointer = calloc(preferredInputsSize);
|
|
||||||
|
|
||||||
for (int i = 0; i < preferredInputsSize; i++) {
|
final address_ = address.toNativeUtf8();
|
||||||
preferredInputsPointerPointer[i] = preferredInputsPointers[i];
|
final paymentId_ = paymentId.toNativeUtf8();
|
||||||
}
|
final preferredInputs_ = preferredInputs.join(monero.defaultSeparatorStr).toNativeUtf8();
|
||||||
|
|
||||||
final errorMessagePointer = calloc<Utf8Box>();
|
final waddr = wptr!.address;
|
||||||
final pendingTransactionRawPointer = calloc<PendingTransactionRaw>();
|
final addraddr = address_.address;
|
||||||
final created = transactionCreateNative(
|
final paymentIdAddr = paymentId_.address;
|
||||||
addressPointer,
|
final preferredInputsAddr = preferredInputs_.address;
|
||||||
paymentIdPointer,
|
final spaddr = monero.defaultSeparator.address;
|
||||||
amountPointer,
|
final pendingTx = Pointer<Void>.fromAddress(await Isolate.run(() {
|
||||||
|
final tx = monero_gen.MoneroC(DynamicLibrary.open(monero.libPath)).MONERO_Wallet_createTransaction(
|
||||||
|
Pointer.fromAddress(waddr),
|
||||||
|
Pointer.fromAddress(addraddr).cast(),
|
||||||
|
Pointer.fromAddress(paymentIdAddr).cast(),
|
||||||
|
amt,
|
||||||
|
1,
|
||||||
priorityRaw,
|
priorityRaw,
|
||||||
accountIndex,
|
accountIndex,
|
||||||
preferredInputsPointerPointer,
|
Pointer.fromAddress(preferredInputsAddr).cast(),
|
||||||
preferredInputsSize,
|
Pointer.fromAddress(spaddr),
|
||||||
errorMessagePointer,
|
);
|
||||||
pendingTransactionRawPointer) !=
|
return tx.address;
|
||||||
0;
|
}));
|
||||||
|
calloc.free(address_);
|
||||||
calloc.free(preferredInputsPointerPointer);
|
calloc.free(paymentId_);
|
||||||
|
calloc.free(preferredInputs_);
|
||||||
preferredInputsPointers.forEach((element) => calloc.free(element));
|
final String? error = (() {
|
||||||
|
final status = monero.PendingTransaction_status(pendingTx);
|
||||||
calloc.free(addressPointer);
|
if (status == 0) {
|
||||||
calloc.free(paymentIdPointer);
|
return null;
|
||||||
|
|
||||||
if (amountPointer != nullptr) {
|
|
||||||
calloc.free(amountPointer);
|
|
||||||
}
|
}
|
||||||
|
return monero.PendingTransaction_errorString(pendingTx);
|
||||||
|
})();
|
||||||
|
|
||||||
if (!created) {
|
if (error != null) {
|
||||||
final message = errorMessagePointer.ref.getValue();
|
final message = error;
|
||||||
calloc.free(errorMessagePointer);
|
|
||||||
throw CreationTransactionException(message: message);
|
throw CreationTransactionException(message: message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final rAmt = monero.PendingTransaction_amount(pendingTx);
|
||||||
|
final rFee = monero.PendingTransaction_fee(pendingTx);
|
||||||
|
final rHash = monero.PendingTransaction_txid(pendingTx, '');
|
||||||
|
final rTxKey = rHash;
|
||||||
|
|
||||||
return PendingTransactionDescription(
|
return PendingTransactionDescription(
|
||||||
amount: pendingTransactionRawPointer.ref.amount,
|
amount: rAmt,
|
||||||
fee: pendingTransactionRawPointer.ref.fee,
|
fee: rFee,
|
||||||
hash: pendingTransactionRawPointer.ref.getHash(),
|
hash: rHash,
|
||||||
hex: pendingTransactionRawPointer.ref.getHex(),
|
hex: '',
|
||||||
txKey: pendingTransactionRawPointer.ref.getKey(),
|
txKey: rTxKey,
|
||||||
pointerAddress: pendingTransactionRawPointer.address);
|
pointerAddress: pendingTx.address,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
PendingTransactionDescription createTransactionMultDestSync(
|
PendingTransactionDescription createTransactionMultDestSync(
|
||||||
|
@ -141,84 +135,50 @@ PendingTransactionDescription createTransactionMultDestSync(
|
||||||
required int priorityRaw,
|
required int priorityRaw,
|
||||||
int accountIndex = 0,
|
int accountIndex = 0,
|
||||||
List<String> preferredInputs = const []}) {
|
List<String> preferredInputs = const []}) {
|
||||||
final int size = outputs.length;
|
|
||||||
final List<Pointer<Utf8>> addressesPointers =
|
|
||||||
outputs.map((output) => output.address.toNativeUtf8()).toList();
|
|
||||||
final Pointer<Pointer<Utf8>> addressesPointerPointer = calloc(size);
|
|
||||||
final List<Pointer<Utf8>> amountsPointers =
|
|
||||||
outputs.map((output) => output.amount.toNativeUtf8()).toList();
|
|
||||||
final Pointer<Pointer<Utf8>> amountsPointerPointer = calloc(size);
|
|
||||||
|
|
||||||
for (int i = 0; i < size; i++) {
|
final txptr = monero.Wallet_createTransactionMultDest(
|
||||||
addressesPointerPointer[i] = addressesPointers[i];
|
wptr!,
|
||||||
amountsPointerPointer[i] = amountsPointers[i];
|
dstAddr: outputs.map((e) => e.address).toList(),
|
||||||
|
isSweepAll: false,
|
||||||
|
amounts: outputs.map((e) => monero.Wallet_amountFromString(e.amount)).toList(),
|
||||||
|
mixinCount: 0,
|
||||||
|
pendingTransactionPriority: priorityRaw,
|
||||||
|
subaddr_account: accountIndex,
|
||||||
|
);
|
||||||
|
if (monero.PendingTransaction_status(txptr) != 0) {
|
||||||
|
throw CreationTransactionException(message: monero.PendingTransaction_errorString(txptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
final int preferredInputsSize = preferredInputs.length;
|
|
||||||
final List<Pointer<Utf8>> preferredInputsPointers =
|
|
||||||
preferredInputs.map((output) => output.toNativeUtf8()).toList();
|
|
||||||
final Pointer<Pointer<Utf8>> preferredInputsPointerPointer = calloc(preferredInputsSize);
|
|
||||||
|
|
||||||
for (int i = 0; i < preferredInputsSize; i++) {
|
|
||||||
preferredInputsPointerPointer[i] = preferredInputsPointers[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
final paymentIdPointer = paymentId.toNativeUtf8();
|
|
||||||
final errorMessagePointer = calloc<Utf8Box>();
|
|
||||||
final pendingTransactionRawPointer = calloc<PendingTransactionRaw>();
|
|
||||||
final created = transactionCreateMultDestNative(
|
|
||||||
addressesPointerPointer,
|
|
||||||
paymentIdPointer,
|
|
||||||
amountsPointerPointer,
|
|
||||||
size,
|
|
||||||
priorityRaw,
|
|
||||||
accountIndex,
|
|
||||||
preferredInputsPointerPointer,
|
|
||||||
preferredInputsSize,
|
|
||||||
errorMessagePointer,
|
|
||||||
pendingTransactionRawPointer) !=
|
|
||||||
0;
|
|
||||||
|
|
||||||
calloc.free(addressesPointerPointer);
|
|
||||||
calloc.free(amountsPointerPointer);
|
|
||||||
calloc.free(preferredInputsPointerPointer);
|
|
||||||
|
|
||||||
addressesPointers.forEach((element) => calloc.free(element));
|
|
||||||
amountsPointers.forEach((element) => calloc.free(element));
|
|
||||||
preferredInputsPointers.forEach((element) => calloc.free(element));
|
|
||||||
|
|
||||||
calloc.free(paymentIdPointer);
|
|
||||||
|
|
||||||
if (!created) {
|
|
||||||
final message = errorMessagePointer.ref.getValue();
|
|
||||||
calloc.free(errorMessagePointer);
|
|
||||||
throw CreationTransactionException(message: message);
|
|
||||||
}
|
|
||||||
|
|
||||||
return PendingTransactionDescription(
|
return PendingTransactionDescription(
|
||||||
amount: pendingTransactionRawPointer.ref.amount,
|
amount: monero.PendingTransaction_amount(txptr),
|
||||||
fee: pendingTransactionRawPointer.ref.fee,
|
fee: monero.PendingTransaction_fee(txptr),
|
||||||
hash: pendingTransactionRawPointer.ref.getHash(),
|
hash: monero.PendingTransaction_txid(txptr, ''),
|
||||||
hex: pendingTransactionRawPointer.ref.getHex(),
|
hex: monero.PendingTransaction_txid(txptr, ''),
|
||||||
txKey: pendingTransactionRawPointer.ref.getKey(),
|
txKey: monero.PendingTransaction_txid(txptr, ''),
|
||||||
pointerAddress: pendingTransactionRawPointer.address);
|
pointerAddress: txptr.address,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void commitTransactionFromPointerAddress({required int address}) =>
|
void commitTransactionFromPointerAddress({required int address}) =>
|
||||||
commitTransaction(transactionPointer: Pointer<PendingTransactionRaw>.fromAddress(address));
|
commitTransaction(transactionPointer: monero.PendingTransaction.fromAddress(address));
|
||||||
|
|
||||||
void commitTransaction({required Pointer<PendingTransactionRaw> transactionPointer}) {
|
void commitTransaction({required monero.PendingTransaction transactionPointer}) {
|
||||||
final errorMessagePointer = calloc<Utf8Box>();
|
|
||||||
final isCommited = transactionCommitNative(transactionPointer, errorMessagePointer) != 0;
|
|
||||||
|
|
||||||
if (!isCommited) {
|
final txCommit = monero.PendingTransaction_commit(transactionPointer, filename: '', overwrite: false);
|
||||||
final message = errorMessagePointer.ref.getValue();
|
|
||||||
calloc.free(errorMessagePointer);
|
final String? error = (() {
|
||||||
throw CreationTransactionException(message: message);
|
final status = monero.PendingTransaction_status(transactionPointer.cast());
|
||||||
|
if (status == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return monero.Wallet_errorString(wptr!);
|
||||||
|
})();
|
||||||
|
|
||||||
|
if (error != null) {
|
||||||
|
throw CreationTransactionException(message: error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PendingTransactionDescription _createTransactionSync(Map args) {
|
Future<PendingTransactionDescription> _createTransactionSync(Map args) async {
|
||||||
final address = args['address'] as String;
|
final address = args['address'] as String;
|
||||||
final paymentId = args['paymentId'] as String;
|
final paymentId = args['paymentId'] as String;
|
||||||
final amount = args['amount'] as String?;
|
final amount = args['amount'] as String?;
|
||||||
|
@ -256,8 +216,8 @@ Future<PendingTransactionDescription> createTransaction(
|
||||||
String? amount,
|
String? amount,
|
||||||
String paymentId = '',
|
String paymentId = '',
|
||||||
int accountIndex = 0,
|
int accountIndex = 0,
|
||||||
List<String> preferredInputs = const []}) =>
|
List<String> preferredInputs = const []}) async =>
|
||||||
compute(_createTransactionSync, {
|
_createTransactionSync({
|
||||||
'address': address,
|
'address': address,
|
||||||
'paymentId': paymentId,
|
'paymentId': paymentId,
|
||||||
'amount': amount,
|
'amount': amount,
|
||||||
|
@ -271,11 +231,94 @@ Future<PendingTransactionDescription> createTransactionMultDest(
|
||||||
required int priorityRaw,
|
required int priorityRaw,
|
||||||
String paymentId = '',
|
String paymentId = '',
|
||||||
int accountIndex = 0,
|
int accountIndex = 0,
|
||||||
List<String> preferredInputs = const []}) =>
|
List<String> preferredInputs = const []}) async =>
|
||||||
compute(_createTransactionMultDestSync, {
|
_createTransactionMultDestSync({
|
||||||
'outputs': outputs,
|
'outputs': outputs,
|
||||||
'paymentId': paymentId,
|
'paymentId': paymentId,
|
||||||
'priorityRaw': priorityRaw,
|
'priorityRaw': priorityRaw,
|
||||||
'accountIndex': accountIndex,
|
'accountIndex': accountIndex,
|
||||||
'preferredInputs': preferredInputs
|
'preferredInputs': preferredInputs
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
class Transaction {
|
||||||
|
final String displayLabel;
|
||||||
|
String subaddressLabel = monero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
|
||||||
|
late final String address = monero.Wallet_address(
|
||||||
|
wptr!,
|
||||||
|
accountIndex: 0,
|
||||||
|
addressIndex: 0,
|
||||||
|
);
|
||||||
|
final String description;
|
||||||
|
final int fee;
|
||||||
|
final int confirmations;
|
||||||
|
late final bool isPending = confirmations < 10;
|
||||||
|
final int blockheight;
|
||||||
|
final int addressIndex = 0;
|
||||||
|
final int accountIndex;
|
||||||
|
final String paymentId;
|
||||||
|
final int amount;
|
||||||
|
final bool isSpend;
|
||||||
|
late DateTime timeStamp;
|
||||||
|
late final bool isConfirmed = !isPending;
|
||||||
|
final String hash;
|
||||||
|
final String key;
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
"displayLabel": displayLabel,
|
||||||
|
"subaddressLabel": subaddressLabel,
|
||||||
|
"address": address,
|
||||||
|
"description": description,
|
||||||
|
"fee": fee,
|
||||||
|
"confirmations": confirmations,
|
||||||
|
"isPending": isPending,
|
||||||
|
"blockheight": blockheight,
|
||||||
|
"accountIndex": accountIndex,
|
||||||
|
"addressIndex": addressIndex,
|
||||||
|
"paymentId": paymentId,
|
||||||
|
"amount": amount,
|
||||||
|
"isSpend": isSpend,
|
||||||
|
"timeStamp": timeStamp.toIso8601String(),
|
||||||
|
"isConfirmed": isConfirmed,
|
||||||
|
"hash": hash,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// S finalubAddress? subAddress;
|
||||||
|
// List<Transfer> transfers = [];
|
||||||
|
// final int txIndex;
|
||||||
|
final monero.TransactionInfo txInfo;
|
||||||
|
Transaction({
|
||||||
|
required this.txInfo,
|
||||||
|
}) : displayLabel = monero.TransactionInfo_label(txInfo),
|
||||||
|
hash = monero.TransactionInfo_hash(txInfo),
|
||||||
|
timeStamp = DateTime.fromMillisecondsSinceEpoch(
|
||||||
|
monero.TransactionInfo_timestamp(txInfo) * 1000,
|
||||||
|
),
|
||||||
|
isSpend = monero.TransactionInfo_direction(txInfo) ==
|
||||||
|
monero.TransactionInfo_Direction.Out,
|
||||||
|
amount = monero.TransactionInfo_amount(txInfo),
|
||||||
|
paymentId = monero.TransactionInfo_paymentId(txInfo),
|
||||||
|
accountIndex = monero.TransactionInfo_subaddrAccount(txInfo),
|
||||||
|
blockheight = monero.TransactionInfo_blockHeight(txInfo),
|
||||||
|
confirmations = monero.TransactionInfo_confirmations(txInfo),
|
||||||
|
fee = monero.TransactionInfo_fee(txInfo),
|
||||||
|
description = monero.TransactionInfo_description(txInfo),
|
||||||
|
key = monero.Wallet_getTxKey(wptr!, txid: monero.TransactionInfo_hash(txInfo));
|
||||||
|
|
||||||
|
Transaction.dummy({
|
||||||
|
required this.displayLabel,
|
||||||
|
required this.description,
|
||||||
|
required this.fee,
|
||||||
|
required this.confirmations,
|
||||||
|
required this.blockheight,
|
||||||
|
required this.accountIndex,
|
||||||
|
required this.paymentId,
|
||||||
|
required this.amount,
|
||||||
|
required this.isSpend,
|
||||||
|
required this.hash,
|
||||||
|
required this.key,
|
||||||
|
required this.txInfo
|
||||||
|
});
|
||||||
|
}
|
|
@ -1,160 +0,0 @@
|
||||||
import 'dart:ffi';
|
|
||||||
import 'package:cw_monero/api/structs/coins_info_row.dart';
|
|
||||||
import 'package:cw_monero/api/structs/pending_transaction.dart';
|
|
||||||
import 'package:cw_monero/api/structs/transaction_info_row.dart';
|
|
||||||
import 'package:cw_monero/api/structs/ut8_box.dart';
|
|
||||||
import 'package:ffi/ffi.dart';
|
|
||||||
|
|
||||||
typedef CreateWallet = int Function(
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, int, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef RestoreWalletFromSeed = int Function(
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, int, int, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef RestoreWalletFromKeys = int Function(Pointer<Utf8>, Pointer<Utf8>,
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, int, int, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef RestoreWalletFromSpendKey = int Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>,
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>, int, int, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef RestoreWalletFromDevice = int Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>,
|
|
||||||
int, int, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef IsWalletExist = int Function(Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef LoadWallet = int Function(Pointer<Utf8>, Pointer<Utf8>, int);
|
|
||||||
|
|
||||||
typedef ErrorString = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef GetFilename = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef GetSeed = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef GetAddress = Pointer<Utf8> Function(int, int);
|
|
||||||
|
|
||||||
typedef GetFullBalance = int Function(int);
|
|
||||||
|
|
||||||
typedef GetUnlockedBalance = int Function(int);
|
|
||||||
|
|
||||||
typedef GetCurrentHeight = int Function();
|
|
||||||
|
|
||||||
typedef GetNodeHeight = int Function();
|
|
||||||
|
|
||||||
typedef IsConnected = int Function();
|
|
||||||
|
|
||||||
typedef SetupNode = int Function(
|
|
||||||
Pointer<Utf8>, Pointer<Utf8>?, Pointer<Utf8>?, int, int, Pointer<Utf8>?, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef StartRefresh = void Function();
|
|
||||||
|
|
||||||
typedef ConnectToNode = int Function();
|
|
||||||
|
|
||||||
typedef SetRefreshFromBlockHeight = void Function(int);
|
|
||||||
|
|
||||||
typedef SetRecoveringFromSeed = void Function(int);
|
|
||||||
|
|
||||||
typedef Store = void Function(Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef SetPassword = int Function(Pointer<Utf8> password, Pointer<Utf8Box> error);
|
|
||||||
|
|
||||||
typedef SetListener = void Function();
|
|
||||||
|
|
||||||
typedef GetSyncingHeight = int Function();
|
|
||||||
|
|
||||||
typedef IsNeededToRefresh = int Function();
|
|
||||||
|
|
||||||
typedef IsNewTransactionExist = int Function();
|
|
||||||
|
|
||||||
typedef SubaddressSize = int Function();
|
|
||||||
|
|
||||||
typedef SubaddressRefresh = void Function(int);
|
|
||||||
|
|
||||||
typedef SubaddressGetAll = Pointer<Int64> Function();
|
|
||||||
|
|
||||||
typedef SubaddressAddNew = void Function(int accountIndex, Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef SubaddressSetLabel = void Function(
|
|
||||||
int accountIndex, int addressIndex, Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef AccountSize = int Function();
|
|
||||||
|
|
||||||
typedef AccountRefresh = void Function();
|
|
||||||
|
|
||||||
typedef AccountGetAll = Pointer<Int64> Function();
|
|
||||||
|
|
||||||
typedef AccountAddNew = void Function(Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef AccountSetLabel = void Function(int accountIndex, Pointer<Utf8> label);
|
|
||||||
|
|
||||||
typedef TransactionsRefresh = void Function();
|
|
||||||
|
|
||||||
typedef GetTransaction = Pointer<TransactionInfoRow> Function(Pointer<Utf8> txId);
|
|
||||||
|
|
||||||
typedef GetTxKey = Pointer<Utf8>? Function(Pointer<Utf8> txId);
|
|
||||||
|
|
||||||
typedef TransactionsCount = int Function();
|
|
||||||
|
|
||||||
typedef TransactionsGetAll = Pointer<Int64> Function();
|
|
||||||
|
|
||||||
typedef TransactionCreate = int Function(
|
|
||||||
Pointer<Utf8> address,
|
|
||||||
Pointer<Utf8> paymentId,
|
|
||||||
Pointer<Utf8> amount,
|
|
||||||
int priorityRaw,
|
|
||||||
int subaddrAccount,
|
|
||||||
Pointer<Pointer<Utf8>> preferredInputs,
|
|
||||||
int preferredInputsSize,
|
|
||||||
Pointer<Utf8Box> error,
|
|
||||||
Pointer<PendingTransactionRaw> pendingTransaction);
|
|
||||||
|
|
||||||
typedef TransactionCreateMultDest = int Function(
|
|
||||||
Pointer<Pointer<Utf8>> addresses,
|
|
||||||
Pointer<Utf8> paymentId,
|
|
||||||
Pointer<Pointer<Utf8>> amounts,
|
|
||||||
int size,
|
|
||||||
int priorityRaw,
|
|
||||||
int subaddrAccount,
|
|
||||||
Pointer<Pointer<Utf8>> preferredInputs,
|
|
||||||
int preferredInputsSize,
|
|
||||||
Pointer<Utf8Box> error,
|
|
||||||
Pointer<PendingTransactionRaw> pendingTransaction);
|
|
||||||
|
|
||||||
typedef TransactionCommit = int Function(Pointer<PendingTransactionRaw>, Pointer<Utf8Box>);
|
|
||||||
|
|
||||||
typedef SecretViewKey = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef PublicViewKey = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef SecretSpendKey = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef PublicSpendKey = Pointer<Utf8> Function();
|
|
||||||
|
|
||||||
typedef CloseCurrentWallet = void Function();
|
|
||||||
|
|
||||||
typedef OnStartup = void Function();
|
|
||||||
|
|
||||||
typedef RescanBlockchainAsync = void Function();
|
|
||||||
|
|
||||||
typedef GetSubaddressLabel = Pointer<Utf8> Function(
|
|
||||||
int accountIndex,
|
|
||||||
int addressIndex);
|
|
||||||
|
|
||||||
typedef SetTrustedDaemon = void Function(int);
|
|
||||||
|
|
||||||
typedef TrustedDaemon = int Function();
|
|
||||||
|
|
||||||
typedef RefreshCoins = void Function(int);
|
|
||||||
|
|
||||||
typedef CoinsCount = int Function();
|
|
||||||
|
|
||||||
typedef GetCoin = Pointer<CoinsInfoRow> Function(int);
|
|
||||||
|
|
||||||
typedef FreezeCoin = void Function(int);
|
|
||||||
|
|
||||||
typedef ThawCoin = void Function(int);
|
|
||||||
|
|
||||||
typedef SignMessage = Pointer<Utf8> Function(Pointer<Utf8>, Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef GetCacheAttribute = Pointer<Utf8> Function(Pointer<Utf8>);
|
|
||||||
|
|
||||||
typedef SetCacheAttribute = int Function(Pointer<Utf8>, Pointer<Utf8>);
|
|