Initial commit

This commit is contained in:
BuildTools 2024-07-14 16:34:24 +01:00 committed by KewbitXMR
parent 43cee79fdb
commit 62a76f9e18
193 changed files with 53657 additions and 0 deletions

43
.gitignore vendored Normal file
View file

@ -0,0 +1,43 @@
# 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
.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

30
.metadata Normal file
View file

@ -0,0 +1,30 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: android
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

25
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,25 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "haveno_flutter_app",
"request": "launch",
"type": "dart"
},
{
"name": "haveno_flutter_app (profile mode)",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "haveno_flutter_app (release mode)",
"request": "launch",
"type": "dart",
"flutterMode": "release"
}
]
}

3
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"cmake.configureOnOpen": false
}

16
README.md Normal file
View file

@ -0,0 +1,16 @@
# haveno_flutter_app
A new Flutter project.
## 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.

31
analysis_options.yaml Normal file
View file

@ -0,0 +1,31 @@
# 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.
analyzer:
errors:
avoid_print: ignore
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.dev/lints.
#
# 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

13
android/.gitignore vendored Normal file
View file

@ -0,0 +1,13 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks

58
android/app/build.gradle Normal file
View file

@ -0,0 +1,58 @@
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader("UTF-8") { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
flutterVersionCode = "1"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
flutterVersionName = "1.0"
}
android {
namespace = "com.example.haveno_flutter_app"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.haveno_flutter_app"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutterVersionCode.toInteger()
versionName = flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.debug
}
}
}
flutter {
source = "../.."
}

View file

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View file

@ -0,0 +1,45 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="haveno_flutter_app"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>

View file

@ -0,0 +1,5 @@
package com.example.haveno_flutter_app
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View file

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

18
android/build.gradle Normal file
View file

@ -0,0 +1,18 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = "../build"
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

View file

@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true

View file

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip

25
android/settings.gradle Normal file
View file

@ -0,0 +1,25 @@
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
}
include ":app"

BIN
assets/haveno-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

3
devtools_options.yaml Normal file
View file

@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

BIN
flutter_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

34
ios/.gitignore vendored Normal file
View file

@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3

View file

@ -0,0 +1,26 @@
<?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>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>

View file

@ -0,0 +1 @@
#include "Generated.xcconfig"

View file

@ -0,0 +1 @@
#include "Generated.xcconfig"

View file

@ -0,0 +1,616 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
331C8080294A63A400263BE5 /* RunnerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
);
buildRules = (
);
dependencies = (
331C8086294A63A400263BE5 /* PBXTargetDependency */,
);
name = RunnerTests;
productName = RunnerTests;
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
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_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
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_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
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_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
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_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
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_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
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_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
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_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
331C8089294A63A400263BE5 /* Release */,
331C808A294A63A400263BE5 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View file

@ -0,0 +1,8 @@
<?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>

View file

@ -0,0 +1,8 @@
<?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>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.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 = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</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 = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.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 = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>

View file

@ -0,0 +1,8 @@
<?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>

View file

@ -0,0 +1,8 @@
<?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>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,13 @@
import Flutter
import UIKit
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

View file

@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

View file

@ -0,0 +1,5 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

49
ios/Runner/Info.plist Normal file
View file

@ -0,0 +1,49 @@
<?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>CFBundleDisplayName</key>
<string>Haveno Flutter App</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>haveno_flutter_app</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1 @@
#import "GeneratedPluginRegistrant.h"

View file

@ -0,0 +1,12 @@
import Flutter
import UIKit
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}

View file

@ -0,0 +1,10 @@
[
{
"code": "BTC",
"label": "Bitcoin"
},
{
"code": "LTC",
"label": "Litecoin"
}
]

View file

View file

@ -0,0 +1,64 @@
{
"nodes": [
"http://xmrnode2fjwmltxetalulcryyvdos437fnyoj5gzg3ecn22uhnwxgyad.onion:18081",
"http://moneronodeuomqv3jcb2jqslmcnrtkiqslv6hwh3cu57ugk6t55xchid.onion:18081",
"http://sneed5kqm3m2jlt2j3shagzz7zmsppicmuf4fmfwryy45kmsrvjfpdid.onion:18089",
"http://monerob2hm5lns5m4maiv3dauroadpofdrpftp5wd2cfqt332ydyeyid.onion:18089",
"http://3qnnb5zicqahxtn7bie6sizdjru3pmtwmzzgwhei7v66s36tafdjp7ad.onion:18081",
"http://l72pup26odlrbhsx543m3f5s4m6opwpkeklvbddddwo6b4qyche7zcyd.onion:18081",
"http://rd4mzz6vxhchnbhz66w6u76632yhgkzypmvpcfbgrfbacmr5ob2f4zqd.onion:18089",
"http://aclc4e2jhhtr44guufbnwk5bzwhaecinax4yip4wr4tjn27sjsfg6zqd.onion:18089",
"http://n7jagir3cwgylxhhwc63hu5ptlj6kunofckf25fv5pizx2rmjvlholid.onion:18089",
"http://monerof5eqykw3hfrjmb66v7r4ft4hlilfzjw5q4huwolttutjuc5dyd.onion:18089",
"http://zqitog3olj5jmeu76jcpthuksplnzlcoucyhska74ny2vdcyeln33bid.onion:18089",
"http://gtbjuomix62tppqmpnb65ak2vqv2fxaca4g3ijmxboy5j6bseu5d4sad.onion:18089",
"http://mexymskdcpunttj3kozziuw62aryumjggulew2kafk7rmvkmegrrgfyd.onion:18081",
"http://fkb5pynm4nr5mb54fw6eep3os7ux5ax7v36jgjcrq7cpilehwd5lgiad.onion:18083",
"http://4egxv4e3idoh2xihko5wkhx5s2i5mmrw3cc3bia3cgc5ttwgqhtgi7ad.onion:18089",
"http://xrft3jrcdrfwvry4aocxcswvwturaqxelesmtdk34j4646tajmc6rxyd.onion:18089",
"http://lrtrju7tz72422sjmwakygfu7xgskaawiqmfulmssfzx7aofatfkmvid.onion:18089",
"http://monerujods7mbghwe6cobdr6ujih6c22zu5rl7zshmizz2udf7v7fsad.onion:18081",
"http://hn3lysds52kplnso5eyiimbmakr67c3owqhakimc7xio5nzb5plbl6yd.onion:18089",
"http://so55gc5hiftcat5xagflyiuyaw3uc7jtj7ornxf757xwxhyea2clvzqd.onion:18089",
"http://fz2lbxvjob6ifeonngaep2xvf2ypxjjn23i3ncblcxjreovev56ubyyd.onion:18089",
"https://libertytmtitynvmnto2k42liys5fenb3wabaozmmmksyrc7jvgmjiqd.onion:18089",
"http://glnoqirjvs4cofkj3zy3ttq2s7fzcj67dfcletshrh6gwpkkhtbulpyd.onion:18089",
"http://libertytmtitynvmnto2k42liys5fenb3wabaozmmmksyrc7jvgmjiqd.onion:18089",
"http://ncbkcouzbqzcskr3dy26bvgzztpt7ywtjd2ly2bpv5c5zfxoht7gthad.onion:18081",
"http://moneroexnovtlp4datcwbgjznnulgm7q34wcl6r4gcvccruhkceb2xyd.onion:18089",
"http://plowsof3t5hogddwabaeiyrno25efmzfxyro2vligremt7sxpsclfaid.onion:18089",
"http://plowsoffjexmxalw73tkjmf422gq6575fc7vicuu4javzn2ynnte6tyd.onion:18089",
"http://ode6i5zdrm4xjqeubacrwmgnihzpfsfvpdf4kvcphhnrqkmrhq5idxyd.onion:18089",
"http://r6ou6dckycorsauaelpej2k4z2e2jkk62pbkskco34anmnkgl2tlaiqd.onion:18081",
"http://ulmlrardljg3r6urejlm6c2tikp3krvkupmdnueahmj33vl5ztez7jqd.onion:18081",
"http://2wi527wss2ysexkmyjveki7ypaikz5x567eiqnnl76om2zuyd4d3dpqd.onion:18081",
"http://43n3jitkea7hvx72xjj5ey2yxhevdlwmv3nail5fp7wzigt6ptega5qd.onion:18089",
"http://sneedxmr3mur3ypoto7o3xzqyvodidto5zlosxeesu4upunax5xnskid.onion:18089",
"https://plowsof3t5hogddwabaeiyrno25efmzfxyro2vligremt7sxpsclfaid.onion:18089",
"http://v5zluoefmjk6c24r3o4qsjzzyux233c5v332vrozu454xoohron5moid.onion:18089",
"http://zkvdadvagi5r757w7ewvpomhjgxab3d4xh3npo5rcxc4d7mwuee635qd.onion:18081",
"http://daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion:18081",
"http://plowsofe6cleftfmk2raiw5h2x66atrik3nja4bfd3zrfa2hdlgworad.onion:18089",
"http://3brwzfhssrqacnufjwvr2vpbawpx6ifzqhd7nzfwa3twaivn443z4nad.onion:18089",
"http://6jvn5tinwxnp723vnsvekroaniq7qkag7nkdqmcwlbinxnpeonaowayd.onion:18089",
"http://kbs3vzc6cwxmrw7ig5r4wgt5brxl6km2ccr7y2mqf3aznriz42pvwgyd.onion:18089",
"http://waovyhgbeorma64p6cbomev4zfydua4s35gd3xdc5igtjqetzvwbtkyd.onion:18089",
"http://twiy7ceov5gskxlsqfsmlubbivse5duo3ro7xmrimrgfp3whwfmzi4id.onion:18081",
"http://rlz6pa5tfs6hxbnsvzad32gt3ck3ahvgs5a73clfztezz42eo664mzid.onion:18089",
"http://azj7425hcyxzw6jxtvf3a4aw6t4rbdazywngq7jtrsoysk24btfycvad.onion:18089",
"http://dtrnd4in2igrtfx2c45ghf2drns3doddmcsfy6b5gjw5iinukd33slqd.onion:18081",
"http://moneronkvv2hu2anvcc5b4qd5y7strnc2ob6khqsrtikmhocyvjpdjyd.onion:18089",
"http://xmrpoker6fqd7kh6gxv4dtr4kaue3pdmuzbaqorvlan4as3oh3f2ftqd.onion:18081",
"http://vfp7tc36qcyd2x7r3k4twsixkrubvipp3zm5zt7wgzrjrbaon7vwgkyd.onion:18081",
"http://nj4lnfbo2mkguxv6wvzpmnjwibz2jipy7kyma4qkposr6qef7suqf3ad.onion:18081",
"http://csxmritzk2qdgqmou2vwyrwu65xabimvmeniestaartks4fhlocfoeyd.onion:18081",
"http://qvb4rowgpqzz2m4vayovmtx2ag6l2lsdjhhbzb2nvg3ikybclb4ttdad.onion:18081",
"http://monero3x5yrb7tsalxx64tr2qhfw54xy3eudhswvpaskfvsdk2tzb3id.onion:18089",
"http://6dsdenp6vjkvqzy4wzsnzn6wixkdzihx3khiumyzieauxuxslmcaeiad.onion:18081",
"http://h5oepjpydwyacbks5vnanx2qw4rboqz53eksljflbkn5zrwcz2575xqd.onion:18089",
"http://hashvaultsvg2rinvxz7kos77hdfm6zrd5yco3tx2yh2linsmusfwyad.onion:18081",
"http://nrf3tly3ypsow73lfijhpx4cqll3l4xiuf3r4xbfzkdkgzy4gq642sad.onion:18089",
"http://27ihnchx3loqzue7hekggodxpazfb3npcosfxzrar5fom4zapd6rgcad.onion:18081",
"http://4kzkwyooeth3lxajxs7pmcriq6cgvnbex2vojum2uqflczsci4dlreyd.onion:18089"
]
}

View file

@ -0,0 +1,20 @@
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class AccountServiceClient {
final AccountClient _accountClient;
AccountServiceClient(HavenoService service)
: _accountClient = service.accountClient;
Future<bool> accountExists() async {
try {
final response =
await _accountClient.accountExists(AccountExistsRequest());
return response.accountExists;
} catch (e) {
print('Caught error: $e');
rethrow;
}
}
}

File diff suppressed because one or more lines are too long

304
lib/main.dart Normal file
View file

