diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml
index fd8416a2..58066511 100644
--- a/.github/workflows/firebase-hosting-merge.yml
+++ b/.github/workflows/firebase-hosting-merge.yml
@@ -14,10 +14,14 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- - name: Install Melos
- run: dart pub global activate melos
- - name: Bootstrap workspace
- run: melos bootstrap
+ # Disabled melos generation due to circular dependency issues caused by komodo_defi_rpc_methods
+ # and komodo_defi_types packages. This will be revisited in the future.
+ # The app should already have the necessary generated files committed to the repository. If
+ # this is not the case, we have bigger issues.
+ # - name: Install Melos
+ # run: dart pub global activate melos
+ # - name: Bootstrap workspace
+ # run: melos bootstrap
- name: Cache dependencies
uses: actions/cache@v3
with:
@@ -38,10 +42,11 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- - name: Install Melos
- run: dart pub global activate melos
- - name: Bootstrap workspace
- run: melos bootstrap
+ # See Melos comment above
+ # - name: Install Melos
+ # run: dart pub global activate melos
+ # - name: Bootstrap workspace
+ # run: melos bootstrap
- name: Run dry web build to generate assets (expected to fail)
run: cd playground && flutter build web --release || echo "Dry build completed (failure expected)"
- name: Build playground web
@@ -64,10 +69,11 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- - name: Install Melos
- run: dart pub global activate melos
- - name: Bootstrap workspace
- run: melos bootstrap
+ # See Melos comment above
+ # - name: Install Melos
+ # run: dart pub global activate melos
+ # - name: Bootstrap workspace
+ # run: melos bootstrap
- name: Build SDK example web
run: cd packages/komodo_defi_sdk/example && flutter build web --release
- uses: FirebaseExtended/action-hosting-deploy@v0
diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml
index e9ff40f4..f4752358 100644
--- a/.github/workflows/firebase-hosting-pull-request.yml
+++ b/.github/workflows/firebase-hosting-pull-request.yml
@@ -16,21 +16,25 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- - name: Install Melos
- run: dart pub global activate melos
- - name: Bootstrap workspace
- run: melos bootstrap
- - name: Cache dependencies
- uses: actions/cache@v3
- with:
- path: |
- ~/.pub-cache
- **/.dart_tool
- **/.flutter-plugins
- **/.flutter-plugins-dependencies
- key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
- restore-keys: |
- ${{ runner.os }}-pub-
+ # Disabled melos generation due to circular dependency issues caused by komodo_defi_rpc_methods
+ # and komodo_defi_types packages. This will be revisited in the future.
+ # The app should already have the necessary generated files committed to the repository. If
+ # this is not the case, we have bigger issues.
+ # - name: Install Melos
+ # run: dart pub global activate melos
+ # - name: Bootstrap workspace
+ # run: melos bootstrap
+ # - name: Cache dependencies
+ # uses: actions/cache@v3
+ # with:
+ # path: |
+ # ~/.pub-cache
+ # **/.dart_tool
+ # **/.flutter-plugins
+ # **/.flutter-plugins-dependencies
+ # key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
+ # restore-keys: |
+ # ${{ runner.os }}-pub-
build_and_preview_playground_preview:
needs: setup
@@ -41,10 +45,11 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- - name: Install Melos
- run: dart pub global activate melos
- - name: Bootstrap workspace
- run: melos bootstrap
+ # See Melos comment above
+ # - name: Install Melos
+ # run: dart pub global activate melos
+ # - name: Bootstrap workspace
+ # run: melos bootstrap
- name: Run dry web build to generate assets (expected to fail)
run: cd playground && flutter build web --release || echo "Dry build completed (failure expected)"
- name: Build playground web
@@ -67,10 +72,11 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- - name: Install Melos
- run: dart pub global activate melos
- - name: Bootstrap workspace
- run: melos bootstrap
+ # See Melos comment above
+ # - name: Install Melos
+ # run: dart pub global activate melos
+ # - name: Bootstrap workspace
+ # run: melos bootstrap
- name: Run dry web build to generate assets (expected to fail)
run: cd packages/komodo_defi_sdk/example && flutter build web --release || echo "Dry build completed (failure expected)"
- name: Build SDK example web
diff --git a/.gitignore b/.gitignore
index e86bea09..1e5f69a6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,7 +41,6 @@ migrate_working_dir/
.pub-cache/
.pub/
/build/
-contrib/coins_config.json
**/.plugin_symlinks/*
# Web related
@@ -91,12 +90,13 @@ macos/kdf
# Android C++ files
**/.cxx
-# Coins asset files
+# Coins asset files
assets/config/coins.json
assets/config/coins_config.json
+assets/config/seed_nodes.json
assets/config/coins_ci.json
-assets/coin_icons/
-
+assets/coin_icons/**/*.png
+assets/coin_icons/**/*.jpg
# MacOS
# Flutter-related
diff --git a/PR_484_code_changes.patch b/PR_484_code_changes.patch
new file mode 100644
index 00000000..dc9124d7
--- /dev/null
+++ b/PR_484_code_changes.patch
@@ -0,0 +1,362 @@
+diff --git a/.github/workflows/trigger-cf-build.yml b/.github/workflows/trigger-cf-build.yml
+index 835a8a04..bee5a8ee 100644
+--- a/.github/workflows/trigger-cf-build.yml
++++ b/.github/workflows/trigger-cf-build.yml
+@@ -5,7 +5,7 @@ on:
+ - main
+ jobs:
+ build-and-deploy:
+- runs-on: ubuntu-22.04
++ runs-on: ubuntu-20.04
+ steps:
+ - name: Invoke deployment hook
+ uses: distributhor/workflow-webhook@v3
+diff --git a/src/pages/komodo-defi-framework/api/common_structures/orders/index.mdx b/src/pages/komodo-defi-framework/api/common_structures/orders/index.mdx
+index 53e3030e..9df60aa2 100644
+--- a/src/pages/komodo-defi-framework/api/common_structures/orders/index.mdx
++++ b/src/pages/komodo-defi-framework/api/common_structures/orders/index.mdx
+@@ -253,7 +253,7 @@ export const description = "Each order on the Komodo Defi oderbook can be querie
+ | pubkey | string | The pubkey of the offer provider |
+ | age | number | The age of the offer (in seconds) |
+ | zcredits | number | The zeroconf deposit amount (deprecated) |
+-| netid | number | The id of the network on which the request is made (default is `0`) |
++| netid | number | The id of the network on which the request is made |
+ | uuid | string | The uuid of order |
+ | is\_mine | bool | Whether the order is placed by me |
+ | base\_max\_volume | string (decimal) | The maximum amount of `base` coin the offer provider is willing to buy or sell |
+diff --git a/src/pages/komodo-defi-framework/api/legacy/orderbook/index.mdx b/src/pages/komodo-defi-framework/api/legacy/orderbook/index.mdx
+index f15705b4..2a15cdbd 100644
+--- a/src/pages/komodo-defi-framework/api/legacy/orderbook/index.mdx
++++ b/src/pages/komodo-defi-framework/api/legacy/orderbook/index.mdx
+@@ -25,7 +25,7 @@ The `orderbook` method requests from the network the currently available orders
+ | base | string | the name of the coin the user desires to receive |
+ | rel | string | the name of the coin the user will trade |
+ | timestamp | number | the timestamp of the orderbook request |
+-| netid | number | the id of the network on which the request is made (default is `0`) |
++| netid | number | the id of the network on which the request is made |
+ | total\_asks\_base\_vol | string (decimal) | the base volumes sum of all asks |
+ | total\_asks\_base\_vol\_rat | rational | the `total_asks_base_vol` represented as a standard [RationalValue](/komodo-defi-framework/api/common_structures/#rational-value) object. |
+ | total\_asks\_base\_vol\_fraction | fraction | the `total_asks_base_vol` represented as a standard [FractionalValue](/komodo-defi-framework/api/common_structures/#fractional-value) object. |
+diff --git a/src/pages/komodo-defi-framework/api/v20/swaps_and_orders/orderbook/index.mdx b/src/pages/komodo-defi-framework/api/v20/swaps_and_orders/orderbook/index.mdx
+index 19de2bb8..fb4517a2 100644
+--- a/src/pages/komodo-defi-framework/api/v20/swaps_and_orders/orderbook/index.mdx
++++ b/src/pages/komodo-defi-framework/api/v20/swaps_and_orders/orderbook/index.mdx
+@@ -22,7 +22,7 @@ The v2 `orderbook` method requests from the network the currently available orde
+ | rel | string | The name of the coin the user will trade |
+ | numasks | integer | The number of outstanding asks |
+ | numbids | integer | The number of outstanding bids |
+-| netid | integer | The id of the network on which the request is made (default is `8762`) |
++| netid | integer | The id of the network on which the request is made |
+ | asks | array of objects | An array of standard [OrderDataV2](/komodo-defi-framework/api/common_structures/orders/#order-data-v2) objects containing outstanding asks |
+ | bids | array of objects | An array of standard [OrderDataV2](/komodo-defi-framework/api/common_structures/orders/#order-data-v2) objects containing outstanding bids |
+ | timestamp | integer | A UNIX timestamp representing when the orderbook was requested |
+diff --git a/src/pages/komodo-defi-framework/api/v20/wallet/fee_management/index.mdx b/src/pages/komodo-defi-framework/api/v20/wallet/fee_management/index.mdx
+index 532169bb..674bcbe1 100644
+--- a/src/pages/komodo-defi-framework/api/v20/wallet/fee_management/index.mdx
++++ b/src/pages/komodo-defi-framework/api/v20/wallet/fee_management/index.mdx
+@@ -77,6 +77,7 @@ If `gas_fee_estimator` is set to `provider`, you'll also need to add the `gas_ap
+ ```json
+ {
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpcport": 8777,
+ ...
+ "gas_api": {
+diff --git a/src/pages/komodo-defi-framework/setup/configure-mm2-json/index.mdx b/src/pages/komodo-defi-framework/setup/configure-mm2-json/index.mdx
+index 2106f7c6..9d2bd2e7 100644
+--- a/src/pages/komodo-defi-framework/setup/configure-mm2-json/index.mdx
++++ b/src/pages/komodo-defi-framework/setup/configure-mm2-json/index.mdx
+@@ -23,7 +23,9 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ | rpcport | integer | Optional, defaults to `7783`. Port to use for RPC communication. If set to `0`, an available port will be chosen randomly. |
+ | rpc\_local\_only | boolean | Optional, defaults to `true`. If `false` the Komodo DeFi Framework API will allow rpc methods sent from external IP addresses. **Warning:** Only use this if you know what you are doing, and have put the appropriate security measures in place. |
+ | i\_am\_seed | boolean | Optional, defaults to `false`. Runs Komodo DeFi Framework API as a seed node mode (acting as a relay for Komodo DeFi Framework API clients). Use of this mode is not reccomended on the main network (8762) as it could result in a pubkey ban if non-compliant. On alternative testing or private networks, at least one seed node is required to relay information to other Komodo DeFi Framework API clients using the same netID. |
+-| seednodes | list of strings | Optional. If operating on a test or private netID, the IP address of at least one seed node is required (on the main network, these are already hardcoded) |
++| seednodes | list of strings | The domain or IP address of at least one seed node running on the same `netid` is required for KDF to launch (unless `disable_p2p` is set to `true`). Seednodes are used for peer discovery, orderbook propagation and transmitting swap events. |
++| disable\_p2p | boolean | Optional, defaults to `false`. If `true`, KDF will not attempt to use P2P for peer discovery, orderbook propagation and transmitting swap events. This is useful for running KDF in a controlled environment, such as a local network. |
++| is\_bootstrap\_node | boolean | Optional, defaults to `false`. If `true`, and `i_am_seed` is also true, KDF will act as a bootstrap node for the network. |
+ | enable\_hd | boolean | Optional. If `true`, the Komodo DeFi-API will work in only the [HD mode](/komodo-defi-framework/api/v20/wallet/hd/), and coins will need to have a coin derivation path entry in the `coins` file for activation. Defaults to `false`. |
+ | gas\_api | object | Optional, Used for [EVM gas fee management](/komodo-defi-framework/api/v20/wallet/fee_management/). Contains fields for `provider` and `url` to source third party fee market information. |
+ | message\_service\_cfg | object | Optional. This data is used to configure [Telegram](https://telegram.org/) messenger alerts for swap events when running using the [makerbot functionality](/komodo-defi-framework/api/v20/swaps_and_orders/start_simple_market_maker_bot/). For more information check out the [telegram alerts guide](/komodo-defi-framework/api/v20/utils/telegram_alerts/) |
+@@ -47,6 +49,7 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "ENTER_UNIQUE_PASSWORD",
+ "passphrase": "ENTER_UNIQUE_SEED_PHRASE_DONT_USE_THIS_CHANGE_IT_OR_FUNDS_NOT_SAFU",
+ "allow_weak_password": true,
+@@ -60,6 +63,7 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "Ent3r_Un1Qu3_Pa$$w0rd",
+ "passphrase": "ENTER_UNIQUE_SEED_PHRASE_DONT_USE_THIS_CHANGE_IT_OR_FUNDS_NOT_SAFU",
+ "allow_weak_password": false,
+@@ -73,6 +77,7 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "Ent3r_Un1Qu3_Pa$$w0rd",
+ "passphrase": "ENTER_UNIQUE_SEED_PHRASE_DONT_USE_THIS_CHANGE_IT_OR_FUNDS_NOT_SAFU",
+ "gas_api": {
+@@ -88,6 +93,7 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "Ent3r_Un1Qu3_Pa$$w0rd",
+ "passphrase": "ENTER_UNIQUE_SEED_PHRASE_DONT_USE_THIS_CHANGE_IT_OR_FUNDS_NOT_SAFU",
+ "wss_certs": {
+@@ -104,6 +110,7 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "Ent3r_Un1Qu3_Pa$$w0rd",
+ "wallet_name": "Gringotts Retirement Fund",
+ "wallet_password": "Q^wJZg~Ck3.tPW~asnM-WrL"
+@@ -116,6 +123,7 @@ When running the Komodo DeFi API via commandline with the `kdf` binary, some bas
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "Ent3r_Un1Qu3_Pa$$w0rd",
+ "1inch_api": "https://api.1inch.dev"
+ }
+@@ -145,6 +153,7 @@ If you are using HD wallets, you will need to set `enable_hd` to `true` in to yo
+ {
+ "gui": "DEVDOCS_CLI",
+ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
+ "rpc_password": "Ent3r_Un1Qu3_Pa$$w0rd",
+ "passphrase": "ENTER_UNIQUE_SEED_PHRASE_DONT_USE_THIS_CHANGE_IT_OR_FUNDS_NOT_SAFU",
+ "allow_weak_password": false,
+@@ -153,6 +162,57 @@ If you are using HD wallets, you will need to set `enable_hd` to `true` in to yo
+ }
+ ```
+
++#### Examples for Seed nodes:
++
++For bootstrap nodes:
++
++* set `is_bootstrap_node` to `true`.
++* the `seednodes` list paramater is not required.
++* the `i_am_seed` paramater must be set to `true`.
++* the `disable_p2p` paramater must be set to `false`.
++
++```json
++{
++ "gui": "DEVDOCS_CLI",
++ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
++ "is_bootstrap_node": true,
++ "i_am_seed": true,
++ "disable_p2p": false
++}
++```
++
++For a normal seed node:
++
++* set `is_bootstrap_node` to `false`.
++* the `seednodes` list paramater is required.
++* the `i_am_seed` paramater must be set to `true`.
++* the `disable_p2p` paramater must be set to `false`.
++
++```json
++{
++ "gui": "DEVDOCS_CLI",
++ "netid": 8762,
++ "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"],
++ "is_bootstrap_node": false,
++ "i_am_seed": true,
++ "disable_p2p": false
++}
++```
++
++Some warning or errors may appear in logs on launch if these parameters are not set correctly.
++- `WARN P2P is disabled. Features that require a P2P network (like swaps, peer health checks, etc.) will not work.`
++- `P2P initializing error: 'Precheck failed: 'Seed nodes cannot disable P2P.'`
++- `P2P initializing error: 'Precheck failed: 'Bootstrap node must also be a seed node.'`
++- `Precheck failed: 'Non-bootstrap node must have seed nodes configured to connect.'
++
++
++
++ From v2.5.0-beta, there will be no default seed nodes, and the `seednodes` list parameter will be required,
++ unless `disable_p2p` is set to `true`. In this state, all KDF functionality related to orderbooks, swaps, and peer discovery will be disabled, but coins can still be activated and transactions can still be sent.
++
++
++
+ ## Coins file configuration
+
+ You can download and use [this file](https://github.com/KomodoPlatform/coins/blob/master/coins) as a starting point for your own `coins` file. It contains all of the coins that are currently supported by the Komodo DeFi API, and is maintained by the Komodo Platform team.
+diff --git a/src/pages/komodo-defi-framework/tutorials/api-docker-telegram/index.mdx b/src/pages/komodo-defi-framework/tutorials/api-docker-telegram/index.mdx
+index 63bb74d4..9c190542 100644
+--- a/src/pages/komodo-defi-framework/tutorials/api-docker-telegram/index.mdx
++++ b/src/pages/komodo-defi-framework/tutorials/api-docker-telegram/index.mdx
+@@ -136,7 +136,7 @@ start.sh
+
+
+ ```bash
+- root 30 17.5 3.8 879940 154996 pts/0 Sl+ 10:09 0:00 /usr/local/bin/kdf {"gui":"MM2GUI","netid":9999, "userhome":"/root", "passphrase":"L1XXXXXXXXXXXXXXXXXXXRY", "rpc_password":"HlXXXXXXXKW"}
++ root 30 17.5 3.8 879940 154996 pts/0 Sl+ 10:09 0:00 /usr/local/bin/kdf {"gui":"MM2GUI","netid":8762, "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"], "userhome":"/root", "passphrase":"L1XXXXXXXXXXXXXXXXXXXRY", "rpc_password":"HlXXXXXXXKW"}
+ ```
+
+
+diff --git a/src/pages/komodo-defi-framework/tutorials/api-walkthrough/index.mdx b/src/pages/komodo-defi-framework/tutorials/api-walkthrough/index.mdx
+index 70b9c7f6..92353f48 100644
+--- a/src/pages/komodo-defi-framework/tutorials/api-walkthrough/index.mdx
++++ b/src/pages/komodo-defi-framework/tutorials/api-walkthrough/index.mdx
+@@ -73,12 +73,13 @@ We also need to create an MM2.json file in the same directory as the `coins` fil
+
+ ### MM2.json Minimal Configuration
+
+-| Parameter | Type | Description |
+-| ------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+-| gui | string | Information to identify which app, tool or product is using the API, e.g. `KomodoWallet iOS 1.0.1`. Helps developers identify if an issue is related to specific builds or operating systems etc. |
+-| netid | integer | Nework ID number, telling the Komodo DeFi Framework API which network to join. 8762 is the current main network, though alternative netids can be used for testing or "private" trades as long as seed nodes exist to support it. |
+-| passphrase | string | Your passphrase; this is the source of each of your coins private keys. KEEP IT SAFE! |
+-| rpc\_password | string | For RPC requests that need authentication, this will need to match the `userpass` value in the request body. |
++| Parameter | Type | Description |
++| ------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
++| gui | string | Information to identify which app, tool or product is using the API, e.g. `KomodoWallet iOS 1.0.1`. Helps developers identify if an issue is related to specific builds or operating systems etc. |
++| netid | integer | Nework ID number, telling the Komodo DeFi Framework API which network to join. At least one seed node domain or IP address needs to be specified on the same `netid` to support it. |
++| seednodes | list of strings | The domain or IP address of at least one seed node running on the same `netid` is required for peer discovery, orderbook propagation and transmitting swap events. |
++| passphrase | string | Your passphrase; this is the source of each of your coins private keys. KEEP IT SAFE! |
++| rpc\_password | string | For RPC requests that need authentication, this will need to match the `userpass` value in the request body. |
+
+
+ Unless you include the `allow_weak_password` paramater and set it to `true`, your `rpc_password`:
+@@ -92,7 +93,7 @@ We also need to create an MM2.json file in the same directory as the `coins` fil
+ The MM2.json configuration commands can also be supplied at runtime, as below:
+
+ ```bash
+-stdbuf -oL ./kdf "{\"gui\":\"Docs_Walkthru\",\"netid\":8762, \"passphrase\":\"YOUR_PASSPHRASE_HERE\", \"rpc_password\":\"YOUR_PASSWORD_HERE\"}" &
++stdbuf -oL ./kdf "{\"gui\":\"Docs_Walkthru\",\"netid\":8762, "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"], \"passphrase\":\"YOUR_PASSPHRASE_HERE\", \"rpc_password\":\"YOUR_PASSWORD_HERE\"}" &
+ ```
+
+ Replace `YOUR_PASSPHRASE_HERE` and `YOUR_PASSWORD_HERE` with your actual passphrase and password, and then execute the command in the terminal.
+@@ -137,7 +138,8 @@ If you see something similar, the Komodo DeFi Framework API is up and running!
+ When using the Komodo DeFi Framework API on a VPS without accompanying tools such as `tmux` or `screen`, it is recommended to use [`nohup`](https://www.digitalocean.com/community/tutorials/nohup-command-in-linux). This will ensure that the Komodo DeFi Framework API instance is not shutdown when the user logs out.
+
+ ```bash
+- stdbuf -oL nohup ./mm2 "{\"gui\":\"Docs_Walkthru\",\"netid\":8762, \"passphrase\":\"YOUR_PASSPHRASE_HERE\", \"rpc_password\":\"YOUR_PASSWORD_HERE\"}" &
++ stdbuf -oL nohup ./mm2 "{\"gui\":\"Docs_Walkthru\",\"netid\":8762, "seednodes": ["seed01.kmdefi.net", "seed02.kmdefi.net"]
++ , \"passphrase\":\"YOUR_PASSPHRASE_HERE\", \"rpc_password\":\"YOUR_PASSWORD_HERE\"}" &
+ ```
+
+
+diff --git a/src/pages/komodo-defi-framework/tutorials/setup-komodefi-api-aws/index.mdx b/src/pages/komodo-defi-framework/tutorials/setup-komodefi-api-aws/index.mdx
+index 2ccddb27..d68ee648 100644
+--- a/src/pages/komodo-defi-framework/tutorials/setup-komodefi-api-aws/index.mdx
++++ b/src/pages/komodo-defi-framework/tutorials/setup-komodefi-api-aws/index.mdx
+@@ -19,7 +19,7 @@ apt-get install -y unzip jq curl
+ wget $(curl --silent https://api.github.com/repos/KomodoPlatform/komodo-defi-framework/releases | jq -r '.[0].assets[] | select(.name | endswith("Linux-Release.zip")).browser_download_url')
+ wget https://raw.githubusercontent.com/KomodoPlatform/coins/master/coins
+ unzip *Linux-Release.zip
+-./kdf "{\"netid\":8762,\"gui\":\"aws_cli\",\"passphrase\":\"SEED_WORDS_PLEASE_REPLACE\",\"rpc_password\":\"RPC_PASS_PLEASE_REPLACE\",\"myipaddr\":\"0.0.0.0\"}"
++./kdf "{\"netid\":8762,\"seednodes\":[\"seed01.kmdefi.net\", \"seed02.kmdefi.net\"],\"gui\":\"aws_cli\",\"passphrase\":\"SEED_WORDS_PLEASE_REPLACE\",\"rpc_password\":\"RPC_PASS_PLEASE_REPLACE\",\"myipaddr\":\"0.0.0.0\"}"
+ ```
+
+ ## Install AWS CLI , get AWS access credentials
+diff --git a/src/pages/komodo/setup-electrumx-server/index.mdx b/src/pages/komodo/setup-electrumx-server/index.mdx
+index d474f570..ae07fb43 100644
+--- a/src/pages/komodo/setup-electrumx-server/index.mdx
++++ b/src/pages/komodo/setup-electrumx-server/index.mdx
+@@ -156,7 +156,7 @@ ws.close()
+ To keep your electrum server running smoothly, it is recommended to compact the database once a week. We can do this with a [crontab](https://crontab.guru/) entry as below:
+
+ ```bash
+-10 8 * * 2 sudo systemctl stop electrumx_RICK && COIN=Rick DB_DIRECTORY=/electrumdb/RICK /home//electrumx-1/electrumx_compact_history && sudo systemctl start electrumx_RICK
++33 3 * * 3 sudo systemctl stop electrumx_RICK && COIN=Rick; DB_DIRECTORY=/electrumdb/RICK; /home//electrumx-1/electrumx_compact_history && sudo systemctl start electrumx_RICK
+ ```
+
+ This means that every Wednesday at 3:33am, we'll stop the electrum service, compact the database, then restart the service. You should change the day of week for each of your electrum servers so that they dont all go down for maintainence at the same time.
+diff --git a/utils/js/create_search_index.js b/utils/js/create_search_index.js
+index d3b336fc..64cf7dec 100644
+--- a/utils/js/create_search_index.js
++++ b/utils/js/create_search_index.js
+@@ -18,25 +18,11 @@ const listOfAllowedElementsToCheck = [
+ // "a",
+ "p",
+ "li",
+- // "ul", // enabling this means `ul` returns `li` content(text) causing duplicates
++ "ul",
+ "pre",
+ "table",
+ ];
+
+-const textContentElementArrayToCheck = [
+- "h1",
+- "h2",
+- "h3",
+- "h4",
+- "h5",
+- "h6",
+- "p",
+- "li",
+- "pre",
+- "code",
+- "td",
+-];
+-
+ const jsonFile = JSON.parse(fs.readFileSync("./src/data/sidebar.json"));
+
+ const extractSidebarTitles = (jsonData, linksArray = []) => {
+@@ -119,23 +105,10 @@ const getStringContentFromElement = (elementTree, contentList = []) => {
+ return contentList;
+ };
+
+-// Helper function to extract text from a node and its children
+-function extractTextFromNode(node) {
+- if (node.type === "text") {
+- return node.value;
+- }
+-
+- if (node.children) {
+- return node.children.map(extractTextFromNode).join(" ");
+- }
+-
+- return "";
+-}
+-
+ function elementTreeChecker(mdxFilePathToCompile) {
+ return async (tree) => {
+ let textContentOfElement = "";
+- let closestElementReference = "";
++ let closestElementReference = null;
+ let slugify = slugifyWithCounter();
+ let documentTree = [];
+ const docPath = transformFilePath(mdxFilePathToCompile);
+@@ -165,14 +138,12 @@ function elementTreeChecker(mdxFilePathToCompile) {
+ path: docPath,
+ };
+ }
+- visit(node, "element", (elementNode) => {
+- if (!textContentElementArrayToCheck.includes(node.tagName)) return;
+- const completeText = extractTextFromNode(elementNode);
+- if (!!completeText.trim()) {
++ visit(node, "text", (text) => {
++ if (!!text.value.trim()) {
+ // For searchPreview
+ let lineData = {
+- text: completeText,
+- tagName: elementNode.tagName,
++ text: text.value,
++ tagName: node.tagName,
+ path: docPath,
+ closestElementReference,
+ };
+@@ -181,10 +152,9 @@ function elementTreeChecker(mdxFilePathToCompile) {
+
+ textContentOfElement = textContentOfElement.concat(
+ " ",
+- completeText
++ text.value
+ );
+ }
+- return visit.SKIP;
+ });
+ }
+ });
diff --git a/README.md b/README.md
index 53bf046d..3f6d42ba 100644
--- a/README.md
+++ b/README.md
@@ -4,121 +4,91 @@
-# Komodo Defi Framework SDK for Flutter
+# Komodo DeFi SDK for Flutter
-This is a series of Flutter packages for integrating the [Komodo DeFi Framework](https://komodoplatform.com/en/komodo-defi-framework.html) into Flutter applications. This enhances devex by providing an intuitive abstraction layer and handling all binary/media file fetching, reducing what previously would have taken months to understand the API and build a Flutter dApp with KDF integration into a few days.
+Komodo’s Flutter SDK lets you build cross-platform DeFi apps on top of the Komodo DeFi Framework (KDF) with a few lines of code. The SDK provides a high-level, batteries-included developer experience while still exposing the low-level framework and RPC methods when you need them.
-See the Komodo DeFi Framework (API) source repository at [KomodoPlatform/komodo-defi-framework](https://github.com/KomodoPlatform/komodo-defi-framework) and view the demo site (source in [example](./example)) project at [https://komodo-playground.web.app](https://komodo-playground.web.app).
+- Primary entry point: see `packages/komodo_defi_sdk`.
+- Full KDF access: see `packages/komodo_defi_framework`.
+- RPC models and namespaces: see `packages/komodo_defi_rpc_methods`.
+- Core types: see `packages/komodo_defi_types`.
+- Coins metadata utilities: see `packages/komodo_coins`.
+- Market data: see `packages/komodo_cex_market_data`.
+- UI widgets: see `packages/komodo_ui`.
+- Build hooks and artifacts: see `packages/komodo_wallet_build_transformer`.
-The recommended entry point ([komodo_defi_sdk](/packages/komodo_defi_sdk/README.md)) is a high-level opinionated library that provides a simple way to build cross-platform Komodo Defi Framework applications (primarily focused on wallets). This repository consists of multiple other child packages in the [packages](./packages) folder, which is orchestrated by the [komodo_defi_sdk](/packages/komodo_defi_sdk/README.md) package.
+Supported platforms: Android, iOS, macOS, Windows, Linux, and Web (WASM).
-Note: Most of this README focuses on the lower-level `komodo-defi-framework` package and still needs to be updated to focus on the primary package, `komodo_defi_sdk`.
+See the Komodo DeFi Framework (API) source at `https://github.com/KomodoPlatform/komodo-defi-framework` and a hosted demo at `https://komodo-playground.web.app`.
-This project supports building for macOS (more native platforms coming soon) and the web. KDF can either be run as a local Rust binary or you can connect to a remote instance. 1-Click setup for DigitalOcean and AWS deployment is in progress.
+## Quick start (SDK)
-Use the [komodo_defi_framework](packages/komodo_defi_sdk) package for an unopinionated implementation that gives access to the underlying KDF methods.
+Add the SDK to your app and initialize it:
-The structure for this repository is inspired by the [Flutter BLoC](https://github.com/felangel/bloc) project.
+```dart
+import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
+
+void main() async {
+ final sdk = KomodoDefiSdk(
+ // Local by default; use RemoteConfig to connect to a remote node
+ host: LocalConfig(https: false, rpcPassword: 'your-secure-password'),
+ config: const KomodoDefiSdkConfig(
+ defaultAssets: {'KMD', 'BTC', 'ETH'},
+ ),
+ );
+
+ await sdk.initialize();
+
+ // Register or sign in
+ await sdk.auth.register(walletName: 'my_wallet', password: 'strong-pass');
+
+ // Activate assets and get a balance
+ final btc = sdk.assets.findAssetsByConfigId('BTC').first;
+ await sdk.assets.activateAsset(btc).last;
+ final balance = await sdk.balances.getBalance(btc.id);
+ print('BTC balance: ${balance.total}');
+
+ // Direct RPC access when needed
+ final myKmd = await sdk.client.rpc.wallet.myBalance(coin: 'KMD');
+ print('KMD: ${myKmd.balance}');
+}
+```
-This project generally follows the guidelines and high standards set by [Very Good Ventures](https://vgv.dev/).
+## Architecture overview
-TODO: Add a comprehensive README
+- `komodo_defi_sdk`: High-level orchestration (auth, assets, balances, tx history, withdrawals, signing, market data).
+- `komodo_defi_framework`: Platform client for KDF with multiple backends (native/WASM/local process, remote). Provides the `ApiClient` used by the SDK.
+- `komodo_defi_rpc_methods`: Typed RPC request/response models and method namespaces available via `client.rpc.*`.
+- `komodo_defi_types`: Shared, lightweight domain types (e.g., `Asset`, `AssetId`, `BalanceInfo`, `WalletId`).
+- `komodo_coins`: Fetch/transform Komodo coins metadata, filtering strategies, seed-node utilities.
+- `komodo_cex_market_data`: Price providers (Komodo, Binance, CoinGecko) with repository selection and fallbacks.
+- `komodo_ui`: Reusable, SDK-friendly Flutter UI components.
+- `komodo_wallet_build_transformer`: Build-time artifact & assets fetcher (KDF binaries, coins, icons) integrated via Flutter’s asset transformers.
-TODO: Contribution guidelines and architecture overview
+## Remote vs Local
-## Example
+- Local (default): Uses native FFI on desktop/mobile and WASM in Web builds. The SDK handles artifact provisioning via the build transformer.
+- Remote: Connect with `RemoteConfig(ipAddress: 'host', port: 7783, rpcPassword: '...', https: true/false)`. You manage the remote KDF lifecycle.
-Below is an extract from the [example project](https://github.com/KomodoPlatform/komodo-defi-sdk-flutter/blob/dev/example/lib/main.dart) showing the straightforward integration. Note that this is for the [komodo_defi_framework](packages/komodo_defi_framework), and the [komodo_defi_sdk](/packages/komodo_defi_sdk/README.md) will provide a higher-layer abstraction.
+Seed nodes: From KDF v2.5.0-beta, `seednodes` are required unless `disable_p2p` is `true`. The framework includes a validator and helpers. See `packages/komodo_defi_framework/README.md`.
-Create the configuration for the desired runtime:
-```dart
- switch (_selectedHostType) {
- case 'remote':
- config = RemoteConfig(
- userpass: _userpassController.text,
- ipAddress: '$_selectedProtocol://${_ipController.text}',
- port: int.parse(_portController.text),
- );
- break;
- case 'aws':
- config = AwsConfig(
- userpass: _userpassController.text,
- region: _awsRegionController.text,
- accessKey: _awsAccessKeyController.text,
- secretKey: _awsSecretKeyController.text,
- instanceType: _awsInstanceTypeController.text,
- );
- break;
- case 'local':
- config = LocalConfig(userpass: _userpassController.text);
- break;
- default:
- throw Exception(
- 'Invalid/unsupported host type: $_selectedHostType',
- );
- }
-```
+## Packages in this monorepo
-Start KDF:
+- `packages/komodo_defi_sdk` – High-level SDK (start here)
+- `packages/komodo_defi_framework` – Low-level KDF client + lifecycle
+- `packages/komodo_defi_rpc_methods` – Typed RPC surfaces
+- `packages/komodo_defi_types` – Shared domain types
+- `packages/komodo_coins` – Coins metadata + filters
+- `packages/komodo_cex_market_data` – CEX price data
+- `packages/komodo_ui` – UI widgets
+- `packages/dragon_logs` – Cross-platform logging
+- `packages/komodo_wallet_build_transformer` – Build artifacts/hooks
+- `packages/dragon_charts_flutter` – Lightweight charts (moved here)
-```dart
-void _startKdf(String passphrase) async {
- _statusMessage = null;
-
- if (_kdfFramework == null) {
- _showMessage('Please configure the framework first.');
- return;
- }
-
- try {
- final result = await _kdfFramework!.startKdf(passphrase);
- setState(() {
- _statusMessage = 'KDF running: $result';
- _isRunning = true;
- });
-
- if (!result.isRunning()) {
- _showMessage('Failed to start KDF: $result');
- // return;
- }
- } catch (e) {
- _showMessage('Failed to start KDF: $e');
- }
-
- await _saveData();
- }
-```
+## Contributing
-Execute RPC requests:
-```dart
-executeRequest: (rpcInput) async {
- if (_kdfFramework == null || !_isRunning) {
- _showMessage('KDF is not running.');
- throw Exception('KDF is not running.');
- }
- return (await _kdfFramework!.executeRpc(rpcInput)).toString();
- },
-```
+We follow practices inspired by Flutter BLoC and Very Good Ventures’ standards. Please open PRs and issues in this repository.
-Stop KDF:
-```dart
+## License
- void _stopKdf() async {
- if (_kdfFramework == null) {
- _showMessage('Please configure the framework first.');
- return;
- }
-
- try {
- final result = await _kdfFramework!.kdfStop();
- setState(() {
- _statusMessage = 'KDF stopped: $result';
- _isRunning = false;
- });
-
- _checkStatus().ignore();
- } catch (e) {
- _showMessage('Failed to stop KDF: $e');
- }
- }
-```
+MIT. See individual package LICENSE files where present.
diff --git a/packages/dragon_charts_flutter/.gitignore b/packages/dragon_charts_flutter/.gitignore
new file mode 100644
index 00000000..ac5aa989
--- /dev/null
+++ b/packages/dragon_charts_flutter/.gitignore
@@ -0,0 +1,29 @@
+# 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
+# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
+/pubspec.lock
+**/doc/api/
+.dart_tool/
+build/
diff --git a/packages/dragon_charts_flutter/.metadata b/packages/dragon_charts_flutter/.metadata
new file mode 100644
index 00000000..d36dfbcc
--- /dev/null
+++ b/packages/dragon_charts_flutter/.metadata
@@ -0,0 +1,10 @@
+# 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: "a14f74ff3a1cbd521163c5f03d68113d50af93d3"
+ channel: "stable"
+
+project_type: package
diff --git a/packages/dragon_charts_flutter/CHANGELOG.md b/packages/dragon_charts_flutter/CHANGELOG.md
new file mode 100644
index 00000000..81a447b3
--- /dev/null
+++ b/packages/dragon_charts_flutter/CHANGELOG.md
@@ -0,0 +1,41 @@
+## 0.0.1-pre1 (2024-05-26)
+
+* First stable MVP PoC with line graphs implemented.
+
+## 0.0.1 (2024-05-26)
+
+* Visual improvements to the line graphs and tooltips.
+* Partial API documentation.
+* Improvements to animations, especially when changing data set size.
+* Other miscellaneous bug fixes and improvements.
+
+## 0.0.2 - 2024-06-17
+
+### Added
+- **Minor visual tweaks**: Improved the visual appearance of the application with minor tweaks for better user experience. (`2fc0171e`)
+- **QoL improvements and miscellaneous changes**: Added various quality-of-life improvements and miscellaneous changes for better functionality and user experience. (`f2c39896`)
+- **Multiple point selection/highlighting strategies**: Introduced new strategies for selecting and highlighting multiple points on the chart, enhancing interactivity. (`bb94c136`)
+
+### Changed
+- **Cartesian selection configuration**: Enhanced the configuration options for cartesian selection, providing more flexibility and customization options. (`dc49710f`)
+- **Tooltip functionality**: Improved the tooltip functionality, ensuring accurate and clear information display. (`b44b0833`)
+
+### Fixed
+- **Further lint fixes**: Addressed additional linting issues to maintain code quality and consistency. (`7231300c`)
+- **Chart padding for labels**: Fixed padding issues to ensure labels are correctly displayed without overlapping, improving chart readability. (`344c2014`)
+
+### Documentation
+- **Rename reference of Graph to Chart**: Refactored code to rename references from `Graph` to `Chart` for better clarity and consistency. (`6a790fbb`)
+- **README updates**:
+ - Updated references from `GraphExtent` to `ChartExtent`.
+ - Improved documentation for chart components and their properties.
+
+## 0.0.3 - 2024-07-01
+
+### Added
+- **Sparkline Chart**: Added support for sparkline charts, allowing users to visualize data trends in a compact format. (`8124e08`)
+
+## 0.1.0 - 2024-07-05
+
+- **Initial release with support for line charts.**: The first stable release of the library, providing support for line charts. No functional changes from the previous version.
+- **Linter Fixes**: Apply linter fixes. There are no functional changes.
diff --git a/packages/dragon_charts_flutter/CONTRIBUTING.md b/packages/dragon_charts_flutter/CONTRIBUTING.md
new file mode 100644
index 00000000..e69de29b
diff --git a/packages/dragon_charts_flutter/LICENSE b/packages/dragon_charts_flutter/LICENSE
new file mode 100644
index 00000000..569710a8
--- /dev/null
+++ b/packages/dragon_charts_flutter/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Komodo Platform
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/dragon_charts_flutter/README.md b/packages/dragon_charts_flutter/README.md
new file mode 100644
index 00000000..e8f7348c
--- /dev/null
+++ b/packages/dragon_charts_flutter/README.md
@@ -0,0 +1,151 @@
+# Dragon Charts Flutter
+
+Lightweight, declarative, and customizable charting library for Flutter with minimal dependencies. This package now lives in the Komodo DeFi SDK monorepo.
+
+## Features
+
+- **Lightweight:** Minimal dependencies and optimized for performance.
+- **Declarative:** Define charts using a declarative API that makes customization straightforward.
+- **Customizable:** Highly customizable with support for different line types, colors, and more.
+- **Expandable:** Designed with a modular architecture to easily add new chart types.
+
+## Installation
+
+Pub is the recommended way to install this package, but you can also install it from GitHub.
+
+### From Pub
+
+Run this command:
+
+```bash
+flutter pub add dragon_charts_flutter
+```
+
+Then, run `flutter pub get` to install the package.
+
+## Usage
+
+Here is a simple example to get you started:
+
+```dart
+import 'dart:async';
+import 'dart:math';
+import 'package:flutter/material.dart';
+import 'package:dragon_charts_flutter/dragon_charts_flutter.dart';
+
+void main() {
+ runApp(const MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ const MyApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: BlocProvider(
+ create: (_) => ChartBloc(),
+ child: const ChartScreen(),
+ ),
+ );
+ }
+}
+
+class ChartScreen extends StatelessWidget {
+ const ChartScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: const Text('Custom Line Chart with Animation')),
+ body: Padding(
+ padding: const EdgeInsets.all(32),
+ child: BlocBuilder(
+ builder: (context, state) {
+ return CustomLineChart(
+ domainExtent: const ChartExtent.tight(),
+ elements: [
+ ChartGridLines(isVertical: false, count: 5),
+ ChartAxisLabels(
+ isVertical: true,
+ count: 5,
+ labelBuilder: (value) => value.toStringAsFixed(2)),
+ ChartAxisLabels(
+ isVertical: false,
+ count: 5,
+ labelBuilder: (value) => value.toStringAsFixed(2)),
+ ChartDataSeries(data: state.data1, color: Colors.blue),
+ ChartDataSeries(
+ data: state.data2,
+ color: Colors.red,
+ lineType: LineType.bezier),
+ ],
+ tooltipBuilder: (context, dataPoints) {
+ return ChartTooltip(
+ dataPoints: dataPoints, backgroundColor: Colors.black);
+ },
+ );
+ },
+ ),
+ ),
+ );
+ }
+}
+```
+
+## Documentation
+
+### ChartData
+
+Represents a data point in the chart.
+
+#### Properties
+
+- `x`: `double` - The x-coordinate of the data point.
+- `y`: `double` - The y-coordinate of the data point.
+
+### ChartDataSeries
+
+Represents a series of data points to be plotted on the chart.
+
+#### Properties
+
+- `data`: `List` - The list of data points.
+- `color`: `Color` - The color of the series.
+- `lineType`: `LineType` - The type of line (straight or bezier).
+
+### CustomLineChart
+
+The main widget for displaying a line chart.
+
+#### Properties
+
+- `elements`: `List` - The elements to be drawn on the chart.
+- `tooltipBuilder`: `Widget Function(BuildContext, List)` - The builder for custom tooltips.
+- `domainExtent`: `ChartExtent` - The extent of the domain (x-axis).
+- `rangeExtent`: `ChartExtent` - The extent of the range (y-axis).
+- `backgroundColor`: `Color` - The background color of the chart.
+
+## Roadmap (high level)
+
+- Additional chart types (bar, pie, scatter)
+- Legends and interactions
+- Large dataset performance
+- Export as image
+
+## Why Dragon Charts Flutter?
+
+Dragon Charts Flutter is an excellent solution for your charting needs because:
+
+- **Lightweight:** It has minimal dependencies and is optimized for performance, making it suitable for both small and large projects.
+- **Declarative:** The declarative API makes it easy to define and customize charts, reducing the complexity of your code.
+- **Customizable:** The library is highly customizable, allowing you to create unique and visually appealing charts tailored to your application's needs.
+- **Expandable:** The modular architecture enables easy addition of new chart types and features, ensuring the library can grow with your requirements.
+
+## Contributing
+
+Contributions are welcome! Please open issues/PRs in the monorepo.
+
+## License
+
+MIT
\ No newline at end of file
diff --git a/packages/dragon_charts_flutter/analysis_options.yaml b/packages/dragon_charts_flutter/analysis_options.yaml
new file mode 100644
index 00000000..ac2d6d8b
--- /dev/null
+++ b/packages/dragon_charts_flutter/analysis_options.yaml
@@ -0,0 +1,6 @@
+include: package:very_good_analysis/analysis_options.yaml
+linter:
+ rules:
+ public_member_api_docs: false
+ prefer_int_literals: false
+ omit_local_variable_types: false
\ No newline at end of file
diff --git a/packages/dragon_charts_flutter/example/.gitignore b/packages/dragon_charts_flutter/example/.gitignore
new file mode 100644
index 00000000..29a3a501
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/.gitignore
@@ -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
diff --git a/packages/dragon_charts_flutter/example/.metadata b/packages/dragon_charts_flutter/example/.metadata
new file mode 100644
index 00000000..421f246e
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/.metadata
@@ -0,0 +1,42 @@
+# 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: "a14f74ff3a1cbd521163c5f03d68113d50af93d3"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ - platform: android
+ create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ - platform: ios
+ create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ - platform: macos
+ create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ - platform: web
+ create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ - platform: windows
+ create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+
+ # 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'
diff --git a/packages/dragon_charts_flutter/example/README.md b/packages/dragon_charts_flutter/example/README.md
new file mode 100644
index 00000000..1b7a4e3d
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/README.md
@@ -0,0 +1,3 @@
+# example
+
+A new Flutter project.
diff --git a/packages/dragon_charts_flutter/example/analysis_options.yaml b/packages/dragon_charts_flutter/example/analysis_options.yaml
new file mode 100644
index 00000000..e8cdb94a
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/analysis_options.yaml
@@ -0,0 +1,7 @@
+include: package:flutter_lints/flutter.yaml
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
+linter:
+ rules:
+ - require-trailing-commas: true
\ No newline at end of file
diff --git a/packages/dragon_charts_flutter/example/android/.gitignore b/packages/dragon_charts_flutter/example/android/.gitignore
new file mode 100644
index 00000000..6f568019
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/.gitignore
@@ -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
diff --git a/packages/dragon_charts_flutter/example/android/app/build.gradle b/packages/dragon_charts_flutter/example/android/app/build.gradle
new file mode 100644
index 00000000..2a2d082b
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/build.gradle
@@ -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.example"
+ 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.example"
+ // 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 = "../.."
+}
diff --git a/packages/dragon_charts_flutter/example/android/app/src/debug/AndroidManifest.xml b/packages/dragon_charts_flutter/example/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000..399f6981
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/dragon_charts_flutter/example/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..74a78b93
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/packages/dragon_charts_flutter/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
new file mode 100644
index 00000000..70f8f08f
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
@@ -0,0 +1,5 @@
+package com.example.example
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity()
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/dragon_charts_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 00000000..f74085f3
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/drawable/launch_background.xml b/packages/dragon_charts_flutter/example/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000..304732f8
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..db77bb4b
Binary files /dev/null and b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..17987b79
Binary files /dev/null and b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..09d43914
Binary files /dev/null and b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..d5f1c8d3
Binary files /dev/null and b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4d6372ee
Binary files /dev/null and b/packages/dragon_charts_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/values-night/styles.xml b/packages/dragon_charts_flutter/example/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 00000000..06952be7
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/app/src/main/res/values/styles.xml b/packages/dragon_charts_flutter/example/android/app/src/main/res/values/styles.xml
new file mode 100644
index 00000000..cb1ef880
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/app/src/profile/AndroidManifest.xml b/packages/dragon_charts_flutter/example/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 00000000..399f6981
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/android/build.gradle b/packages/dragon_charts_flutter/example/android/build.gradle
new file mode 100644
index 00000000..d2ffbffa
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/build.gradle
@@ -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
+}
diff --git a/packages/dragon_charts_flutter/example/android/gradle.properties b/packages/dragon_charts_flutter/example/android/gradle.properties
new file mode 100644
index 00000000..3b5b324f
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/packages/dragon_charts_flutter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/dragon_charts_flutter/example/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..e1ca574e
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -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
diff --git a/packages/dragon_charts_flutter/example/android/settings.gradle b/packages/dragon_charts_flutter/example/android/settings.gradle
new file mode 100644
index 00000000..536165d3
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/android/settings.gradle
@@ -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"
diff --git a/packages/dragon_charts_flutter/example/ios/.gitignore b/packages/dragon_charts_flutter/example/ios/.gitignore
new file mode 100644
index 00000000..7a7f9873
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/.gitignore
@@ -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
diff --git a/packages/dragon_charts_flutter/example/ios/Flutter/AppFrameworkInfo.plist b/packages/dragon_charts_flutter/example/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 00000000..7c569640
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 12.0
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Flutter/Debug.xcconfig b/packages/dragon_charts_flutter/example/ios/Flutter/Debug.xcconfig
new file mode 100644
index 00000000..592ceee8
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/packages/dragon_charts_flutter/example/ios/Flutter/Release.xcconfig b/packages/dragon_charts_flutter/example/ios/Flutter/Release.xcconfig
new file mode 100644
index 00000000..592ceee8
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..6c059b81
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,619 @@
+// !$*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 = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 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 = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 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 = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* 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 = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 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 = "";
+ };
+/* 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 = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* 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)";
+ DEVELOPMENT_TEAM = WDS9WYN969;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
+ 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.example.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.example.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.example.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)";
+ DEVELOPMENT_TEAM = WDS9WYN969;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
+ 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)";
+ DEVELOPMENT_TEAM = WDS9WYN969;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
+ 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 */;
+}
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..8e3ca5df
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/AppDelegate.swift b/packages/dragon_charts_flutter/example/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000..9074fee9
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/AppDelegate.swift
@@ -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)
+ }
+}
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..d36b1fab
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -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"
+ }
+}
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000..dc9ada47
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000..7353c41e
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000..797d452e
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000..6ed2d933
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000..4cd7b009
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000..fe730945
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000..321773cd
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000..797d452e
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000..502f463a
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000..0ec30343
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000..0ec30343
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000..e9f5fea2
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000..84ac32ae
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000..8953cba0
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000..0467bf12
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000..0bedcf2f
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -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"
+ }
+}
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000..89c2725b
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -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.
\ No newline at end of file
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/dragon_charts_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Base.lproj/Main.storyboard b/packages/dragon_charts_flutter/example/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Info.plist b/packages/dragon_charts_flutter/example/ios/Runner/Info.plist
new file mode 100644
index 00000000..5458fc41
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Example
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ example
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/packages/dragon_charts_flutter/example/ios/Runner/Runner-Bridging-Header.h b/packages/dragon_charts_flutter/example/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..308a2a56
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/packages/dragon_charts_flutter/example/ios/RunnerTests/RunnerTests.swift b/packages/dragon_charts_flutter/example/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..86a7c3b1
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/ios/RunnerTests/RunnerTests.swift
@@ -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.
+ }
+
+}
diff --git a/packages/dragon_charts_flutter/example/lib/blocs/chart_bloc.dart b/packages/dragon_charts_flutter/example/lib/blocs/chart_bloc.dart
new file mode 100644
index 00000000..53bff46f
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/lib/blocs/chart_bloc.dart
@@ -0,0 +1,67 @@
+import 'dart:async';
+import 'dart:math';
+import 'package:bloc/bloc.dart';
+import 'chart_event.dart';
+import 'chart_state.dart';
+import 'package:dragon_charts_flutter/dragon_charts_flutter.dart';
+
+// For the purpose of simplifying this example, we are generating the data in
+// the bloc class. However, in a real-world scenario, the data should be
+// fetched from a repository class. See https://bloclibrary.dev/why-bloc/
+class ChartBloc extends Bloc {
+ ChartBloc() : super(ChartState.initial()) {
+ on(_onChartUpdated);
+ on(_onChartDataPointAdded);
+
+ add(const ChartDataPointCountChanged(50));
+
+ // Timer to periodically update chart data
+ Timer.periodic(const Duration(seconds: 5), (timer) {
+ // add(ChartUpdated());
+ if (Random().nextBool() || true) {
+ add(ChartDataPointCountChanged(
+
+ // Randomly add or remove 5 to 50 data points
+ (Random().nextInt(50) + 5) * (Random().nextBool() ? 1 : -1)));
+ }
+ });
+ }
+
+ Future _onChartUpdated(
+ ChartUpdated event, Emitter emit) async {
+ final updatedData1 = state.data1
+ .map((element) => ChartData(x: element.x, y: Random().nextDouble()))
+ .toList();
+ final updatedData2 = state.data2
+ .map((element) => ChartData(x: element.x, y: Random().nextDouble()))
+ .toList();
+ emit(state.copyWith(data1: updatedData1, data2: updatedData2));
+ }
+
+ Future _onChartDataPointAdded(
+ ChartDataPointCountChanged event, Emitter emit) async {
+ if (event.count.abs() == 0) return;
+
+ final currentCount = state.data1.length;
+
+ final updatedData1 = List.from(state.data1);
+ final updatedData2 = List.from(state.data2);
+
+ if (event.count > 0) {
+ for (int i = 0; i < event.count; i++) {
+ updatedData1.add(ChartData(
+ x: (currentCount + i).toDouble(), y: Random().nextDouble()));
+ updatedData2.add(ChartData(
+ x: (currentCount + i).toDouble(), y: Random().nextDouble()));
+ }
+ } else {
+ for (int i = 0; i < event.count.abs(); i++) {
+ if (updatedData1.isEmpty) break;
+ updatedData1.removeLast();
+ updatedData2.removeLast();
+ }
+ }
+
+ emit(state.copyWith(data1: updatedData1, data2: updatedData2));
+ }
+}
diff --git a/packages/dragon_charts_flutter/example/lib/blocs/chart_event.dart b/packages/dragon_charts_flutter/example/lib/blocs/chart_event.dart
new file mode 100644
index 00000000..dc3e2ce2
--- /dev/null
+++ b/packages/dragon_charts_flutter/example/lib/blocs/chart_event.dart
@@ -0,0 +1,16 @@
+import 'package:equatable/equatable.dart';
+
+abstract class ChartEvent extends Equatable {
+ const ChartEvent();
+
+ @override
+ List