@ -0,0 +1,304 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/providers/offers_provider.dart';
import 'package:haveno_flutter_app/providers/payment_accounts_provider.dart';
import 'package:haveno_flutter_app/providers/prices_provider.dart';
import 'package:haveno_flutter_app/providers/trades_provider.dart';
import 'package:haveno_flutter_app/providers/wallets_provider.dart';
import 'package:haveno_flutter_app/screens/accounts_screen.dart';
import 'package:haveno_flutter_app/screens/settings_screen.dart';
import 'package:haveno_flutter_app/tabs/trades_tab.dart';
import 'package:haveno_flutter_app/tabs/buy_tab.dart';
import 'package:haveno_flutter_app/tabs/sell_tab.dart';
import 'package:haveno_flutter_app/screens/wallet_screen.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
import 'package:haveno_flutter_app/services/http_service.dart';
import 'package:haveno_flutter_app/services/monero_service.dart';
import 'package:haveno_flutter_app/services/tor_service.dart';
import 'package:haveno_flutter_app/providers/get_version_provider.dart';
import 'package:haveno_flutter_app/providers/account_provider.dart';
import 'dart:async';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Setup logging
_setupLogging();
// Initialize services
final torService = TorService();
await torService.initializeTor();
final httpService = HttpService();
final moneroService = MoneroService();
final havenoService = HavenoService('192.168.0.18', 3201, 'apitest');
runApp(
MultiProvider(
providers: [
Provider(create: (_) => torService),
Provider(create: (_) => httpService),
Provider(create: (_) => moneroService),
Provider(create: (_) => havenoService),
ChangeNotifierProvider(
create: (context) => GetVersionProvider(havenoService),
),
ChangeNotifierProvider(
create: (context) => AccountProvider(havenoService),
),
ChangeNotifierProvider(
create: (context) => WalletsProvider(havenoService),
),
ChangeNotifierProvider(
create: (context) => OffersProvider(havenoService),
),
ChangeNotifierProvider(
create: (context) => TradesProvider(havenoService),
),
ChangeNotifierProvider(
create: (context) => PaymentAccountsProvider(havenoService),
),
ChangeNotifierProvider(
create: (context) => PricesProvider(havenoService),
),
],
child: MyApp(),
),
);
}
Future<void> _setupLogging() async {
Logger.root.level = Level.ALL; // Capture all log levels
// Get the application documents directory
final directory = await getApplicationDocumentsDirectory();
final logFile = File('${directory.path}/app.log');
// Setup the logger to write to the file and print to console
Logger.root.onRecord.listen((record) {
final logMessage =
'${record.level.name}: ${record.time}: ${record.loggerName}: ${record.message}\n';
logFile.writeAsStringSync(logMessage,
mode: FileMode.append, flush: true); // Ensure it's flushed to file
print(logMessage); // Also print to console
});
}
final Logger _logger = Logger('Haveno');
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
primary: Color(0xFFF4511E),
seedColor: Color(0xFFF4511E), // Reddish-orange primary color
brightness: Brightness.dark,
// Ensures dark mode with light text
),
scaffoldBackgroundColor: Color(0xFF303030),
appBarTheme: AppBarTheme(
backgroundColor: Color(0xFF303030),
),
drawerTheme: DrawerThemeData(
backgroundColor: Color(0xFF303030),
),
bottomNavigationBarTheme: BottomNavigationBarThemeData(
backgroundColor: Color(0xFF303030),
selectedItemColor: Color(0xFFF4511E),
unselectedItemColor: Colors.white,
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFFF4511E), // Button background color
foregroundColor: Colors.white, // Button text color
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5), // Button border radius
),
),
),
cardTheme: CardTheme(
color: Color(0xFF424242), // Card background color
),
),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
String _statusMessage = "Connecting to Tor...";
Timer? _timer;
int _selectedIndex = 0;
static final List<Widget> _widgetOptions = <Widget>[
BuyTab(),
SellTab(),
TradesTab(),
];
@override
void initState() {
super.initState();
final torService = context.read<TorService>();
torService.statusStream.listen((String status) {
print(status);
setState(() {
if (status.contains("started")) {
_statusMessage = "Connecting to the Monero network...";
} else {
_statusMessage = status;
}
});
});
_initializeServices();
}
Future<void> _initializeServices() async {
try {
await context.read<GetVersionProvider>().fetchVersion();
await context.read<AccountProvider>().checkAccountExists();
} catch (e) {
setState(() {
_statusMessage = "Initialization failed: ${e.toString()}";
});
}
}
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
}
Future<void> checkMoneroConnection() async {
try {
final info = await context.read<MoneroService>().getInfo();
setState(() {
_statusMessage =
"Connected to Monero Mainnet (via Tor) at block ${info['height']}";
});
} catch (e) {
setState(() {
_statusMessage =
"Failed to connect to the Monero network: ${e.toString()}";
});
}
}
@override
void dispose() {
context.read<TorService>().dispose();
context.read<HttpService>().close();
context.read<MoneroService>().close();
_timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: AppBar(
title: Text('Haveno'),
),
drawer: _buildDrawer(context),
body: Center(
child: _widgetOptions.elementAt(_selectedIndex),
),
bottomNavigationBar: NavigationBar(
selectedIndex: _selectedIndex,
onDestinationSelected: _onItemTapped,
destinations: const <NavigationDestination>[
NavigationDestination(
icon: Icon(Icons.shopping_cart),
label: 'Buy',
),
NavigationDestination(
icon: Icon(Icons.sell),
label: 'Sell',
),
NavigationDestination(
icon: Icon(Icons.swap_vert),
label: 'Trades',
),
],
),
);
}
Widget _buildDrawer(BuildContext context) {
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
child: Center(
child: Image.asset(
'assets/haveno-logo.png',
height: 60,
),
),
decoration: BoxDecoration(
color: Color(0xFF303030), // Header background color
),
),
ListTile(
leading: Icon(Icons.account_balance_wallet, color: Colors.white),
title: Text('Wallet', style: TextStyle(color: Colors.white)),
onTap: () {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WalletScreen()),
);
},
),
ListTile(
leading: Icon(Icons.account_circle, color: Colors.white),
title:
Text('Payment Accounts', style: TextStyle(color: Colors.white)),
onTap: () {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => AccountsScreen()),
);
},
),
ListTile(
leading: Icon(Icons.settings, color: Colors.white),
title: Text('Settings', style: TextStyle(color: Colors.white)),
onTap: () {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SettingsScreen()),
);
},
),
ListTile(
leading: Icon(Icons.sync, color: Colors.white),
title: Text('Daemons', style: TextStyle(color: Colors.white)),
onTap: () {
// Handle logout
},
),
],
),
);
}
}

View file

View file

187
lib/models/monero_node.dart Normal file
View file

@ -0,0 +1,187 @@
class MoneroNode {
final int adjustedTime;
final int altBlocksCount;
final int blockSizeLimit;
final int blockSizeMedian;
final int blockWeightLimit;
final int blockWeightMedian;
final String bootstrapDaemonAddress;
final bool busySyncing;
final int credits;
final int cumulativeDifficulty;
final int cumulativeDifficultyTop64;
final int databaseSize;
final int difficulty;
final int difficultyTop64;
final int freeSpace;
final int greyPeerlistSize;
final int height;
final int heightWithoutBootstrap;
final int incomingConnectionsCount;
final bool mainnet;
final String nettype;
final bool offline;
final int outgoingConnectionsCount;
final bool restricted;
final int rpcConnectionsCount;
final bool stagenet;
final int startTime;
final String status;
final bool synchronized;
final int target;
final int targetHeight;
final bool testnet;
final String topBlockHash;
final String topHash;
final int txCount;
final int txPoolSize;
final bool untrusted;
final bool updateAvailable;
final String version;
final bool wasBootstrapEverUsed;
final int whitePeerlistSize;
final String wideCumulativeDifficulty;
final String wideDifficulty;
MoneroNode({
required this.adjustedTime,
required this.altBlocksCount,
required this.blockSizeLimit,
required this.blockSizeMedian,
required this.blockWeightLimit,
required this.blockWeightMedian,
required this.bootstrapDaemonAddress,
required this.busySyncing,
required this.credits,
required this.cumulativeDifficulty,
required this.cumulativeDifficultyTop64,
required this.databaseSize,
required this.difficulty,
required this.difficultyTop64,
required this.freeSpace,
required this.greyPeerlistSize,
required this.height,
required this.heightWithoutBootstrap,
required this.incomingConnectionsCount,
required this.mainnet,
required this.nettype,
required this.offline,
required this.outgoingConnectionsCount,
required this.restricted,
required this.rpcConnectionsCount,
required this.stagenet,
required this.startTime,
required this.status,
required this.synchronized,
required this.target,
required this.targetHeight,
required this.testnet,
required this.topBlockHash,
required this.topHash,
required this.txCount,
required this.txPoolSize,
required this.untrusted,
required this.updateAvailable,
required this.version,
required this.wasBootstrapEverUsed,
required this.whitePeerlistSize,
required this.wideCumulativeDifficulty,
required this.wideDifficulty,
});
factory MoneroNode.fromJson(Map<String, dynamic> json) {
return MoneroNode(
adjustedTime: json['adjusted_time'],
altBlocksCount: json['alt_blocks_count'],
blockSizeLimit: json['block_size_limit'],
blockSizeMedian: json['block_size_median'],
blockWeightLimit: json['block_weight_limit'],
blockWeightMedian: json['block_weight_median'],
bootstrapDaemonAddress: json['bootstrap_daemon_address'],
busySyncing: json['busy_syncing'],
credits: json['credits'],
cumulativeDifficulty: json['cumulative_difficulty'],
cumulativeDifficultyTop64: json['cumulative_difficulty_top64'],
databaseSize: json['database_size'],
difficulty: json['difficulty'],
difficultyTop64: json['difficulty_top64'],
freeSpace: json['free_space'],
greyPeerlistSize: json['grey_peerlist_size'],
height: json['height'],
heightWithoutBootstrap: json['height_without_bootstrap'],
incomingConnectionsCount: json['incoming_connections_count'],
mainnet: json['mainnet'],
nettype: json['nettype'],
offline: json['offline'],
outgoingConnectionsCount: json['outgoing_connections_count'],
restricted: json['restricted'],
rpcConnectionsCount: json['rpc_connections_count'],
stagenet: json['stagenet'],
startTime: json['start_time'],
status: json['status'],
synchronized: json['synchronized'],
target: json['target'],
targetHeight: json['target_height'],
testnet: json['testnet'],
topBlockHash: json['top_block_hash'],
topHash: json['top_hash'],
txCount: json['tx_count'],
txPoolSize: json['tx_pool_size'],
untrusted: json['untrusted'],
updateAvailable: json['update_available'],
version: json['version'],
wasBootstrapEverUsed: json['was_bootstrap_ever_used'],
whitePeerlistSize: json['white_peerlist_size'],
wideCumulativeDifficulty: json['wide_cumulative_difficulty'],
wideDifficulty: json['wide_difficulty'],
);
}
Map<String, dynamic> toJson() {
return {
'adjusted_time': adjustedTime,
'alt_blocks_count': altBlocksCount,
'block_size_limit': blockSizeLimit,
'block_size_median': blockSizeMedian,
'block_weight_limit': blockWeightLimit,
'block_weight_median': blockWeightMedian,
'bootstrap_daemon_address': bootstrapDaemonAddress,
'busy_syncing': busySyncing,
'credits': credits,
'cumulative_difficulty': cumulativeDifficulty,
'cumulative_difficulty_top64': cumulativeDifficultyTop64,
'database_size': databaseSize,
'difficulty': difficulty,
'difficulty_top64': difficultyTop64,
'free_space': freeSpace,
'grey_peerlist_size': greyPeerlistSize,
'height': height,
'height_without_bootstrap': heightWithoutBootstrap,
'incoming_connections_count': incomingConnectionsCount,
'mainnet': mainnet,
'nettype': nettype,
'offline': offline,
'outgoing_connections_count': outgoingConnectionsCount,
'restricted': restricted,
'rpc_connections_count': rpcConnectionsCount,
'stagenet': stagenet,
'start_time': startTime,
'status': status,
'synchronized': synchronized,
'target': target,
'target_height': targetHeight,
'testnet': testnet,
'top_block_hash': topBlockHash,
'top_hash': topHash,
'tx_count': txCount,
'tx_pool_size': txPoolSize,
'untrusted': untrusted,
'update_available': updateAvailable,
'version': version,
'was_bootstrap_ever_used': wasBootstrapEverUsed,
'white_peerlist_size': whitePeerlistSize,
'wide_cumulative_difficulty': wideCumulativeDifficulty,
'wide_difficulty': wideDifficulty,
};
}
}

View file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,90 @@
//
// Generated code. Do not modify.
// source: grpc.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class NotificationMessage_NotificationType extends $pb.ProtobufEnum {
static const NotificationMessage_NotificationType ERROR = NotificationMessage_NotificationType._(0, _omitEnumNames ? '' : 'ERROR');
static const NotificationMessage_NotificationType APP_INITIALIZED = NotificationMessage_NotificationType._(1, _omitEnumNames ? '' : 'APP_INITIALIZED');
static const NotificationMessage_NotificationType KEEP_ALIVE = NotificationMessage_NotificationType._(2, _omitEnumNames ? '' : 'KEEP_ALIVE');
static const NotificationMessage_NotificationType TRADE_UPDATE = NotificationMessage_NotificationType._(3, _omitEnumNames ? '' : 'TRADE_UPDATE');
static const NotificationMessage_NotificationType CHAT_MESSAGE = NotificationMessage_NotificationType._(4, _omitEnumNames ? '' : 'CHAT_MESSAGE');
static const $core.List<NotificationMessage_NotificationType> values = <NotificationMessage_NotificationType> [
ERROR,
APP_INITIALIZED,
KEEP_ALIVE,
TRADE_UPDATE,
CHAT_MESSAGE,
];
static final $core.Map<$core.int, NotificationMessage_NotificationType> _byValue = $pb.ProtobufEnum.initByValue(values);
static NotificationMessage_NotificationType? valueOf($core.int value) => _byValue[value];
const NotificationMessage_NotificationType._($core.int v, $core.String n) : super(v, n);
}
class UrlConnection_OnlineStatus extends $pb.ProtobufEnum {
static const UrlConnection_OnlineStatus UNKNOWN = UrlConnection_OnlineStatus._(0, _omitEnumNames ? '' : 'UNKNOWN');
static const UrlConnection_OnlineStatus ONLINE = UrlConnection_OnlineStatus._(1, _omitEnumNames ? '' : 'ONLINE');
static const UrlConnection_OnlineStatus OFFLINE = UrlConnection_OnlineStatus._(2, _omitEnumNames ? '' : 'OFFLINE');
static const $core.List<UrlConnection_OnlineStatus> values = <UrlConnection_OnlineStatus> [
UNKNOWN,
ONLINE,
OFFLINE,
];
static final $core.Map<$core.int, UrlConnection_OnlineStatus> _byValue = $pb.ProtobufEnum.initByValue(values);
static UrlConnection_OnlineStatus? valueOf($core.int value) => _byValue[value];
const UrlConnection_OnlineStatus._($core.int v, $core.String n) : super(v, n);
}
class UrlConnection_AuthenticationStatus extends $pb.ProtobufEnum {
static const UrlConnection_AuthenticationStatus NO_AUTHENTICATION = UrlConnection_AuthenticationStatus._(0, _omitEnumNames ? '' : 'NO_AUTHENTICATION');
static const UrlConnection_AuthenticationStatus AUTHENTICATED = UrlConnection_AuthenticationStatus._(1, _omitEnumNames ? '' : 'AUTHENTICATED');
static const UrlConnection_AuthenticationStatus NOT_AUTHENTICATED = UrlConnection_AuthenticationStatus._(2, _omitEnumNames ? '' : 'NOT_AUTHENTICATED');
static const $core.List<UrlConnection_AuthenticationStatus> values = <UrlConnection_AuthenticationStatus> [
NO_AUTHENTICATION,
AUTHENTICATED,
NOT_AUTHENTICATED,
];
static final $core.Map<$core.int, UrlConnection_AuthenticationStatus> _byValue = $pb.ProtobufEnum.initByValue(values);
static UrlConnection_AuthenticationStatus? valueOf($core.int value) => _byValue[value];
const UrlConnection_AuthenticationStatus._($core.int v, $core.String n) : super(v, n);
}
/// Rpc method GetTrades parameter determining what category of trade list is is being requested.
class GetTradesRequest_Category extends $pb.ProtobufEnum {
static const GetTradesRequest_Category OPEN = GetTradesRequest_Category._(0, _omitEnumNames ? '' : 'OPEN');
static const GetTradesRequest_Category CLOSED = GetTradesRequest_Category._(1, _omitEnumNames ? '' : 'CLOSED');
static const GetTradesRequest_Category FAILED = GetTradesRequest_Category._(2, _omitEnumNames ? '' : 'FAILED');
static const $core.List<GetTradesRequest_Category> values = <GetTradesRequest_Category> [
OPEN,
CLOSED,
FAILED,
];
static final $core.Map<$core.int, GetTradesRequest_Category> _byValue = $pb.ProtobufEnum.initByValue(values);
static GetTradesRequest_Category? valueOf($core.int value) => _byValue[value];
const GetTradesRequest_Category._($core.int v, $core.String n) : super(v, n);
}
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

20884
lib/proto/compiled/pb.pb.dart Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,745 @@
//
// Generated code. Do not modify.
// source: pb.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class TradeProtocolVersion extends $pb.ProtobufEnum {
static const TradeProtocolVersion MULTISIG_2_3 = TradeProtocolVersion._(0, _omitEnumNames ? '' : 'MULTISIG_2_3');
static const $core.List<TradeProtocolVersion> values = <TradeProtocolVersion> [
MULTISIG_2_3,
];
static final $core.Map<$core.int, TradeProtocolVersion> _byValue = $pb.ProtobufEnum.initByValue(values);
static TradeProtocolVersion? valueOf($core.int value) => _byValue[value];
const TradeProtocolVersion._($core.int v, $core.String n) : super(v, n);
}
class SupportType extends $pb.ProtobufEnum {
static const SupportType ARBITRATION = SupportType._(0, _omitEnumNames ? '' : 'ARBITRATION');
static const SupportType MEDIATION = SupportType._(1, _omitEnumNames ? '' : 'MEDIATION');
static const SupportType TRADE = SupportType._(2, _omitEnumNames ? '' : 'TRADE');
static const SupportType REFUND = SupportType._(3, _omitEnumNames ? '' : 'REFUND');
static const $core.List<SupportType> values = <SupportType> [
ARBITRATION,
MEDIATION,
TRADE,
REFUND,
];
static final $core.Map<$core.int, SupportType> _byValue = $pb.ProtobufEnum.initByValue(values);
static SupportType? valueOf($core.int value) => _byValue[value];
const SupportType._($core.int v, $core.String n) : super(v, n);
}
class OfferDirection extends $pb.ProtobufEnum {
static const OfferDirection OFFER_DIRECTION_UNDEFINED = OfferDirection._(0, _omitEnumNames ? '' : 'OFFER_DIRECTION_UNDEFINED');
static const OfferDirection BUY = OfferDirection._(1, _omitEnumNames ? '' : 'BUY');
static const OfferDirection SELL = OfferDirection._(2, _omitEnumNames ? '' : 'SELL');
static const $core.List<OfferDirection> values = <OfferDirection> [
OFFER_DIRECTION_UNDEFINED,
BUY,
SELL,
];
static final $core.Map<$core.int, OfferDirection> _byValue = $pb.ProtobufEnum.initByValue(values);
static OfferDirection? valueOf($core.int value) => _byValue[value];
const OfferDirection._($core.int v, $core.String n) : super(v, n);
}
class AvailabilityResult extends $pb.ProtobufEnum {
static const AvailabilityResult PB_ERROR = AvailabilityResult._(0, _omitEnumNames ? '' : 'PB_ERROR');
static const AvailabilityResult UNKNOWN_FAILURE = AvailabilityResult._(1, _omitEnumNames ? '' : 'UNKNOWN_FAILURE');
static const AvailabilityResult AVAILABLE = AvailabilityResult._(2, _omitEnumNames ? '' : 'AVAILABLE');
static const AvailabilityResult OFFER_TAKEN = AvailabilityResult._(3, _omitEnumNames ? '' : 'OFFER_TAKEN');
static const AvailabilityResult PRICE_OUT_OF_TOLERANCE = AvailabilityResult._(4, _omitEnumNames ? '' : 'PRICE_OUT_OF_TOLERANCE');
static const AvailabilityResult MARKET_PRICE_NOT_AVAILABLE = AvailabilityResult._(5, _omitEnumNames ? '' : 'MARKET_PRICE_NOT_AVAILABLE');
static const AvailabilityResult NO_ARBITRATORS = AvailabilityResult._(6, _omitEnumNames ? '' : 'NO_ARBITRATORS');
static const AvailabilityResult NO_MEDIATORS = AvailabilityResult._(7, _omitEnumNames ? '' : 'NO_MEDIATORS');
static const AvailabilityResult USER_IGNORED = AvailabilityResult._(8, _omitEnumNames ? '' : 'USER_IGNORED');
static const AvailabilityResult MISSING_MANDATORY_CAPABILITY = AvailabilityResult._(9, _omitEnumNames ? '' : 'MISSING_MANDATORY_CAPABILITY');
static const AvailabilityResult NO_REFUND_AGENTS = AvailabilityResult._(10, _omitEnumNames ? '' : 'NO_REFUND_AGENTS');
static const AvailabilityResult UNCONF_TX_LIMIT_HIT = AvailabilityResult._(11, _omitEnumNames ? '' : 'UNCONF_TX_LIMIT_HIT');
static const AvailabilityResult MAKER_DENIED_API_USER = AvailabilityResult._(12, _omitEnumNames ? '' : 'MAKER_DENIED_API_USER');
static const AvailabilityResult PRICE_CHECK_FAILED = AvailabilityResult._(13, _omitEnumNames ? '' : 'PRICE_CHECK_FAILED');
static const AvailabilityResult MAKER_DENIED_TAKER = AvailabilityResult._(14, _omitEnumNames ? '' : 'MAKER_DENIED_TAKER');
static const $core.List<AvailabilityResult> values = <AvailabilityResult> [
PB_ERROR,
UNKNOWN_FAILURE,
AVAILABLE,
OFFER_TAKEN,
PRICE_OUT_OF_TOLERANCE,
MARKET_PRICE_NOT_AVAILABLE,
NO_ARBITRATORS,
NO_MEDIATORS,
USER_IGNORED,
MISSING_MANDATORY_CAPABILITY,
NO_REFUND_AGENTS,
UNCONF_TX_LIMIT_HIT,
MAKER_DENIED_API_USER,
PRICE_CHECK_FAILED,
MAKER_DENIED_TAKER,
];
static final $core.Map<$core.int, AvailabilityResult> _byValue = $pb.ProtobufEnum.initByValue(values);
static AvailabilityResult? valueOf($core.int value) => _byValue[value];
const AvailabilityResult._($core.int v, $core.String n) : super(v, n);
}
class MediationResultState extends $pb.ProtobufEnum {
static const MediationResultState PB_ERROR_MEDIATION_RESULT = MediationResultState._(0, _omitEnumNames ? '' : 'PB_ERROR_MEDIATION_RESULT');
static const MediationResultState UNDEFINED_MEDIATION_RESULT = MediationResultState._(1, _omitEnumNames ? '' : 'UNDEFINED_MEDIATION_RESULT');
static const MediationResultState MEDIATION_RESULT_ACCEPTED = MediationResultState._(2, _omitEnumNames ? '' : 'MEDIATION_RESULT_ACCEPTED');
static const MediationResultState MEDIATION_RESULT_REJECTED = MediationResultState._(3, _omitEnumNames ? '' : 'MEDIATION_RESULT_REJECTED');
static const MediationResultState SIG_MSG_SENT = MediationResultState._(4, _omitEnumNames ? '' : 'SIG_MSG_SENT');
static const MediationResultState SIG_MSG_ARRIVED = MediationResultState._(5, _omitEnumNames ? '' : 'SIG_MSG_ARRIVED');
static const MediationResultState SIG_MSG_IN_MAILBOX = MediationResultState._(6, _omitEnumNames ? '' : 'SIG_MSG_IN_MAILBOX');
static const MediationResultState SIG_MSG_SEND_FAILED = MediationResultState._(7, _omitEnumNames ? '' : 'SIG_MSG_SEND_FAILED');
static const MediationResultState RECEIVED_SIG_MSG = MediationResultState._(8, _omitEnumNames ? '' : 'RECEIVED_SIG_MSG');
static const MediationResultState PAYOUT_TX_PUBLISHED = MediationResultState._(9, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED');
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_SENT = MediationResultState._(10, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_SENT');
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_ARRIVED = MediationResultState._(11, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_ARRIVED');
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX = MediationResultState._(12, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX');
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED = MediationResultState._(13, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED');
static const MediationResultState RECEIVED_PAYOUT_TX_PUBLISHED_MSG = MediationResultState._(14, _omitEnumNames ? '' : 'RECEIVED_PAYOUT_TX_PUBLISHED_MSG');
static const MediationResultState PAYOUT_TX_SEEN_IN_NETWORK = MediationResultState._(15, _omitEnumNames ? '' : 'PAYOUT_TX_SEEN_IN_NETWORK');
static const $core.List<MediationResultState> values = <MediationResultState> [
PB_ERROR_MEDIATION_RESULT,
UNDEFINED_MEDIATION_RESULT,
MEDIATION_RESULT_ACCEPTED,
MEDIATION_RESULT_REJECTED,
SIG_MSG_SENT,
SIG_MSG_ARRIVED,
SIG_MSG_IN_MAILBOX,
SIG_MSG_SEND_FAILED,
RECEIVED_SIG_MSG,
PAYOUT_TX_PUBLISHED,
PAYOUT_TX_PUBLISHED_MSG_SENT,
PAYOUT_TX_PUBLISHED_MSG_ARRIVED,
PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX,
PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED,
RECEIVED_PAYOUT_TX_PUBLISHED_MSG,
PAYOUT_TX_SEEN_IN_NETWORK,
];
static final $core.Map<$core.int, MediationResultState> _byValue = $pb.ProtobufEnum.initByValue(values);
static MediationResultState? valueOf($core.int value) => _byValue[value];
const MediationResultState._($core.int v, $core.String n) : super(v, n);
}
/// todo
class RefundResultState extends $pb.ProtobufEnum {
static const RefundResultState PB_ERROR_REFUND_RESULT = RefundResultState._(0, _omitEnumNames ? '' : 'PB_ERROR_REFUND_RESULT');
static const RefundResultState UNDEFINED_REFUND_RESULT = RefundResultState._(1, _omitEnumNames ? '' : 'UNDEFINED_REFUND_RESULT');
static const $core.List<RefundResultState> values = <RefundResultState> [
PB_ERROR_REFUND_RESULT,
UNDEFINED_REFUND_RESULT,
];
static final $core.Map<$core.int, RefundResultState> _byValue = $pb.ProtobufEnum.initByValue(values);
static RefundResultState? valueOf($core.int value) => _byValue[value];
const RefundResultState._($core.int v, $core.String n) : super(v, n);
}
class SignedWitness_VerificationMethod extends $pb.ProtobufEnum {
static const SignedWitness_VerificationMethod PB_ERROR = SignedWitness_VerificationMethod._(0, _omitEnumNames ? '' : 'PB_ERROR');
static const SignedWitness_VerificationMethod ARBITRATOR = SignedWitness_VerificationMethod._(1, _omitEnumNames ? '' : 'ARBITRATOR');
static const SignedWitness_VerificationMethod TRADE = SignedWitness_VerificationMethod._(2, _omitEnumNames ? '' : 'TRADE');
static const $core.List<SignedWitness_VerificationMethod> values = <SignedWitness_VerificationMethod> [
PB_ERROR,
ARBITRATOR,
TRADE,
];
static final $core.Map<$core.int, SignedWitness_VerificationMethod> _byValue = $pb.ProtobufEnum.initByValue(values);
static SignedWitness_VerificationMethod? valueOf($core.int value) => _byValue[value];
const SignedWitness_VerificationMethod._($core.int v, $core.String n) : super(v, n);
}
class Dispute_State extends $pb.ProtobufEnum {
static const Dispute_State NEEDS_UPGRADE = Dispute_State._(0, _omitEnumNames ? '' : 'NEEDS_UPGRADE');
static const Dispute_State NEW = Dispute_State._(1, _omitEnumNames ? '' : 'NEW');
static const Dispute_State OPEN = Dispute_State._(2, _omitEnumNames ? '' : 'OPEN');
static const Dispute_State REOPENED = Dispute_State._(3, _omitEnumNames ? '' : 'REOPENED');
static const Dispute_State CLOSED = Dispute_State._(4, _omitEnumNames ? '' : 'CLOSED');
static const $core.List<Dispute_State> values = <Dispute_State> [
NEEDS_UPGRADE,
NEW,
OPEN,
REOPENED,
CLOSED,
];
static final $core.Map<$core.int, Dispute_State> _byValue = $pb.ProtobufEnum.initByValue(values);
static Dispute_State? valueOf($core.int value) => _byValue[value];
const Dispute_State._($core.int v, $core.String n) : super(v, n);
}
class DisputeResult_Winner extends $pb.ProtobufEnum {
static const DisputeResult_Winner PB_ERROR_WINNER = DisputeResult_Winner._(0, _omitEnumNames ? '' : 'PB_ERROR_WINNER');
static const DisputeResult_Winner BUYER = DisputeResult_Winner._(1, _omitEnumNames ? '' : 'BUYER');
static const DisputeResult_Winner SELLER = DisputeResult_Winner._(2, _omitEnumNames ? '' : 'SELLER');
static const $core.List<DisputeResult_Winner> values = <DisputeResult_Winner> [
PB_ERROR_WINNER,
BUYER,
SELLER,
];
static final $core.Map<$core.int, DisputeResult_Winner> _byValue = $pb.ProtobufEnum.initByValue(values);
static DisputeResult_Winner? valueOf($core.int value) => _byValue[value];
const DisputeResult_Winner._($core.int v, $core.String n) : super(v, n);
}
class DisputeResult_Reason extends $pb.ProtobufEnum {
static const DisputeResult_Reason PB_ERROR_REASON = DisputeResult_Reason._(0, _omitEnumNames ? '' : 'PB_ERROR_REASON');
static const DisputeResult_Reason OTHER = DisputeResult_Reason._(1, _omitEnumNames ? '' : 'OTHER');
static const DisputeResult_Reason BUG = DisputeResult_Reason._(2, _omitEnumNames ? '' : 'BUG');
static const DisputeResult_Reason USABILITY = DisputeResult_Reason._(3, _omitEnumNames ? '' : 'USABILITY');
static const DisputeResult_Reason SCAM = DisputeResult_Reason._(4, _omitEnumNames ? '' : 'SCAM');
static const DisputeResult_Reason PROTOCOL_VIOLATION = DisputeResult_Reason._(5, _omitEnumNames ? '' : 'PROTOCOL_VIOLATION');
static const DisputeResult_Reason NO_REPLY = DisputeResult_Reason._(6, _omitEnumNames ? '' : 'NO_REPLY');
static const DisputeResult_Reason BANK_PROBLEMS = DisputeResult_Reason._(7, _omitEnumNames ? '' : 'BANK_PROBLEMS');
static const DisputeResult_Reason OPTION_TRADE = DisputeResult_Reason._(8, _omitEnumNames ? '' : 'OPTION_TRADE');
static const DisputeResult_Reason SELLER_NOT_RESPONDING = DisputeResult_Reason._(9, _omitEnumNames ? '' : 'SELLER_NOT_RESPONDING');
static const DisputeResult_Reason WRONG_SENDER_ACCOUNT = DisputeResult_Reason._(10, _omitEnumNames ? '' : 'WRONG_SENDER_ACCOUNT');
static const DisputeResult_Reason TRADE_ALREADY_SETTLED = DisputeResult_Reason._(11, _omitEnumNames ? '' : 'TRADE_ALREADY_SETTLED');
static const DisputeResult_Reason PEER_WAS_LATE = DisputeResult_Reason._(12, _omitEnumNames ? '' : 'PEER_WAS_LATE');
static const $core.List<DisputeResult_Reason> values = <DisputeResult_Reason> [
PB_ERROR_REASON,
OTHER,
BUG,
USABILITY,
SCAM,
PROTOCOL_VIOLATION,
NO_REPLY,
BANK_PROBLEMS,
OPTION_TRADE,
SELLER_NOT_RESPONDING,
WRONG_SENDER_ACCOUNT,
TRADE_ALREADY_SETTLED,
PEER_WAS_LATE,
];
static final $core.Map<$core.int, DisputeResult_Reason> _byValue = $pb.ProtobufEnum.initByValue(values);
static DisputeResult_Reason? valueOf($core.int value) => _byValue[value];
const DisputeResult_Reason._($core.int v, $core.String n) : super(v, n);
}
class DisputeResult_SubtractFeeFrom extends $pb.ProtobufEnum {
static const DisputeResult_SubtractFeeFrom BUYER_ONLY = DisputeResult_SubtractFeeFrom._(0, _omitEnumNames ? '' : 'BUYER_ONLY');
static const DisputeResult_SubtractFeeFrom SELLER_ONLY = DisputeResult_SubtractFeeFrom._(1, _omitEnumNames ? '' : 'SELLER_ONLY');
static const DisputeResult_SubtractFeeFrom BUYER_AND_SELLER = DisputeResult_SubtractFeeFrom._(2, _omitEnumNames ? '' : 'BUYER_AND_SELLER');
static const $core.List<DisputeResult_SubtractFeeFrom> values = <DisputeResult_SubtractFeeFrom> [
BUYER_ONLY,
SELLER_ONLY,
BUYER_AND_SELLER,
];
static final $core.Map<$core.int, DisputeResult_SubtractFeeFrom> _byValue = $pb.ProtobufEnum.initByValue(values);
static DisputeResult_SubtractFeeFrom? valueOf($core.int value) => _byValue[value];
const DisputeResult_SubtractFeeFrom._($core.int v, $core.String n) : super(v, n);
}
class AddressEntry_Context extends $pb.ProtobufEnum {
static const AddressEntry_Context PB_ERROR = AddressEntry_Context._(0, _omitEnumNames ? '' : 'PB_ERROR');
static const AddressEntry_Context ARBITRATOR = AddressEntry_Context._(1, _omitEnumNames ? '' : 'ARBITRATOR');
static const AddressEntry_Context AVAILABLE = AddressEntry_Context._(2, _omitEnumNames ? '' : 'AVAILABLE');
static const AddressEntry_Context OFFER_FUNDING = AddressEntry_Context._(3, _omitEnumNames ? '' : 'OFFER_FUNDING');
static const AddressEntry_Context RESERVED_FOR_TRADE = AddressEntry_Context._(4, _omitEnumNames ? '' : 'RESERVED_FOR_TRADE');
static const AddressEntry_Context MULTI_SIG = AddressEntry_Context._(5, _omitEnumNames ? '' : 'MULTI_SIG');
static const AddressEntry_Context TRADE_PAYOUT = AddressEntry_Context._(6, _omitEnumNames ? '' : 'TRADE_PAYOUT');
static const $core.List<AddressEntry_Context> values = <AddressEntry_Context> [
PB_ERROR,
ARBITRATOR,
AVAILABLE,
OFFER_FUNDING,
RESERVED_FOR_TRADE,
MULTI_SIG,
TRADE_PAYOUT,
];
static final $core.Map<$core.int, AddressEntry_Context> _byValue = $pb.ProtobufEnum.initByValue(values);
static AddressEntry_Context? valueOf($core.int value) => _byValue[value];
const AddressEntry_Context._($core.int v, $core.String n) : super(v, n);
}
class XmrAddressEntry_Context extends $pb.ProtobufEnum {
static const XmrAddressEntry_Context PB_ERROR = XmrAddressEntry_Context._(0, _omitEnumNames ? '' : 'PB_ERROR');
static const XmrAddressEntry_Context ARBITRATOR = XmrAddressEntry_Context._(1, _omitEnumNames ? '' : 'ARBITRATOR');
static const XmrAddressEntry_Context BASE_ADDRESS = XmrAddressEntry_Context._(2, _omitEnumNames ? '' : 'BASE_ADDRESS');
static const XmrAddressEntry_Context AVAILABLE = XmrAddressEntry_Context._(3, _omitEnumNames ? '' : 'AVAILABLE');
static const XmrAddressEntry_Context OFFER_FUNDING = XmrAddressEntry_Context._(4, _omitEnumNames ? '' : 'OFFER_FUNDING');
static const XmrAddressEntry_Context TRADE_PAYOUT = XmrAddressEntry_Context._(5, _omitEnumNames ? '' : 'TRADE_PAYOUT');
static const $core.List<XmrAddressEntry_Context> values = <XmrAddressEntry_Context> [
PB_ERROR,
ARBITRATOR,
BASE_ADDRESS,
AVAILABLE,
OFFER_FUNDING,
TRADE_PAYOUT,
];
static final $core.Map<$core.int, XmrAddressEntry_Context> _byValue = $pb.ProtobufEnum.initByValue(values);
static XmrAddressEntry_Context? valueOf($core.int value) => _byValue[value];
const XmrAddressEntry_Context._($core.int v, $core.String n) : super(v, n);
}
class Offer_State extends $pb.ProtobufEnum {
static const Offer_State PB_ERROR = Offer_State._(0, _omitEnumNames ? '' : 'PB_ERROR');
static const Offer_State UNKNOWN = Offer_State._(1, _omitEnumNames ? '' : 'UNKNOWN');
static const Offer_State OFFER_FEE_RESERVED = Offer_State._(2, _omitEnumNames ? '' : 'OFFER_FEE_RESERVED');
static const Offer_State AVAILABLE = Offer_State._(3, _omitEnumNames ? '' : 'AVAILABLE');
static const Offer_State NOT_AVAILABLE = Offer_State._(4, _omitEnumNames ? '' : 'NOT_AVAILABLE');
static const Offer_State REMOVED = Offer_State._(5, _omitEnumNames ? '' : 'REMOVED');
static const Offer_State MAKER_OFFLINE = Offer_State._(6, _omitEnumNames ? '' : 'MAKER_OFFLINE');
static const Offer_State INVALID = Offer_State._(7, _omitEnumNames ? '' : 'INVALID');
static const $core.List<Offer_State> values = <Offer_State> [
PB_ERROR,
UNKNOWN,
OFFER_FEE_RESERVED,
AVAILABLE,
NOT_AVAILABLE,
REMOVED,
MAKER_OFFLINE,
INVALID,
];
static final $core.Map<$core.int, Offer_State> _byValue = $pb.ProtobufEnum.initByValue(values);
static Offer_State? valueOf($core.int value) => _byValue[value];
const Offer_State._($core.int v, $core.String n) : super(v, n);
}
class OpenOffer_State extends $pb.ProtobufEnum {
static const OpenOffer_State PB_ERROR = OpenOffer_State._(0, _omitEnumNames ? '' : 'PB_ERROR');
static const OpenOffer_State SCHEDULED = OpenOffer_State._(1, _omitEnumNames ? '' : 'SCHEDULED');
static const OpenOffer_State AVAILABLE = OpenOffer_State._(2, _omitEnumNames ? '' : 'AVAILABLE');
static const OpenOffer_State RESERVED = OpenOffer_State._(3, _omitEnumNames ? '' : 'RESERVED');
static const OpenOffer_State CLOSED = OpenOffer_State._(4, _omitEnumNames ? '' : 'CLOSED');
static const OpenOffer_State CANCELED = OpenOffer_State._(5, _omitEnumNames ? '' : 'CANCELED');
static const OpenOffer_State DEACTIVATED = OpenOffer_State._(6, _omitEnumNames ? '' : 'DEACTIVATED');
static const $core.List<OpenOffer_State> values = <OpenOffer_State> [
PB_ERROR,
SCHEDULED,
AVAILABLE,
RESERVED,
CLOSED,
CANCELED,
DEACTIVATED,
];
static final $core.Map<$core.int, OpenOffer_State> _byValue = $pb.ProtobufEnum.initByValue(values);
static OpenOffer_State? valueOf($core.int value) => _byValue[value];
const OpenOffer_State._($core.int v, $core.String n) : super(v, n);
}
class Trade_State extends $pb.ProtobufEnum {
static const Trade_State PB_ERROR_STATE = Trade_State._(0, _omitEnumNames ? '' : 'PB_ERROR_STATE');
static const Trade_State PREPARATION = Trade_State._(1, _omitEnumNames ? '' : 'PREPARATION');
static const Trade_State MULTISIG_PREPARED = Trade_State._(2, _omitEnumNames ? '' : 'MULTISIG_PREPARED');
static const Trade_State MULTISIG_MADE = Trade_State._(3, _omitEnumNames ? '' : 'MULTISIG_MADE');
static const Trade_State MULTISIG_EXCHANGED = Trade_State._(4, _omitEnumNames ? '' : 'MULTISIG_EXCHANGED');
static const Trade_State MULTISIG_COMPLETED = Trade_State._(5, _omitEnumNames ? '' : 'MULTISIG_COMPLETED');
static const Trade_State CONTRACT_SIGNATURE_REQUESTED = Trade_State._(6, _omitEnumNames ? '' : 'CONTRACT_SIGNATURE_REQUESTED');
static const Trade_State CONTRACT_SIGNED = Trade_State._(7, _omitEnumNames ? '' : 'CONTRACT_SIGNED');
static const Trade_State SENT_PUBLISH_DEPOSIT_TX_REQUEST = Trade_State._(8, _omitEnumNames ? '' : 'SENT_PUBLISH_DEPOSIT_TX_REQUEST');
static const Trade_State SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST = Trade_State._(9, _omitEnumNames ? '' : 'SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST');
static const Trade_State SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST = Trade_State._(10, _omitEnumNames ? '' : 'SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST');
static const Trade_State PUBLISH_DEPOSIT_TX_REQUEST_FAILED = Trade_State._(11, _omitEnumNames ? '' : 'PUBLISH_DEPOSIT_TX_REQUEST_FAILED');
static const Trade_State ARBITRATOR_PUBLISHED_DEPOSIT_TXS = Trade_State._(12, _omitEnumNames ? '' : 'ARBITRATOR_PUBLISHED_DEPOSIT_TXS');
static const Trade_State DEPOSIT_TXS_SEEN_IN_NETWORK = Trade_State._(13, _omitEnumNames ? '' : 'DEPOSIT_TXS_SEEN_IN_NETWORK');
static const Trade_State DEPOSIT_TXS_CONFIRMED_IN_BLOCKCHAIN = Trade_State._(14, _omitEnumNames ? '' : 'DEPOSIT_TXS_CONFIRMED_IN_BLOCKCHAIN');
static const Trade_State DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN = Trade_State._(15, _omitEnumNames ? '' : 'DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN');
static const Trade_State BUYER_CONFIRMED_PAYMENT_SENT = Trade_State._(16, _omitEnumNames ? '' : 'BUYER_CONFIRMED_PAYMENT_SENT');
static const Trade_State BUYER_SENT_PAYMENT_SENT_MSG = Trade_State._(17, _omitEnumNames ? '' : 'BUYER_SENT_PAYMENT_SENT_MSG');
static const Trade_State BUYER_SEND_FAILED_PAYMENT_SENT_MSG = Trade_State._(18, _omitEnumNames ? '' : 'BUYER_SEND_FAILED_PAYMENT_SENT_MSG');
static const Trade_State BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG = Trade_State._(19, _omitEnumNames ? '' : 'BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG');
static const Trade_State BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG = Trade_State._(20, _omitEnumNames ? '' : 'BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG');
static const Trade_State SELLER_RECEIVED_PAYMENT_SENT_MSG = Trade_State._(21, _omitEnumNames ? '' : 'SELLER_RECEIVED_PAYMENT_SENT_MSG');
static const Trade_State SELLER_CONFIRMED_PAYMENT_RECEIPT = Trade_State._(22, _omitEnumNames ? '' : 'SELLER_CONFIRMED_PAYMENT_RECEIPT');
static const Trade_State SELLER_SENT_PAYMENT_RECEIVED_MSG = Trade_State._(23, _omitEnumNames ? '' : 'SELLER_SENT_PAYMENT_RECEIVED_MSG');
static const Trade_State SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG = Trade_State._(24, _omitEnumNames ? '' : 'SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG');
static const Trade_State SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG = Trade_State._(25, _omitEnumNames ? '' : 'SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG');
static const Trade_State SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG = Trade_State._(26, _omitEnumNames ? '' : 'SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG');
static const $core.List<Trade_State> values = <Trade_State> [
PB_ERROR_STATE,
PREPARATION,
MULTISIG_PREPARED,
MULTISIG_MADE,
MULTISIG_EXCHANGED,
MULTISIG_COMPLETED,
CONTRACT_SIGNATURE_REQUESTED,
CONTRACT_SIGNED,
SENT_PUBLISH_DEPOSIT_TX_REQUEST,
SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST,
SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST,
PUBLISH_DEPOSIT_TX_REQUEST_FAILED,
ARBITRATOR_PUBLISHED_DEPOSIT_TXS,
DEPOSIT_TXS_SEEN_IN_NETWORK,
DEPOSIT_TXS_CONFIRMED_IN_BLOCKCHAIN,
DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN,
BUYER_CONFIRMED_PAYMENT_SENT,
BUYER_SENT_PAYMENT_SENT_MSG,
BUYER_SEND_FAILED_PAYMENT_SENT_MSG,
BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG,
BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG,
SELLER_RECEIVED_PAYMENT_SENT_MSG,
SELLER_CONFIRMED_PAYMENT_RECEIPT,
SELLER_SENT_PAYMENT_RECEIVED_MSG,
SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG,
SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG,
SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG,
];
static final $core.Map<$core.int, Trade_State> _byValue = $pb.ProtobufEnum.initByValue(values);
static Trade_State? valueOf($core.int value) => _byValue[value];
const Trade_State._($core.int v, $core.String n) : super(v, n);
}
class Trade_Phase extends $pb.ProtobufEnum {
static const Trade_Phase PB_ERROR_PHASE = Trade_Phase._(0, _omitEnumNames ? '' : 'PB_ERROR_PHASE');
static const Trade_Phase INIT = Trade_Phase._(1, _omitEnumNames ? '' : 'INIT');
static const Trade_Phase DEPOSIT_REQUESTED = Trade_Phase._(2, _omitEnumNames ? '' : 'DEPOSIT_REQUESTED');
static const Trade_Phase DEPOSITS_PUBLISHED = Trade_Phase._(3, _omitEnumNames ? '' : 'DEPOSITS_PUBLISHED');
static const Trade_Phase DEPOSITS_CONFIRMED = Trade_Phase._(4, _omitEnumNames ? '' : 'DEPOSITS_CONFIRMED');
static const Trade_Phase DEPOSITS_UNLOCKED = Trade_Phase._(5, _omitEnumNames ? '' : 'DEPOSITS_UNLOCKED');
static const Trade_Phase PAYMENT_SENT = Trade_Phase._(6, _omitEnumNames ? '' : 'PAYMENT_SENT');
static const Trade_Phase PAYMENT_RECEIVED = Trade_Phase._(7, _omitEnumNames ? '' : 'PAYMENT_RECEIVED');
static const $core.List<Trade_Phase> values = <Trade_Phase> [
PB_ERROR_PHASE,
INIT,
DEPOSIT_REQUESTED,
DEPOSITS_PUBLISHED,
DEPOSITS_CONFIRMED,
DEPOSITS_UNLOCKED,
PAYMENT_SENT,
PAYMENT_RECEIVED,
];
static final $core.Map<$core.int, Trade_Phase> _byValue = $pb.ProtobufEnum.initByValue(values);
static Trade_Phase? valueOf($core.int value) => _byValue[value];
const Trade_Phase._($core.int v, $core.String n) : super(v, n);
}
class Trade_PayoutState extends $pb.ProtobufEnum {
static const Trade_PayoutState PAYOUT_UNPUBLISHED = Trade_PayoutState._(0, _omitEnumNames ? '' : 'PAYOUT_UNPUBLISHED');
static const Trade_PayoutState PAYOUT_PUBLISHED = Trade_PayoutState._(1, _omitEnumNames ? '' : 'PAYOUT_PUBLISHED');
static const Trade_PayoutState PAYOUT_CONFIRMED = Trade_PayoutState._(2, _omitEnumNames ? '' : 'PAYOUT_CONFIRMED');
static const Trade_PayoutState PAYOUT_UNLOCKED = Trade_PayoutState._(3, _omitEnumNames ? '' : 'PAYOUT_UNLOCKED');
static const $core.List<Trade_PayoutState> values = <Trade_PayoutState> [
PAYOUT_UNPUBLISHED,
PAYOUT_PUBLISHED,
PAYOUT_CONFIRMED,
PAYOUT_UNLOCKED,
];
static final $core.Map<$core.int, Trade_PayoutState> _byValue = $pb.ProtobufEnum.initByValue(values);
static Trade_PayoutState? valueOf($core.int value) => _byValue[value];
const Trade_PayoutState._($core.int v, $core.String n) : super(v, n);
}
class Trade_DisputeState extends $pb.ProtobufEnum {
static const Trade_DisputeState PB_ERROR_DISPUTE_STATE = Trade_DisputeState._(0, _omitEnumNames ? '' : 'PB_ERROR_DISPUTE_STATE');
static const Trade_DisputeState NO_DISPUTE = Trade_DisputeState._(1, _omitEnumNames ? '' : 'NO_DISPUTE');
static const Trade_DisputeState DISPUTE_REQUESTED = Trade_DisputeState._(2, _omitEnumNames ? '' : 'DISPUTE_REQUESTED');
static const Trade_DisputeState DISPUTE_OPENED = Trade_DisputeState._(3, _omitEnumNames ? '' : 'DISPUTE_OPENED');
static const Trade_DisputeState ARBITRATOR_SENT_DISPUTE_CLOSED_MSG = Trade_DisputeState._(4, _omitEnumNames ? '' : 'ARBITRATOR_SENT_DISPUTE_CLOSED_MSG');
static const Trade_DisputeState ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG = Trade_DisputeState._(5, _omitEnumNames ? '' : 'ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG');
static const Trade_DisputeState ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG = Trade_DisputeState._(6, _omitEnumNames ? '' : 'ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG');
static const Trade_DisputeState ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG = Trade_DisputeState._(7, _omitEnumNames ? '' : 'ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG');
static const Trade_DisputeState DISPUTE_CLOSED = Trade_DisputeState._(8, _omitEnumNames ? '' : 'DISPUTE_CLOSED');
static const Trade_DisputeState MEDIATION_REQUESTED = Trade_DisputeState._(9, _omitEnumNames ? '' : 'MEDIATION_REQUESTED');
static const Trade_DisputeState MEDIATION_STARTED_BY_PEER = Trade_DisputeState._(10, _omitEnumNames ? '' : 'MEDIATION_STARTED_BY_PEER');
static const Trade_DisputeState MEDIATION_CLOSED = Trade_DisputeState._(11, _omitEnumNames ? '' : 'MEDIATION_CLOSED');
static const Trade_DisputeState REFUND_REQUESTED = Trade_DisputeState._(12, _omitEnumNames ? '' : 'REFUND_REQUESTED');
static const Trade_DisputeState REFUND_REQUEST_STARTED_BY_PEER = Trade_DisputeState._(13, _omitEnumNames ? '' : 'REFUND_REQUEST_STARTED_BY_PEER');
static const Trade_DisputeState REFUND_REQUEST_CLOSED = Trade_DisputeState._(14, _omitEnumNames ? '' : 'REFUND_REQUEST_CLOSED');
static const $core.List<Trade_DisputeState> values = <Trade_DisputeState> [
PB_ERROR_DISPUTE_STATE,
NO_DISPUTE,
DISPUTE_REQUESTED,
DISPUTE_OPENED,
ARBITRATOR_SENT_DISPUTE_CLOSED_MSG,
ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG,
ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG,
ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG,
DISPUTE_CLOSED,
MEDIATION_REQUESTED,
MEDIATION_STARTED_BY_PEER,
MEDIATION_CLOSED,
REFUND_REQUESTED,
REFUND_REQUEST_STARTED_BY_PEER,
REFUND_REQUEST_CLOSED,
];
static final $core.Map<$core.int, Trade_DisputeState> _byValue = $pb.ProtobufEnum.initByValue(values);
static Trade_DisputeState? valueOf($core.int value) => _byValue[value];
const Trade_DisputeState._($core.int v, $core.String n) : super(v, n);
}
class Trade_TradePeriodState extends $pb.ProtobufEnum {
static const Trade_TradePeriodState PB_ERROR_TRADE_PERIOD_STATE = Trade_TradePeriodState._(0, _omitEnumNames ? '' : 'PB_ERROR_TRADE_PERIOD_STATE');
static const Trade_TradePeriodState FIRST_HALF = Trade_TradePeriodState._(1, _omitEnumNames ? '' : 'FIRST_HALF');
static const Trade_TradePeriodState SECOND_HALF = Trade_TradePeriodState._(2, _omitEnumNames ? '' : 'SECOND_HALF');
static const Trade_TradePeriodState TRADE_PERIOD_OVER = Trade_TradePeriodState._(3, _omitEnumNames ? '' : 'TRADE_PERIOD_OVER');
static const $core.List<Trade_TradePeriodState> values = <Trade_TradePeriodState> [
PB_ERROR_TRADE_PERIOD_STATE,
FIRST_HALF,
SECOND_HALF,
TRADE_PERIOD_OVER,
];
static final $core.Map<$core.int, Trade_TradePeriodState> _byValue = $pb.ProtobufEnum.initByValue(values);
static Trade_TradePeriodState? valueOf($core.int value) => _byValue[value];
const Trade_TradePeriodState._($core.int v, $core.String n) : super(v, n);
}
class PaymentAccountForm_FormId extends $pb.ProtobufEnum {
static const PaymentAccountForm_FormId BLOCK_CHAINS = PaymentAccountForm_FormId._(0, _omitEnumNames ? '' : 'BLOCK_CHAINS');
static const PaymentAccountForm_FormId REVOLUT = PaymentAccountForm_FormId._(1, _omitEnumNames ? '' : 'REVOLUT');
static const PaymentAccountForm_FormId SEPA = PaymentAccountForm_FormId._(2, _omitEnumNames ? '' : 'SEPA');
static const PaymentAccountForm_FormId SEPA_INSTANT = PaymentAccountForm_FormId._(3, _omitEnumNames ? '' : 'SEPA_INSTANT');
static const PaymentAccountForm_FormId TRANSFERWISE = PaymentAccountForm_FormId._(4, _omitEnumNames ? '' : 'TRANSFERWISE');
static const PaymentAccountForm_FormId ZELLE = PaymentAccountForm_FormId._(5, _omitEnumNames ? '' : 'ZELLE');
static const PaymentAccountForm_FormId SWIFT = PaymentAccountForm_FormId._(6, _omitEnumNames ? '' : 'SWIFT');
static const PaymentAccountForm_FormId F2F = PaymentAccountForm_FormId._(7, _omitEnumNames ? '' : 'F2F');
static const PaymentAccountForm_FormId STRIKE = PaymentAccountForm_FormId._(8, _omitEnumNames ? '' : 'STRIKE');
static const PaymentAccountForm_FormId MONEY_GRAM = PaymentAccountForm_FormId._(9, _omitEnumNames ? '' : 'MONEY_GRAM');
static const PaymentAccountForm_FormId FASTER_PAYMENTS = PaymentAccountForm_FormId._(10, _omitEnumNames ? '' : 'FASTER_PAYMENTS');
static const PaymentAccountForm_FormId UPHOLD = PaymentAccountForm_FormId._(11, _omitEnumNames ? '' : 'UPHOLD');
static const PaymentAccountForm_FormId PAXUM = PaymentAccountForm_FormId._(12, _omitEnumNames ? '' : 'PAXUM');
static const PaymentAccountForm_FormId PAY_BY_MAIL = PaymentAccountForm_FormId._(13, _omitEnumNames ? '' : 'PAY_BY_MAIL');
static const PaymentAccountForm_FormId CASH_AT_ATM = PaymentAccountForm_FormId._(14, _omitEnumNames ? '' : 'CASH_AT_ATM');
static const PaymentAccountForm_FormId AUSTRALIA_PAYID = PaymentAccountForm_FormId._(15, _omitEnumNames ? '' : 'AUSTRALIA_PAYID');
static const PaymentAccountForm_FormId CASH_APP = PaymentAccountForm_FormId._(16, _omitEnumNames ? '' : 'CASH_APP');
static const PaymentAccountForm_FormId PAYPAL = PaymentAccountForm_FormId._(17, _omitEnumNames ? '' : 'PAYPAL');
static const PaymentAccountForm_FormId VENMO = PaymentAccountForm_FormId._(18, _omitEnumNames ? '' : 'VENMO');
static const $core.List<PaymentAccountForm_FormId> values = <PaymentAccountForm_FormId> [
BLOCK_CHAINS,
REVOLUT,
SEPA,
SEPA_INSTANT,
TRANSFERWISE,
ZELLE,
SWIFT,
F2F,
STRIKE,
MONEY_GRAM,
FASTER_PAYMENTS,
UPHOLD,
PAXUM,
PAY_BY_MAIL,
CASH_AT_ATM,
AUSTRALIA_PAYID,
CASH_APP,
PAYPAL,
VENMO,
];
static final $core.Map<$core.int, PaymentAccountForm_FormId> _byValue = $pb.ProtobufEnum.initByValue(values);
static PaymentAccountForm_FormId? valueOf($core.int value) => _byValue[value];
const PaymentAccountForm_FormId._($core.int v, $core.String n) : super(v, n);
}
class PaymentAccountFormField_FieldId extends $pb.ProtobufEnum {
static const PaymentAccountFormField_FieldId ADDRESS = PaymentAccountFormField_FieldId._(0, _omitEnumNames ? '' : 'ADDRESS');
static const PaymentAccountFormField_FieldId ACCEPTED_COUNTRY_CODES = PaymentAccountFormField_FieldId._(1, _omitEnumNames ? '' : 'ACCEPTED_COUNTRY_CODES');
static const PaymentAccountFormField_FieldId ACCOUNT_ID = PaymentAccountFormField_FieldId._(2, _omitEnumNames ? '' : 'ACCOUNT_ID');
static const PaymentAccountFormField_FieldId ACCOUNT_NAME = PaymentAccountFormField_FieldId._(3, _omitEnumNames ? '' : 'ACCOUNT_NAME');
static const PaymentAccountFormField_FieldId ACCOUNT_NR = PaymentAccountFormField_FieldId._(4, _omitEnumNames ? '' : 'ACCOUNT_NR');
static const PaymentAccountFormField_FieldId ACCOUNT_OWNER = PaymentAccountFormField_FieldId._(5, _omitEnumNames ? '' : 'ACCOUNT_OWNER');
static const PaymentAccountFormField_FieldId ACCOUNT_TYPE = PaymentAccountFormField_FieldId._(6, _omitEnumNames ? '' : 'ACCOUNT_TYPE');
static const PaymentAccountFormField_FieldId ANSWER = PaymentAccountFormField_FieldId._(7, _omitEnumNames ? '' : 'ANSWER');
static const PaymentAccountFormField_FieldId BANK_ACCOUNT_NAME = PaymentAccountFormField_FieldId._(8, _omitEnumNames ? '' : 'BANK_ACCOUNT_NAME');
static const PaymentAccountFormField_FieldId BANK_ACCOUNT_NUMBER = PaymentAccountFormField_FieldId._(9, _omitEnumNames ? '' : 'BANK_ACCOUNT_NUMBER');
static const PaymentAccountFormField_FieldId BANK_ACCOUNT_TYPE = PaymentAccountFormField_FieldId._(10, _omitEnumNames ? '' : 'BANK_ACCOUNT_TYPE');
static const PaymentAccountFormField_FieldId BANK_ADDRESS = PaymentAccountFormField_FieldId._(11, _omitEnumNames ? '' : 'BANK_ADDRESS');
static const PaymentAccountFormField_FieldId BANK_BRANCH = PaymentAccountFormField_FieldId._(12, _omitEnumNames ? '' : 'BANK_BRANCH');
static const PaymentAccountFormField_FieldId BANK_BRANCH_CODE = PaymentAccountFormField_FieldId._(13, _omitEnumNames ? '' : 'BANK_BRANCH_CODE');
static const PaymentAccountFormField_FieldId BANK_BRANCH_NAME = PaymentAccountFormField_FieldId._(14, _omitEnumNames ? '' : 'BANK_BRANCH_NAME');
static const PaymentAccountFormField_FieldId BANK_CODE = PaymentAccountFormField_FieldId._(15, _omitEnumNames ? '' : 'BANK_CODE');
static const PaymentAccountFormField_FieldId BANK_COUNTRY_CODE = PaymentAccountFormField_FieldId._(16, _omitEnumNames ? '' : 'BANK_COUNTRY_CODE');
static const PaymentAccountFormField_FieldId BANK_ID = PaymentAccountFormField_FieldId._(17, _omitEnumNames ? '' : 'BANK_ID');
static const PaymentAccountFormField_FieldId BANK_NAME = PaymentAccountFormField_FieldId._(18, _omitEnumNames ? '' : 'BANK_NAME');
static const PaymentAccountFormField_FieldId BANK_SWIFT_CODE = PaymentAccountFormField_FieldId._(19, _omitEnumNames ? '' : 'BANK_SWIFT_CODE');
static const PaymentAccountFormField_FieldId BENEFICIARY_ACCOUNT_NR = PaymentAccountFormField_FieldId._(20, _omitEnumNames ? '' : 'BENEFICIARY_ACCOUNT_NR');
static const PaymentAccountFormField_FieldId BENEFICIARY_ADDRESS = PaymentAccountFormField_FieldId._(21, _omitEnumNames ? '' : 'BENEFICIARY_ADDRESS');
static const PaymentAccountFormField_FieldId BENEFICIARY_CITY = PaymentAccountFormField_FieldId._(22, _omitEnumNames ? '' : 'BENEFICIARY_CITY');
static const PaymentAccountFormField_FieldId BENEFICIARY_NAME = PaymentAccountFormField_FieldId._(23, _omitEnumNames ? '' : 'BENEFICIARY_NAME');
static const PaymentAccountFormField_FieldId BENEFICIARY_PHONE = PaymentAccountFormField_FieldId._(24, _omitEnumNames ? '' : 'BENEFICIARY_PHONE');
static const PaymentAccountFormField_FieldId BIC = PaymentAccountFormField_FieldId._(25, _omitEnumNames ? '' : 'BIC');
static const PaymentAccountFormField_FieldId BRANCH_ID = PaymentAccountFormField_FieldId._(26, _omitEnumNames ? '' : 'BRANCH_ID');
static const PaymentAccountFormField_FieldId CITY = PaymentAccountFormField_FieldId._(27, _omitEnumNames ? '' : 'CITY');
static const PaymentAccountFormField_FieldId CONTACT = PaymentAccountFormField_FieldId._(28, _omitEnumNames ? '' : 'CONTACT');
static const PaymentAccountFormField_FieldId COUNTRY = PaymentAccountFormField_FieldId._(29, _omitEnumNames ? '' : 'COUNTRY');
static const PaymentAccountFormField_FieldId EMAIL = PaymentAccountFormField_FieldId._(30, _omitEnumNames ? '' : 'EMAIL');
static const PaymentAccountFormField_FieldId EMAIL_OR_MOBILE_NR = PaymentAccountFormField_FieldId._(31, _omitEnumNames ? '' : 'EMAIL_OR_MOBILE_NR');
static const PaymentAccountFormField_FieldId EXTRA_INFO = PaymentAccountFormField_FieldId._(32, _omitEnumNames ? '' : 'EXTRA_INFO');
static const PaymentAccountFormField_FieldId HOLDER_ADDRESS = PaymentAccountFormField_FieldId._(33, _omitEnumNames ? '' : 'HOLDER_ADDRESS');
static const PaymentAccountFormField_FieldId HOLDER_EMAIL = PaymentAccountFormField_FieldId._(34, _omitEnumNames ? '' : 'HOLDER_EMAIL');
static const PaymentAccountFormField_FieldId HOLDER_NAME = PaymentAccountFormField_FieldId._(35, _omitEnumNames ? '' : 'HOLDER_NAME');
static const PaymentAccountFormField_FieldId HOLDER_TAX_ID = PaymentAccountFormField_FieldId._(36, _omitEnumNames ? '' : 'HOLDER_TAX_ID');
static const PaymentAccountFormField_FieldId IBAN = PaymentAccountFormField_FieldId._(37, _omitEnumNames ? '' : 'IBAN');
static const PaymentAccountFormField_FieldId IFSC = PaymentAccountFormField_FieldId._(38, _omitEnumNames ? '' : 'IFSC');
static const PaymentAccountFormField_FieldId INTERMEDIARY_ADDRESS = PaymentAccountFormField_FieldId._(39, _omitEnumNames ? '' : 'INTERMEDIARY_ADDRESS');
static const PaymentAccountFormField_FieldId INTERMEDIARY_BRANCH = PaymentAccountFormField_FieldId._(40, _omitEnumNames ? '' : 'INTERMEDIARY_BRANCH');
static const PaymentAccountFormField_FieldId INTERMEDIARY_COUNTRY_CODE = PaymentAccountFormField_FieldId._(41, _omitEnumNames ? '' : 'INTERMEDIARY_COUNTRY_CODE');
static const PaymentAccountFormField_FieldId INTERMEDIARY_NAME = PaymentAccountFormField_FieldId._(42, _omitEnumNames ? '' : 'INTERMEDIARY_NAME');
static const PaymentAccountFormField_FieldId INTERMEDIARY_SWIFT_CODE = PaymentAccountFormField_FieldId._(43, _omitEnumNames ? '' : 'INTERMEDIARY_SWIFT_CODE');
static const PaymentAccountFormField_FieldId MOBILE_NR = PaymentAccountFormField_FieldId._(44, _omitEnumNames ? '' : 'MOBILE_NR');
static const PaymentAccountFormField_FieldId NATIONAL_ACCOUNT_ID = PaymentAccountFormField_FieldId._(45, _omitEnumNames ? '' : 'NATIONAL_ACCOUNT_ID');
static const PaymentAccountFormField_FieldId PAYID = PaymentAccountFormField_FieldId._(46, _omitEnumNames ? '' : 'PAYID');
static const PaymentAccountFormField_FieldId PIX_KEY = PaymentAccountFormField_FieldId._(47, _omitEnumNames ? '' : 'PIX_KEY');
static const PaymentAccountFormField_FieldId POSTAL_ADDRESS = PaymentAccountFormField_FieldId._(48, _omitEnumNames ? '' : 'POSTAL_ADDRESS');
static const PaymentAccountFormField_FieldId PROMPT_PAY_ID = PaymentAccountFormField_FieldId._(49, _omitEnumNames ? '' : 'PROMPT_PAY_ID');
static const PaymentAccountFormField_FieldId QUESTION = PaymentAccountFormField_FieldId._(50, _omitEnumNames ? '' : 'QUESTION');
static const PaymentAccountFormField_FieldId REQUIREMENTS = PaymentAccountFormField_FieldId._(51, _omitEnumNames ? '' : 'REQUIREMENTS');
static const PaymentAccountFormField_FieldId SALT = PaymentAccountFormField_FieldId._(52, _omitEnumNames ? '' : 'SALT');
static const PaymentAccountFormField_FieldId SORT_CODE = PaymentAccountFormField_FieldId._(53, _omitEnumNames ? '' : 'SORT_CODE');
static const PaymentAccountFormField_FieldId SPECIAL_INSTRUCTIONS = PaymentAccountFormField_FieldId._(54, _omitEnumNames ? '' : 'SPECIAL_INSTRUCTIONS');
static const PaymentAccountFormField_FieldId STATE = PaymentAccountFormField_FieldId._(55, _omitEnumNames ? '' : 'STATE');
static const PaymentAccountFormField_FieldId TRADE_CURRENCIES = PaymentAccountFormField_FieldId._(56, _omitEnumNames ? '' : 'TRADE_CURRENCIES');
static const PaymentAccountFormField_FieldId USERNAME = PaymentAccountFormField_FieldId._(57, _omitEnumNames ? '' : 'USERNAME');
static const PaymentAccountFormField_FieldId EMAIL_OR_MOBILE_NR_OR_USERNAME = PaymentAccountFormField_FieldId._(58, _omitEnumNames ? '' : 'EMAIL_OR_MOBILE_NR_OR_USERNAME');
static const PaymentAccountFormField_FieldId EMAIL_OR_MOBILE_NR_OR_CASHTAG = PaymentAccountFormField_FieldId._(59, _omitEnumNames ? '' : 'EMAIL_OR_MOBILE_NR_OR_CASHTAG');
static const $core.List<PaymentAccountFormField_FieldId> values = <PaymentAccountFormField_FieldId> [
ADDRESS,
ACCEPTED_COUNTRY_CODES,
ACCOUNT_ID,
ACCOUNT_NAME,
ACCOUNT_NR,
ACCOUNT_OWNER,
ACCOUNT_TYPE,
ANSWER,
BANK_ACCOUNT_NAME,
BANK_ACCOUNT_NUMBER,
BANK_ACCOUNT_TYPE,
BANK_ADDRESS,
BANK_BRANCH,
BANK_BRANCH_CODE,
BANK_BRANCH_NAME,
BANK_CODE,
BANK_COUNTRY_CODE,
BANK_ID,
BANK_NAME,
BANK_SWIFT_CODE,
BENEFICIARY_ACCOUNT_NR,
BENEFICIARY_ADDRESS,
BENEFICIARY_CITY,
BENEFICIARY_NAME,
BENEFICIARY_PHONE,
BIC,
BRANCH_ID,
CITY,
CONTACT,
COUNTRY,
EMAIL,
EMAIL_OR_MOBILE_NR,
EXTRA_INFO,
HOLDER_ADDRESS,
HOLDER_EMAIL,
HOLDER_NAME,
HOLDER_TAX_ID,
IBAN,
IFSC,
INTERMEDIARY_ADDRESS,
INTERMEDIARY_BRANCH,
INTERMEDIARY_COUNTRY_CODE,
INTERMEDIARY_NAME,
INTERMEDIARY_SWIFT_CODE,
MOBILE_NR,
NATIONAL_ACCOUNT_ID,
PAYID,
PIX_KEY,
POSTAL_ADDRESS,
PROMPT_PAY_ID,
QUESTION,
REQUIREMENTS,
SALT,
SORT_CODE,
SPECIAL_INSTRUCTIONS,
STATE,
TRADE_CURRENCIES,
USERNAME,
EMAIL_OR_MOBILE_NR_OR_USERNAME,
EMAIL_OR_MOBILE_NR_OR_CASHTAG,
];
static final $core.Map<$core.int, PaymentAccountFormField_FieldId> _byValue = $pb.ProtobufEnum.initByValue(values);
static PaymentAccountFormField_FieldId? valueOf($core.int value) => _byValue[value];
const PaymentAccountFormField_FieldId._($core.int v, $core.String n) : super(v, n);
}
class PaymentAccountFormField_Component extends $pb.ProtobufEnum {
static const PaymentAccountFormField_Component TEXT = PaymentAccountFormField_Component._(0, _omitEnumNames ? '' : 'TEXT');
static const PaymentAccountFormField_Component TEXTAREA = PaymentAccountFormField_Component._(1, _omitEnumNames ? '' : 'TEXTAREA');
static const PaymentAccountFormField_Component SELECT_ONE = PaymentAccountFormField_Component._(2, _omitEnumNames ? '' : 'SELECT_ONE');
static const PaymentAccountFormField_Component SELECT_MULTIPLE = PaymentAccountFormField_Component._(3, _omitEnumNames ? '' : 'SELECT_MULTIPLE');
static const $core.List<PaymentAccountFormField_Component> values = <PaymentAccountFormField_Component> [
TEXT,
TEXTAREA,
SELECT_ONE,
SELECT_MULTIPLE,
];
static final $core.Map<$core.int, PaymentAccountFormField_Component> _byValue = $pb.ProtobufEnum.initByValue(values);
static PaymentAccountFormField_Component? valueOf($core.int value) => _byValue[value];
const PaymentAccountFormField_Component._($core.int v, $core.String n) : super(v, n);
}
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');

File diff suppressed because it is too large Load diff

1101
lib/proto/src/grpc.proto Normal file

File diff suppressed because it is too large Load diff

1965
lib/proto/src/pb.proto Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class AccountProvider with ChangeNotifier {
final HavenoService _havenoService;
bool? _accountExists;
AccountProvider(this._havenoService);
bool? get accountExists => _accountExists;
Future<void> checkAccountExists() async {
try {
final accountExistsReply = await _havenoService.accountClient
.accountExists(AccountExistsRequest());
_accountExists = accountExistsReply.accountExists;
notifyListeners();
} catch (e) {
print("Failed to check if account exists: $e");
}
}
}

View file

@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class GetVersionProvider with ChangeNotifier {
final HavenoService _havenoService;
String? _version;
GetVersionProvider(this._havenoService);
String? get version => _version;
Future<void> fetchVersion() async {
try {
final versionReply =
await _havenoService.getVersionClient.getVersion(GetVersionRequest());
_version = versionReply.version;
notifyListeners();
} catch (e) {
print("Failed to get Haveno version: $e");
}
}
}

View file

@ -0,0 +1,108 @@
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
import 'package:fixnum/fixnum.dart' as fixnum;
class OffersProvider with ChangeNotifier {
final HavenoService _havenoService;
List<OfferInfo>? _offers;
List<OfferInfo>? _createdOffers = [];
OfferInfo? _lastCreatedOffer;
String? _lastCancelledOfferId;
List<OfferInfo>? _myOffers = [];
OffersProvider(this._havenoService);
List<OfferInfo>? get offers => _offers;
List<OfferInfo>? get marketBuyOffers =>
_offers?.where((offer) => offer.direction == 'SELL').toList();
List<OfferInfo>? get marketSellOffers =>
_offers?.where((offer) => offer.direction == 'BUY').toList();
List<OfferInfo>? get createdOffers => _createdOffers;
OfferInfo? get lastCreatedOffer => _lastCreatedOffer;
String? get lastCancelledOffer => _lastCancelledOfferId;
List<OfferInfo>? get myOffers => _myOffers;
List<OfferInfo>? get mySellOffers =>
_myOffers?.where((offer) => offer.direction == 'BUY').toList();
List<OfferInfo>? get myBuyOffers =>
_myOffers?.where((offer) => offer.direction == 'SELL').toList();
Future<void> getOffers() async {
try {
final getOffersReply =
await _havenoService.offersClient.getOffers(GetOffersRequest());
_offers = getOffersReply.offers;
notifyListeners();
} catch (e) {
print("Failed to get offers: $e");
}
}
Future<void> getMyOffers() async {
try {
final getMyOffersReply =
await _havenoService.offersClient.getMyOffers(GetMyOffersRequest());
_myOffers = getMyOffersReply.offers;
notifyListeners();
} catch (e) {
print("Failed to get offers: $e");
}
}
Future<void> postOffer({
required String currencyCode,
required String direction,
required String price,
required bool useMarketBasedPrice,
required double marketPriceMarginPct,
required fixnum.Int64 amount,
required fixnum.Int64 minAmount,
required double buyerSecurityDepositPct,
required String triggerPrice,
required bool reserveExactAmount,
required String paymentAccountId,
}) async {
try {
final postOfferResponse = await _havenoService.offersClient.postOffer(
PostOfferRequest(
currencyCode: currencyCode,
direction: direction,
price: price,
useMarketBasedPrice: useMarketBasedPrice,
marketPriceMarginPct: marketPriceMarginPct,
amount: amount,
minAmount: minAmount,
buyerSecurityDepositPct: buyerSecurityDepositPct,
triggerPrice: triggerPrice,
reserveExactAmount: reserveExactAmount,
paymentAccountId: paymentAccountId,
),
);
final postedOffer = postOfferResponse.offer;
_createdOffers?.add(postedOffer);
_lastCreatedOffer = postedOffer;
_myOffers?.add(postedOffer);
notifyListeners();
} catch (e) {
print("Failed to post offer: $e");
rethrow;
}
}
Future<void> cancelOffer(String offerId) async {
try {
await _havenoService.offersClient
.cancelOffer(CancelOfferRequest(id: offerId));
_lastCancelledOfferId = offerId;
_myOffers?.removeWhere((offer) => offer.id == offerId);
notifyListeners();
} catch (e) {
print("Failed to cancel offer: $e");
rethrow;
}
}
String offerToString(OfferInfo offer) {
return 'Offer(id: ${offer.id}, direction: ${offer.direction}, price: ${offer.price}, amount: ${offer.amount}, minAmount: ${offer.minAmount}, volume: ${offer.volume}, minVolume: ${offer.minVolume}, baseCurrencyCode: ${offer.baseCurrencyCode}, date: ${offer.date}, state: ${offer.state}, paymentAccountId: ${offer.paymentAccountId}, paymentMethodId: ${offer.paymentMethodId})';
}
}

View file

@ -0,0 +1,144 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/proto/compiled/pb.pb.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pb.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class PaymentAccountsProvider with ChangeNotifier {
final Logger _logger = Logger('PaymentAccountsProvider');
final HavenoService _havenoService;
List<PaymentMethod>? _paymentMethods;
List<PaymentAccount>? _paymentAccounts;
PaymentAccountForm _paymentAccountForm = PaymentAccountForm();
bool _isLoadingPaymentMethods = false;
bool _isLoadingPaymentAccounts = false;
bool _isCreatingPaymentAccount = false;
String _paymentAccountFormJson = '';
PaymentAccountsProvider(this._havenoService) {
_initializeProvider();
}
Future<void> _initializeProvider() async {
await _validateAndLoadJsonFiles();
}
Future<void> _validateAndLoadJsonFiles() async {
try {
final directory = await getApplicationDocumentsDirectory();
final paymentMethodsFile =
File('${directory.path}/json/forms/PaymentAcountForm.json');
final paymentAccountsFile =
File('${directory.path}/json/forms/PaymentAcountForm.json');
if (await paymentMethodsFile.exists()) {
final paymentMethodsJson =
jsonDecode(await paymentMethodsFile.readAsString());
_paymentMethods = (paymentMethodsJson as List)
.map((json) => PaymentMethod.fromJson(json))
.toList();
} else {
_paymentMethods = [];
}
if (await paymentAccountsFile.exists()) {
final paymentAccountsJson =
jsonDecode(await paymentAccountsFile.readAsString());
_paymentAccounts = (paymentAccountsJson as List)
.map((json) => PaymentAccount.fromJson(json))
.toList();
} else {
_paymentAccounts = [];
}
} catch (e) {
print("Failed to load or validate JSON files: $e");
}
}
List<PaymentMethod>? get paymentMethods => _paymentMethods;
List<PaymentAccount>? get paymentAccounts => _paymentAccounts;
PaymentAccountForm get paymentAccountForm => _paymentAccountForm;
bool get isLoadingPaymentMethods => _isLoadingPaymentMethods;
bool get isLoadingPaymentAccounts => _isLoadingPaymentAccounts;
bool get isCreatingPaymentAccount => _isCreatingPaymentAccount;
Future<List<PaymentMethod>?> getPaymentMethods() async {
_isLoadingPaymentMethods = true;
notifyListeners();
try {
final getPaymentMethodsReply = await _havenoService.paymentAccountsClient
.getPaymentMethods(GetPaymentMethodsRequest());
_paymentMethods = getPaymentMethodsReply.paymentMethods;
} catch (e) {
print("Failed to get payment methods: $e");
} finally {
_isLoadingPaymentMethods = false;
notifyListeners();
}
return _paymentMethods;
}
Future<List<PaymentAccount>?> getPaymentAccounts() async {
_isLoadingPaymentAccounts = true;
notifyListeners();
try {
final getPaymentAccountsReply = await _havenoService.paymentAccountsClient
.getPaymentAccounts(GetPaymentAccountsRequest());
_paymentAccounts = getPaymentAccountsReply.paymentAccounts;
_paymentAccounts?.forEach((account) {
debugPrint(jsonEncode(account.toProto3Json()));
});
} catch (e) {
print("Failed to get payment accounts: $e");
} finally {
_isLoadingPaymentAccounts = false;
notifyListeners();
}
return paymentAccounts;
}
Future<PaymentAccountForm> getPaymentAcountForm(
String paymentMethodId) async {
final traditionalCurrencyPaymentAccountForm =
await _havenoService.paymentAccountsClient.getPaymentAccountForm(
GetPaymentAccountFormRequest(paymentMethodId: paymentMethodId));
_paymentAccountForm =
traditionalCurrencyPaymentAccountForm.paymentAccountForm;
print("Right after grabbing form");
_paymentAccountForm.fields.forEach((field) {
debugPrint(
"${field.component ?? ''} : ${field.label ?? ''} : ${field.type ?? ''} ");
debugPrint(jsonEncode(field.toProto3Json()));
});
debugPrint(_paymentAccountFormJson);
return _paymentAccountForm;
}
Future<PaymentAccount?> createPaymentAccount(
String paymentMethodId, PaymentAccountForm form) async {
try {
_isCreatingPaymentAccount = true;
notifyListeners();
final createdPaymentAccount = await _havenoService.paymentAccountsClient
.createPaymentAccount(
CreatePaymentAccountRequest(paymentAccountForm: form));
var paymentAccount = createdPaymentAccount.paymentAccount;
print("Created Payment Account: $paymentAccount");
_isCreatingPaymentAccount = false;
notifyListeners();
return paymentAccount;
} catch (e) {
print("Failed to create payment account: $e");
_isCreatingPaymentAccount = false;
notifyListeners();
}
return null;
}
}

View file

@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class PricesProvider with ChangeNotifier {
final HavenoService _havenoService;
List<MarketPriceInfo>? _marketPrices;
PricesProvider(this._havenoService);
List<MarketPriceInfo>? get prices => _marketPrices;
Future<void> getPrices() async {
try {
final getMarketPricesReply = await _havenoService.priceClient
.getMarketPrices(MarketPricesRequest());
_marketPrices = getMarketPricesReply.marketPrice;
_marketPrices?.forEach((price) {
print("Price: $price");
});
notifyListeners();
} catch (e) {
print("Failed to get prices: $e");
}
}
}

View file

@ -0,0 +1,110 @@
import 'package:fixnum/fixnum.dart' as fixnum;
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/proto/compiled/pb.pb.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class TradesProvider with ChangeNotifier {
final HavenoService _havenoService;
List<TradeInfo>? _trades;
TradeInfo? _currentTrade;
Map<String, List<ChatMessage>> _chatMessages = {};
TradesProvider(this._havenoService);
List<TradeInfo>? get trades => _trades;
TradeInfo? get currentTrade => _currentTrade;
Map<String, List<ChatMessage>> get chatMessages => _chatMessages;
Future<void> getTrades() async {
try {
final getTradesReply =
await _havenoService.tradesClient.getTrades(GetTradesRequest());
_trades = getTradesReply.trades;
_trades?.forEach((trade) {
print("Trade: $trade");
});
notifyListeners();
} catch (e) {
print("Failed to get trades: $e");
}
}
Future<TradeInfo?> getTrade(String? tradeId) async {
try {
final getTradeReply = await _havenoService.tradesClient
.getTrade(GetTradeRequest(tradeId: tradeId));
return getTradeReply.trade;
} catch (e) {
debugPrint("Failed to get trade: $e");
}
return null;
}
Future<void> takeOffer(
String? offerId, String? paymentAccountId, fixnum.Int64 amount) async {
try {
final takeOfferReply = await _havenoService.tradesClient.takeOffer(
TakeOfferRequest(
offerId: offerId,
paymentAccountId: paymentAccountId,
amount: amount));
_currentTrade = takeOfferReply.trade;
notifyListeners();
} catch (e) {
print("Failed to take trades: $e");
rethrow;
}
}
Future<void> sendChatMessage(String? tradeId, String? message) async {
try {
await _havenoService.tradesClient.sendChatMessage(
SendChatMessageRequest(tradeId: tradeId, message: message));
} catch (e) {
debugPrint("Failed to send trade chat message: $e");
rethrow;
}
}
Future<void> getChatMessages(String tradeId) async {
try {
final getChatMessagesReply = await _havenoService.tradesClient
.getChatMessages(GetChatMessagesRequest(tradeId: tradeId));
_chatMessages[tradeId] = getChatMessagesReply.message;
notifyListeners();
} catch (e) {
debugPrint("Failed to get trade chat messages: $e");
}
}
Future<void> confirmPaymentSent(String tradeId) async {
try {
await _havenoService.tradesClient
.confirmPaymentSent(ConfirmPaymentSentRequest(tradeId: tradeId));
} catch (e) {
debugPrint("Failed to confirm payment sent: $e");
rethrow;
}
}
Future<void> confirmPaymentReceived(String tradeId) async {
try {
await _havenoService.tradesClient.confirmPaymentReceived(
ConfirmPaymentReceivedRequest(tradeId: tradeId));
} catch (e) {
debugPrint("Failed to confirm payment sent: $e");
rethrow;
}
}
Future<void> completeTrade(String? tradeId) async {
try {
await _havenoService.tradesClient
.completeTrade(CompleteTradeRequest(tradeId: tradeId));
} catch (e) {
debugPrint("Failed to complete trade: $e");
rethrow;
}
}
}

View file

@ -0,0 +1,65 @@
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:haveno_flutter_app/services/haveno_service.dart';
class WalletsProvider with ChangeNotifier {
final HavenoService _havenoService;
BalancesInfo? _balances;
List<XmrTx>? _xmrTxs;
String? _xmrPrimaryAddress;
List<XmrIncomingTransfer> _xmrIncomingTransfers = [];
List<XmrOutgoingTransfer> _xmrOutgoingTransfers = [];
WalletsProvider(this._havenoService);
BalancesInfo? get balances => _balances;
String? get xmrPrimaryAddress => _xmrPrimaryAddress;
List<XmrTx>? get xmrTxs => _xmrTxs;
List<XmrIncomingTransfer> get xmrIncomingTransfers => _xmrIncomingTransfers;
List<XmrOutgoingTransfer> get xmrOutgoingTransfers => _xmrOutgoingTransfers;
Future<void> getBalances() async {
try {
final getBalancesReply =
await _havenoService.walletsClient.getBalances(GetBalancesRequest());
_balances = getBalancesReply.balances;
print("Balances: $_balances");
notifyListeners();
} catch (e) {
print("Failed to get balances: $e");
}
}
Future<void> getXmrPrimaryAddress() async {
try {
final getXmrPrimaryAddressReply = await _havenoService.walletsClient
.getXmrPrimaryAddress(GetXmrPrimaryAddressRequest());
_xmrPrimaryAddress = getXmrPrimaryAddressReply.primaryAddress;
print("Primary Address: $_xmrPrimaryAddress");
notifyListeners();
} catch (e) {
print("Failed to get primary address: $e");
}
}
Future<void> getXmrTxs() async {
try {
final getXmrTxsReply =
await _havenoService.walletsClient.getXmrTxs(GetXmrTxsRequest());
_xmrTxs = getXmrTxsReply.txs;
_xmrIncomingTransfers = [];
_xmrOutgoingTransfers = [];
_xmrTxs?.forEach((xmrTx) {
_xmrIncomingTransfers.addAll(xmrTx.incomingTransfers);
if (xmrTx.hasOutgoingTransfer()) {
_xmrOutgoingTransfers.add(xmrTx.outgoingTransfer);
}
});
notifyListeners();
} catch (e) {
debugPrint("Failed to get XMR transactions: $e");
}
}
}

View file

@ -0,0 +1,99 @@
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/widgets/payment_method_form.dart';
import 'package:provider/provider.dart';
import 'package:haveno_flutter_app/providers/payment_accounts_provider.dart';
class AccountsScreen extends StatefulWidget {
@override
_AccountsScreenState createState() => _AccountsScreenState();
}
class _AccountsScreenState extends State<AccountsScreen> {
@override
void initState() {
super.initState();
final paymentAccountsProvider =
Provider.of<PaymentAccountsProvider>(context, listen: false);
paymentAccountsProvider.getPaymentAccounts();
}
void _showCreateAccountForm(BuildContext context) {
final paymentAccountsProvider =
Provider.of<PaymentAccountsProvider>(context, listen: false);
paymentAccountsProvider.getPaymentMethods().then((_) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (BuildContext context) {
return PaymentMethodSelectionForm();
},
);
});
}
@override
Widget build(BuildContext context) {
final paymentAccountsProvider =
Provider.of<PaymentAccountsProvider>(context);
return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: AppBar(
title: const Text('Accounts'),
),
body: Consumer<PaymentAccountsProvider>(
builder: (context, provider, child) {
if (provider.isLoadingPaymentAccounts) {
return const Center(child: CircularProgressIndicator());
} else if (provider.paymentAccounts?.isEmpty ?? true) {
return const Center(
child: Text(
'You do not currently have any accounts',
style: TextStyle(color: Colors.white70, fontSize: 18),
),
);
} else {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ListView.builder(
itemCount: provider.paymentAccounts?.length ?? 0,
itemBuilder: (context, index) {
final account = provider.paymentAccounts![index];
return Card(
color: Theme.of(context).cardTheme.color,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${account.accountName}',
style: TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold),
),
const SizedBox(height: 8.0),
Text(
account.paymentMethod.id,
style: const TextStyle(color: Colors.white70),
),
],
),
),
);
},
),
);
}
},
),
floatingActionButton: FloatingActionButton(
onPressed: () => _showCreateAccountForm(context),
backgroundColor: Theme.of(context).colorScheme.primary,
child: Icon(Icons.add),
),
);
}
}

View file

@ -0,0 +1,346 @@
import 'dart:convert';
import 'package:fixnum/fixnum.dart';
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/utils/check_fiat.dart';
import 'package:provider/provider.dart';
import 'package:haveno_flutter_app/providers/trades_provider.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:flutter/services.dart';
class ActiveBuyerTradeTimelineScreen extends StatefulWidget {
final TradeInfo trade;
const ActiveBuyerTradeTimelineScreen({required this.trade});
@override
_ActiveBuyerTradeTimelineScreenState createState() =>
_ActiveBuyerTradeTimelineScreenState();
}
class _ActiveBuyerTradeTimelineScreenState
extends State<ActiveBuyerTradeTimelineScreen> {
PageController _pageController = PageController();
int _currentPage = 0;
@override
void initState() {
super.initState();
_initializePage();
_listenToPhaseUpdates();
}
void _initializePage() {
setState(() {
_currentPage = _getPhaseIndex(widget.trade.phase);
_pageController = PageController(initialPage: _currentPage);
});
}
Future<void> _completeTrade() async {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
await tradesProvider.completeTrade(widget.trade.tradeId);
//final fetchedTrade = await tradesProvider.getTrade(widget.trade.tradeId);
//debugPrint("Fetched Trade ${fetchedTrade?.role}");
}
void _listenToPhaseUpdates() {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
debugPrint(
"From getTrades() function: ${tradesProvider.trades?.last.amount}");
tradesProvider.addListener(() {
final updatedTrade = tradesProvider.trades
?.firstWhere((trade) => trade.tradeId == widget.trade.tradeId);
if (updatedTrade != null && updatedTrade.phase != widget.trade.phase) {
setState(() {
widget.trade.phase = updatedTrade.phase;
_currentPage = _getPhaseIndex(updatedTrade.phase);
_pageController.animateToPage(
_currentPage,
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
});
}
});
}
String _getPhaseText(String phase) {
switch (phase) {
case 'INIT':
return "Initializing Trade";
case 'DEPOSITS_PUBLISHED':
return "Transferring to Escrow";
case 'DEPOSITS_CONFIRMED':
return "Deposit Received";
case 'DEPOSITS_UNLOCKED':
return "Awaiting Your Payment";
case 'PAYMENT_SENT':
return "Seller Confirming Payment";
case 'PAYMENT_RECEIVED':
return "Payment Received";
default:
return phase;
}
}
int _getPhaseIndex(String phase) {
switch (phase) {
case 'INIT':
return 0;
case 'DEPOSITS_PUBLISHED':
return 1;
case 'DEPOSITS_CONFIRMED':
return 2;
case 'DEPOSITS_UNLOCKED':
return 3;
case 'PAYMENT_SENT':
return 4;
case 'PAYMENT_RECEIVED':
return 5;
default:
return 0;
}
}
Widget _buildPaymentDetails(String title, Map<String, dynamic> payload) {
return Card(
margin: const EdgeInsets.all(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
),
SizedBox(height: 10),
...payload.entries.map((entry) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextFormField(
initialValue: entry.value,
readOnly: true,
decoration: InputDecoration(
labelText: entry.key,
border: OutlineInputBorder(),
),
),
);
}).toList(),
SizedBox(height: 20),
],
),
),
);
}
Widget _buildCopyablePaymentDetails(
String title, Map<String, dynamic> payload) {
return Card(
margin: const EdgeInsets.all(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
),
SizedBox(height: 10),
...payload.entries.map((entry) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextFormField(
initialValue: entry.value,
readOnly: true,
decoration: InputDecoration(
labelText: entry.key,
border: OutlineInputBorder(),
suffixIcon: IconButton(
icon: Icon(Icons.copy),
onPressed: () {
Clipboard.setData(ClipboardData(text: entry.value));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Copied to clipboard')),
);
},
),
),
),
);
}).toList(),
SizedBox(height: 20),
],
),
),
);
}
Map<String, dynamic> _extractAccountPayload(Map<String, dynamic> json) {
return json.entries
.firstWhere((entry) => entry.key.contains('AccountPayload'))
.value as Map<String, dynamic>;
}
void _onPaidInFull() {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
tradesProvider.confirmPaymentSent(widget.trade.tradeId).catchError((error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Failed to confirm payment, please try again in a moment.')),
);
});
}
@override
Widget build(BuildContext context) {
final phases = [
'INIT',
'DEPOSITS_PUBLISHED',
'DEPOSITS_CONFIRMED',
'DEPOSITS_UNLOCKED',
'PAYMENT_SENT',
'PAYMENT_RECEIVED',
];
final int totalPages = phases.length;
final price = double.parse(widget.trade.price);
final amount =
formatXmr(widget.trade.amount, returnString: false) as double;
final totalAmount = amount * price;
final totalAmountFormatted =
formatFiat(totalAmount, widget.trade.offer.counterCurrencyCode);
final String currencyCode = widget.trade.offer.counterCurrencyCode;
return Scaffold(
appBar: AppBar(
title: Text('Active Trade Details'),
),
body: Column(
children: [
Expanded(
child: PageView.builder(
controller: _pageController,
physics: NeverScrollableScrollPhysics(),
itemCount: totalPages,
itemBuilder: (context, index) {
final phase = phases[index];
if (phase == 'DEPOSITS_UNLOCKED') {
final takerPaymentAccountJson = widget
.trade.contract.takerPaymentAccountPayload
.toProto3Json();
final makerPaymentAccountJson = widget
.trade.contract.makerPaymentAccountPayload
.toProto3Json();
debugPrint(jsonEncode(takerPaymentAccountJson));
debugPrint(jsonEncode(makerPaymentAccountJson));
final takerPaymentAccountPayload = _extractAccountPayload(
jsonDecode(jsonEncode(takerPaymentAccountJson)));
final makerPaymentAccountPayload = _extractAccountPayload(
jsonDecode(jsonEncode(makerPaymentAccountJson)));
return Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
SizedBox(height: 20),
Text(
_getPhaseText(phase),
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
Card(
margin: const EdgeInsets.all(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'You must pay a total of $totalAmountFormatted. Please be sure the amount is exact.',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
),
),
_buildPaymentDetails('You\'ll send from...',
takerPaymentAccountPayload),
_buildCopyablePaymentDetails(
'To the sellers account...',
makerPaymentAccountPayload),
SizedBox(height: 20),
ElevatedButton(
onPressed: _onPaidInFull,
child: Text('I have paid in full'),
),
],
),
),
);
}
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
SizedBox(height: 20),
Text(
_getPhaseText(phase),
style: TextStyle(fontSize: 24),
),
],
),
);
},
),
),
Padding(
padding: const EdgeInsets.only(bottom: 18.0, top: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(totalPages, (index) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 4.0),
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: index <= _currentPage ? Colors.green : Colors.grey,
),
);
}),
),
),
],
),
);
}
dynamic formatXmr(Int64? atomicUnits, {bool returnString = true}) {
if (atomicUnits == null) {
return returnString ? 'N/A' : null;
}
double value = atomicUnits.toInt() / 1e12;
return returnString ? value.toStringAsFixed(5) : value;
}
String formatFiat(double amount, String currencyCode) {
return isFiatCurrency(currencyCode)
? '${amount.toStringAsFixed(2)} $currencyCode'
: amount.toString();
}
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
}

View file

@ -0,0 +1,346 @@
import 'dart:convert';
import 'package:fixnum/fixnum.dart';
import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/utils/check_fiat.dart';
import 'package:provider/provider.dart';
import 'package:haveno_flutter_app/providers/trades_provider.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:flutter/services.dart';
class ActiveSellerTradeTimelineScreen extends StatefulWidget {
final TradeInfo trade;
const ActiveSellerTradeTimelineScreen({required this.trade});
@override
_ActiveSellerTradeTimelineScreenState createState() =>
_ActiveSellerTradeTimelineScreenState();
}
class _ActiveSellerTradeTimelineScreenState
extends State<ActiveSellerTradeTimelineScreen> {
PageController _pageController = PageController();
int _currentPage = 0;
@override
void initState() {
super.initState();
_initializePage();
_listenToPhaseUpdates();
}
void _initializePage() {
setState(() {
_currentPage = _getPhaseIndex(widget.trade.phase);
_pageController = PageController(initialPage: _currentPage);
});
}
Future<void> _completeTrade() async {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
await tradesProvider.completeTrade(widget.trade.tradeId);
}
void _listenToPhaseUpdates() {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
tradesProvider.addListener(() {
final updatedTrade = tradesProvider.trades
?.firstWhere((trade) => trade.tradeId == widget.trade.tradeId);
if (updatedTrade != null && updatedTrade.phase != widget.trade.phase) {
setState(() {
widget.trade.phase = updatedTrade.phase;
_currentPage = _getPhaseIndex(updatedTrade.phase);
_pageController.animateToPage(
_currentPage,
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
});
}
});
}
String _getPhaseText(String phase) {
switch (phase) {
case 'INIT':
return "Initializing Trade";
case 'DEPOSITS_PUBLISHED':
return "Sending to Escrow";
case 'DEPOSITS_CONFIRMED':
return "Deposit Sent";
case 'DEPOSITS_UNLOCKED':
return "Awaiting Payment";
case 'PAYMENT_SENT':
return "Confirm Payment Received";
case 'PAYMENT_RECEIVED':
return "Completed";
default:
return phase;
}
}
int _getPhaseIndex(String phase) {
switch (phase) {
case 'INIT':
return 0;
case 'DEPOSITS_PUBLISHED':
return 1;
case 'DEPOSITS_CONFIRMED':
return 2;
case 'DEPOSITS_UNLOCKED':
return 3;
case 'PAYMENT_SENT':
return 4;
case 'PAYMENT_RECEIVED':
return 5;
default:
return 0;
}
}
Widget _buildPaymentDetails(String title, Map<String, dynamic> payload) {
return Card(
margin: const EdgeInsets.all(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
),
SizedBox(height: 10),
...payload.entries.map((entry) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextFormField(
initialValue: entry.value,
readOnly: true,
decoration: InputDecoration(
labelText: entry.key,
border: OutlineInputBorder(),
),
),
);
}).toList(),
SizedBox(height: 20),
],
),
),
);
}
Widget _buildCopyablePaymentDetails(
String title, Map<String, dynamic> payload) {
return Card(
margin: const EdgeInsets.all(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
),
SizedBox(height: 10),
...payload.entries.map((entry) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextFormField(
initialValue: entry.value,
readOnly: true,
decoration: InputDecoration(
labelText: entry.key,
border: OutlineInputBorder(),
suffixIcon: IconButton(
icon: Icon(Icons.copy),
onPressed: () {
Clipboard.setData(ClipboardData(text: entry.value));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Copied to clipboard')),
);
},
),
),
),
);
}).toList(),
SizedBox(height: 20),
],
),
),
);
}
Map<String, dynamic> _extractAccountPayload(Map<String, dynamic> json) {
return json.entries
.firstWhere((entry) => entry.key.contains('AccountPayload'))
.value as Map<String, dynamic>;
}
void _onConfirmPaymentReceived() {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
tradesProvider
.confirmPaymentReceived(widget.trade.tradeId)
.catchError((error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Failed to confirm payment received, please try again in a moment.')),
);
});
}
@override
Widget build(BuildContext context) {
final phases = [
'INIT',
'DEPOSITS_PUBLISHED',
'DEPOSITS_CONFIRMED',
'DEPOSITS_UNLOCKED',
'PAYMENT_SENT',
'PAYMENT_RECEIVED',
];
final int totalPages = phases.length;
final price = double.parse(widget.trade.price);
final amount =
formatXmr(widget.trade.amount, returnString: false) as double;
final totalAmount = amount * price;
final totalAmountFormatted =
formatFiat(totalAmount, widget.trade.offer.counterCurrencyCode);
final String currencyCode = widget.trade.offer.counterCurrencyCode;
return Scaffold(
appBar: AppBar(
title: Text('Active Maker Trade Details'),
),
body: Column(
children: [
Expanded(
child: PageView.builder(
controller: _pageController,
physics: NeverScrollableScrollPhysics(),
itemCount: totalPages,
itemBuilder: (context, index) {
final phase = phases[index];
if (phase == 'PAYMENT_SENT') {
final takerPaymentAccountJson = widget
.trade.contract.takerPaymentAccountPayload
.toProto3Json();
final makerPaymentAccountJson = widget
.trade.contract.makerPaymentAccountPayload
.toProto3Json();
debugPrint(jsonEncode(takerPaymentAccountJson));
debugPrint(jsonEncode(makerPaymentAccountJson));
final takerPaymentAccountPayload = _extractAccountPayload(
jsonDecode(jsonEncode(takerPaymentAccountJson)));
final makerPaymentAccountPayload = _extractAccountPayload(
jsonDecode(jsonEncode(makerPaymentAccountJson)));
return Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
SizedBox(height: 20),
Text(
_getPhaseText(phase),
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
Card(
margin: const EdgeInsets.all(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'You should have received a total of $totalAmountFormatted from the following account:',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
),
),
_buildPaymentDetails(
'From account...', takerPaymentAccountPayload),
SizedBox(height: 20),
ElevatedButton(
onPressed: _onConfirmPaymentReceived,
child: Text('Confirm Payment Received'),
),
ElevatedButton(
onPressed: () {
// Add your logic to open chat here
},
child: Text('Open Chat'),
),
],
),
),
);
}
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
SizedBox(height: 20),
Text(
_getPhaseText(phase),
style: TextStyle(fontSize: 24),
),
],
),
);
},
),
),
Padding(
padding: const EdgeInsets.only(bottom: 18.0, top: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(totalPages, (index) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 4.0),
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: index <= _currentPage ? Colors.green : Colors.grey,
),
);
}),
),
),
],
),
);
}
dynamic formatXmr(Int64? atomicUnits, {bool returnString = true}) {
if (atomicUnits == null) {
return returnString ? 'N/A' : null;
}
double value = atomicUnits.toInt() / 1e12;
return returnString ? value.toStringAsFixed(5) : value;
}
String formatFiat(double amount, String currencyCode) {
return isFiatCurrency(currencyCode)
? '${amount.toStringAsFixed(2)} $currencyCode'
: amount.toString();
}
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
}

View file

@ -0,0 +1,184 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pb.dart';
import 'package:provider/provider.dart';
import 'package:uuid/uuid.dart';
import 'package:haveno_flutter_app/providers/trades_provider.dart';
class ActiveTradeChatScreen extends StatefulWidget {
final TradeInfo trade;
const ActiveTradeChatScreen({required this.trade});
@override
_ActiveTradeChatScreenState createState() => _ActiveTradeChatScreenState();
}
class _ActiveTradeChatScreenState extends State<ActiveTradeChatScreen> {
List<types.Message> _messages = [];
final _user = const types.User(id: 'me');
Timer? _timer;
@override
void initState() {
super.initState();
_loadMessages();
_startMessageUpdateTimer();
}
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
void _startMessageUpdateTimer() {
_timer = Timer.periodic(Duration(seconds: 61), (timer) {
_fetchMessages();
});
}
void _loadMessages() {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
_fetchMessages();
_messages =
tradesProvider.chatMessages[widget.trade.tradeId]?.map((chatMessage) {
return types.TextMessage(
author: types.User(id: chatMessage.senderNodeAddress.hostName),
createdAt: chatMessage.date.toInt(),
id: chatMessage.uid,
text: chatMessage.message,
);
}).toList() ??
[];
_messages = _messages.reversed.toList(); // Reverse the order of messages
}
Future<void> _fetchMessages() async {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
await tradesProvider.getChatMessages(widget.trade.tradeId).then((_) {
setState(() {
_messages = tradesProvider.chatMessages[widget.trade.tradeId]
?.map((chatMessage) {
return types.TextMessage(
author: types.User(id: chatMessage.senderNodeAddress.hostName),
createdAt: chatMessage.date.toInt(),
id: chatMessage.uid,
text: chatMessage.message,
);
}).toList() ??
[];
_messages =
_messages.reversed.toList(); // Reverse the order of messages
});
}).catchError((error) {
setState(() {
_messages = tradesProvider.chatMessages[widget.trade.tradeId]
?.map((chatMessage) {
return types.TextMessage(
author: types.User(id: chatMessage.senderNodeAddress.hostName),
createdAt: chatMessage.date.toInt(),
id: chatMessage.uid,
text: chatMessage.message,
);
}).toList() ??
[];
_messages =
_messages.reversed.toList(); // Reverse the order of messages
});
});
}
void _addMessage(types.Message message) {
setState(() {
_messages.add(message);
});
}
void _addSystemMessage(String text) {
final systemMessage = types.SystemMessage(
author: const types.User(id: 'system'),
createdAt: DateTime.now().millisecondsSinceEpoch,
id: const Uuid().v4(),
text: text,
);
_addMessage(systemMessage);
}
void _handleSendPressed(types.PartialText message) {
final textMessage = types.TextMessage(
author: _user,
createdAt: DateTime.now().millisecondsSinceEpoch,
id: const Uuid().v4(),
text: message.text,
);
_addMessage(textMessage);
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
try {
tradesProvider.sendChatMessage(widget.trade.tradeId, message.text);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('You can only send 1 message per minute!')),
);
}
}
void _handlePaymentSentPressed() {
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
tradesProvider.confirmPaymentSent(widget.trade.tradeId).then((_) {
_addSystemMessage('Payment marked as sent.');
}).catchError((error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to confirm payment: $error')),
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Trade #${widget.trade.shortId}'),
actions: [
IconButton(
icon: const Icon(Icons.check),
onPressed: _handlePaymentSentPressed,
tooltip: 'Confirm Transfer of Funds',
),
],
),
body: Consumer<TradesProvider>(
builder: (context, tradesProvider, child) {
final chatMessages =
tradesProvider.chatMessages[widget.trade.tradeId];
if (chatMessages != null) {
_messages = chatMessages
.map((chatMessage) => types.TextMessage(
author: types.User(id: chatMessage.traderId.toString()),
createdAt: chatMessage.date.toInt(),
id: chatMessage.uid,
text: chatMessage.message,
))
.toList();
_messages =
_messages.reversed.toList(); // Reverse the order of messages
}
return Chat(
messages: _messages,
onSendPressed: _handleSendPressed,
showUserAvatars: false,
showUserNames: false,
user: _user,
);
},
),
);
}
}

Some files were not shown because too many files have changed in this diff Show more