diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..d6e688a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,41 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Reproducible code**
+If applicable, add a minimum reproducible code snippet.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Browser [e.g. chrome, safari]
+ - Version [e.g. 22]
+
+**Smartphone (please complete the following information):**
+ - Device: [e.g. iPhone6]
+ - OS: [e.g. iOS8.1]
+ - Browser [e.g. stock browser, safari]
+ - Version [e.g. 22]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..bbcbbe7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/actions/ci/action.yml b/.github/actions/ci/action.yml
new file mode 100644
index 0000000..5ff0000
--- /dev/null
+++ b/.github/actions/ci/action.yml
@@ -0,0 +1,61 @@
+name: ci
+description: Executes Dart specific CI steps.
+
+inputs:
+ type:
+ description: The type of CI to run.
+ required: true
+ relay-endpoint:
+ description: 'The endpoint of the relay e.g. relay.walletconnect.com'
+ required: false
+ default: 'wss://relay.walletconnect.com'
+ project-id:
+ description: 'Reown project id'
+ required: true
+
+runs:
+ using: composite
+ steps:
+ # Setup Dependencies
+ - uses: ./.github/actions/dependencies
+
+ # Run Core Unit and Integration Tests
+ - name: Run Core tests
+ if: inputs.type == 'integration-tests'
+ shell: bash
+ working-directory: packages/reown_core
+ env:
+ RELAY_ENDPOINT: ${{ inputs.relay-endpoint }}
+ PROJECT_ID: ${{ inputs.project-id }}
+ run: flutter test --dart-define=RELAY_ENDPOINT=$RELAY_ENDPOINT --dart-define=PROJECT_ID=$PROJECT_ID
+
+ # Run Sign Unit and Integration Tests
+ - name: Run Sign tests
+ if: inputs.type == 'integration-tests'
+ shell: bash
+ working-directory: packages/reown_sign
+ env:
+ RELAY_ENDPOINT: ${{ inputs.relay-endpoint }}
+ PROJECT_ID: ${{ inputs.project-id }}
+ run: flutter test --dart-define=RELAY_ENDPOINT=$RELAY_ENDPOINT --dart-define=PROJECT_ID=$PROJECT_ID
+
+ # Run AppKit Unit and Integration Tests
+ - name: Run AppKit tests
+ if: inputs.type == 'integration-tests'
+ shell: bash
+ working-directory: packages/reown_appkit
+ env:
+ RELAY_ENDPOINT: ${{ inputs.relay-endpoint }}
+ PROJECT_ID: ${{ inputs.project-id }}
+ run: flutter test --dart-define=RELAY_ENDPOINT=$RELAY_ENDPOINT --dart-define=PROJECT_ID=$PROJECT_ID
+
+ # Run WalletKit Unit and Integration Tests
+ - name: Run AppKit tests
+ if: inputs.type == 'integration-tests'
+ shell: bash
+ working-directory: packages/reown_walletkit
+ env:
+ RELAY_ENDPOINT: ${{ inputs.relay-endpoint }}
+ PROJECT_ID: ${{ inputs.project-id }}
+ run: flutter test --dart-define=RELAY_ENDPOINT=$RELAY_ENDPOINT --dart-define=PROJECT_ID=$PROJECT_ID
+
\ No newline at end of file
diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml
new file mode 100644
index 0000000..8b4bf4a
--- /dev/null
+++ b/.github/actions/dependencies/action.yml
@@ -0,0 +1,43 @@
+name: ci
+description: Installs dependencies
+
+runs:
+ using: composite
+ steps:
+ # Install Flutter SDK
+ - name: Install Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.5'
+
+ # Get package dependencies and generate files
+ - name: Get package dependencies and generate files
+ shell: bash
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ shell: bash
+ working-directory: example/wallet
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ shell: bash
+ working-directory: example/dapp
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+
+ - name: Verify formatting and analyze project source
+ shell: bash
+ run: dart format --output=none --set-exit-if-changed .
+
+ # - name: Analyze project source
+ # shell: bash
+ # run: flutter analyze
+
\ No newline at end of file
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..73f3d26
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,24 @@
+# Description
+
+
+
+Resolves # (issue)
+
+## How Has This Been Tested?
+
+
+
+
+
+## Due Dilligence
+
+* [ ] Breaking change
+* [ ] Requires a documentation update
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..8a6312b
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,53 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+name: ci
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+ workflow_dispatch:
+ inputs:
+ relay-endpoint:
+ description: 'The endpoint of the relay e.g. relay.walletconnect.com'
+ required: false
+ default: 'wss://relay.walletconnect.com'
+ project-id:
+ description: 'Reown project id'
+ required: true
+
+
+concurrency:
+ # Support push/pr as event types with different behaviors each:
+ # 1. push: queue up builds by branch
+ # 2. pr: only allow one run per PR
+ group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.ref_name }}
+ # If there is already a workflow running for the same pull request, cancel it
+ # For non-PR triggers queue up builds
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
+
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ test-type: [integration-tests]
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install and set Flutter version
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.5'
+
+ - uses: ./.github/actions/ci
+ with:
+ type: ${{ matrix.test-type }}
+ project-id: ${{ secrets.PROJECT_ID }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..27f6bc3
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,47 @@
+name: Publish to pub.dev
+
+on:
+ push:
+ tags:
+ - 'v[0-9]+.[0-9]+.[0-9]+*'
+
+jobs:
+ publish:
+ name: Publish to pub.dev
+ permissions:
+ id-token: write
+ runs-on: ubuntu-latest
+ steps:
+ # Checkout the repo
+ - uses: actions/checkout@v3
+
+ # Setup Dart SDK
+ - uses: dart-lang/setup-dart@v1
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ # Publish --dry-run
+ - name: Check Publish Warnings
+ shell: bash
+ run: flutter pub publish --dry-run
+
+ # Publish
+ - name: Publish Package
+ shell: bash
+ run: flutter pub publish -f
+
+ # Notify
+ - name: Notify Channel
+ uses: slackapi/slack-github-action@v1.24.0
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ SLACK_WEBHOOK_TYPE: 'INCOMING_WEBHOOK'
+ with:
+ payload: |-
+ {
+ "text":"🚀 reown_flutter\'s *${{ github.ref_name }}* SDK was just published at https://pub.dev/packages/${{ github.ref_name }}"
+ }
+
+# Launch locally
+# act -j publish --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/publish.yml
diff --git a/.github/workflows/release_dapp_android.yml b/.github/workflows/release_dapp_android.yml
new file mode 100644
index 0000000..a14d7fc
--- /dev/null
+++ b/.github/workflows/release_dapp_android.yml
@@ -0,0 +1,72 @@
+name: Android Dapp (production) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'master') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Install Java 17
+ - name: Install Java 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '17'
+ architecture: x86_64
+ cache: 'gradle'
+
+ # Cache Gradle
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ - name: Add Secrets file
+ working-directory: packages/reown_appkit/example/base/android
+ run: touch secrets.properties && echo "${{ secrets.SECRETS_FILE }}" >> secrets.properties
+
+ - name: Add Keystore file
+ working-directory: packages/reown_appkit/example/base/android
+ run: echo "${{ secrets.KEYSTORE }}" | base64 --decode >> app/debug.keystore
+
+ # Fastlane
+ - name: Fastlane
+ working-directory: packages/reown_appkit/example/base/android
+ env:
+ FLAVOR: "production"
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
+ FIREBASE_DAPP_ID: ${{ secrets.FIREBASE_DAPP_ID }}
+ DOWNLOAD_URL: ${{ secrets.DOWNLOAD_URL_DAPP }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane add_plugin firebase_app_distribution
+ fastlane release_firebase project_id:$PROJECT_ID app_version:$VERSION_NUMBER
+
+# Launch locally
+# Remove build: if:
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_dapp_android.yml
diff --git a/.github/workflows/release_dapp_android_internal.yml b/.github/workflows/release_dapp_android_internal.yml
new file mode 100644
index 0000000..5db693c
--- /dev/null
+++ b/.github/workflows/release_dapp_android_internal.yml
@@ -0,0 +1,75 @@
+name: Android Dapp (internal) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'develop') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Install Java 17
+ - name: Install Java 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '17'
+ architecture: x86_64
+ cache: 'gradle'
+
+ # Cache Gradle
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ - name: Add Secrets file
+ # working-directory: example/dapp/android
+ working-directory: packages/reown_appkit/example/base/android
+ run: touch secrets.properties && echo "${{ secrets.SECRETS_FILE }}" >> secrets.properties
+
+ - name: Add Keystore file
+ # working-directory: example/dapp/android
+ working-directory: packages/reown_appkit/example/base/android
+ run: echo "${{ secrets.KEYSTORE }}" | base64 --decode >> app/debug.keystore
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/dapp/android
+ working-directory: packages/reown_appkit/example/base/android
+ env:
+ FLAVOR: "internal"
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
+ FIREBASE_DAPP_ID: ${{ secrets.FIREBASE_DAPP_ID_INTERNAL }}
+ DOWNLOAD_URL: ${{ secrets.DOWNLOAD_URL_DAPP_INTERNAL }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane add_plugin firebase_app_distribution
+ fastlane release_firebase project_id:$PROJECT_ID app_version:$VERSION_NUMBER
+
+# Launch locally
+# Remove build: if:
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_dapp_android_internal.yml
diff --git a/.github/workflows/release_dapp_ios.yml b/.github/workflows/release_dapp_ios.yml
new file mode 100644
index 0000000..a746199
--- /dev/null
+++ b/.github/workflows/release_dapp_ios.yml
@@ -0,0 +1,76 @@
+name: iOS Dapp (production) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'master') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Cache
+ - name: Cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ .build
+ SourcePackagesCache
+ DerivedDataCache
+ key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
+ restore-keys: |
+ ${{ runner.os }}-spm-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ # Build App
+ - name: Build App
+ # working-directory: example/dapp
+ working-directory: packages/reown_appkit/example/base
+ env:
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
+ run: |
+ PUBSPEC_FILE=../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ flutter build ios --flavor production --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --config-only --release
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/dapp/ios
+ working-directory: packages/reown_appkit/example/base/ios
+ env:
+ BUNDLE_ID: "com.walletconnect.flutterdapp"
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_DAPP_ID: ${{ secrets.APPLE_DAPP_ID }}
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
+ MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ GH_BASIC_AUTH: ${{ secrets.GH_BASIC_AUTH }}
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ TESTFLIGHT_URL: ${{ secrets.TESTFLIGHT_URL_DAPP }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane release_testflight username:$APPLE_ID token:$GH_BASIC_AUTH project_id:$PROJECT_ID app_id:$APPLE_DAPP_ID app_store_key_id:$APP_STORE_KEY_ID apple_issuer_id:$APPLE_ISSUER_ID app_store_connect_key:"$APP_STORE_CONNECT_KEY" match_git_url:$MATCH_GIT_URL app_version:$VERSION_NUMBER flavor:production
+
+# Launch locally
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_dapp_ios.yml
diff --git a/.github/workflows/release_dapp_ios_internal.yml b/.github/workflows/release_dapp_ios_internal.yml
new file mode 100644
index 0000000..2248b14
--- /dev/null
+++ b/.github/workflows/release_dapp_ios_internal.yml
@@ -0,0 +1,76 @@
+name: iOS Dapp (internal) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'develop') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Cache
+ - name: Cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ .build
+ SourcePackagesCache
+ DerivedDataCache
+ key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
+ restore-keys: |
+ ${{ runner.os }}-spm-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ # Build App
+ - name: Build App
+ # working-directory: example/dapp
+ working-directory: packages/reown_appkit/example/base
+ env:
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
+ run: |
+ PUBSPEC_FILE=../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ flutter build ios --flavor internal --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --config-only --release
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/dapp/ios
+ working-directory: packages/reown_appkit/example/base/ios
+ env:
+ BUNDLE_ID: "com.walletconnect.flutterdapp.internal"
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_DAPP_ID: ${{ secrets.APPLE_DAPP_ID_INTERNAL }}
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
+ MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ GH_BASIC_AUTH: ${{ secrets.GH_BASIC_AUTH }}
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ TESTFLIGHT_URL: ${{ secrets.TESTFLIGHT_URL_DAPP_INTERNAL }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane release_testflight username:$APPLE_ID token:$GH_BASIC_AUTH project_id:$PROJECT_ID app_id:$APPLE_DAPP_ID app_store_key_id:$APP_STORE_KEY_ID apple_issuer_id:$APPLE_ISSUER_ID app_store_connect_key:"$APP_STORE_CONNECT_KEY" match_git_url:$MATCH_GIT_URL app_version:$VERSION_NUMBER flavor:internal
+
+# Launch locally
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_dapp_ios_internal.yml
diff --git a/.github/workflows/release_modal_android.yml b/.github/workflows/release_modal_android.yml
new file mode 100644
index 0000000..908d53c
--- /dev/null
+++ b/.github/workflows/release_modal_android.yml
@@ -0,0 +1,122 @@
+name: Build Android App Release
+
+on:
+ workflow_dispatch:
+ push:
+ # branches:
+ # - 'release_v*'
+ tags:
+ - v[0-9]+.[0-9]+.[0-9]+
+
+jobs:
+ build_with_signing:
+ name: Build Android App Release
+ runs-on: macos-latest
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Create temp firebase key
+ env:
+ FIREBASE_KEY_BASE64: ${{ secrets.FIREBASE_KEY_BASE64 }}
+ run: |
+ # create variables
+ FIREBASE_KEY_PATH=$RUNNER_TEMP/flutter-c7c2c-6df892fe6ddb.json
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$FIREBASE_KEY_BASE64" | base64 --decode -o $FIREBASE_KEY_PATH
+ # Setup Java 11
+ - name: Setup Java 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '17'
+ architecture: x86_64
+ cache: 'gradle'
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ # Install Flutter SDK
+ - name: Install Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.5'
+ # Get package dependencies and generate files
+ - name: Get package dependencies and generate files
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ working-directory: example
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Build Android example app
+ - name: Build Android APK
+ working-directory: example
+ env:
+ PROJECT_ID: ${{ secrets.PROJECT_ID }}
+ APPKIT_AUTH: ${{ secrets.APPKIT_AUTH }}
+ APPKIT_PROJECT_ID: ${{ secrets.APPKIT_PROJECT_ID }}
+ AUTH_SERVICE_URL: ${{ secrets.AUTH_SERVICE_URL }}
+ run: |
+ # Get app version from file
+ GRADLE_FILE=android/gradle.properties
+ VERSION_FILE=$GITHUB_WORKSPACE/lib/version.dart
+
+ VERSION=`echo $(cat $VERSION_FILE) | sed "s/[^']*'\([^']*\)'.*/\1/"`
+
+ # Set versionName on gradle.properties
+ awk -F"=" -v newval="$VERSION" 'BEGIN{OFS=FS} $1=="versionName"{$2=newval}1' $GRADLE_FILE > "$GRADLE_FILE.tmp" && mv "$GRADLE_FILE.tmp" $GRADLE_FILE
+
+ # Increment versionCode (build number) on gradle.properties
+ awk -F"=" 'BEGIN{OFS=FS} $1=="versionCode"{$2=$2+1}1' $GRADLE_FILE > "$GRADLE_FILE.tmp" && mv "$GRADLE_FILE.tmp" $GRADLE_FILE
+
+ # Get new versionCode
+ NEXT_BUILD=$(grep 'versionCode' $GRADLE_FILE | cut -d'=' -f2)
+
+ # Build Android app with flutter
+ flutter build apk --build-name $VERSION --build-number $NEXT_BUILD --dart-define="PROJECT_ID=$PROJECT_ID" --dart-define="APPKIT_AUTH=$APPKIT_AUTH" --dart-define="APPKIT_PROJECT_ID=$APPKIT_PROJECT_ID" --dart-define="AUTH_SERVICE_URL=$AUTH_SERVICE_URL" --release --flavor stable
+
+ # Setup Node
+ - name: Setup Node
+ uses: actions/setup-node@v3
+ # Setup Firebase
+ - name: Setup Firebase
+ uses: w9jds/setup-firebase@main
+ with:
+ tools-version: 13.0.1
+ firebase_token: ${{ secrets.FIREBASE_TOKEN }}
+ - name: Upload APK
+ working-directory: example/build/app/outputs/flutter-apk
+ env:
+ APP_ID: ${{ secrets.ANDROID_APP_ID }}
+ run: |
+ firebase appdistribution:distribute app-stable-release.apk --app $APP_ID --release-notes "Web3Modal Flutter stable release" --groups "flutter-team, javascript-team, kotlin-team"
+ - name: Notify Channel
+ uses: slackapi/slack-github-action@v1.24.0
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ SLACK_WEBHOOK_TYPE: 'INCOMING_WEBHOOK'
+ with:
+ payload: |-
+ {
+ "text":"🤖 New *Android* build *${{ github.ref_name }}* stable version for *Web3Modal Flutter* was just deployed. Test at https://appdistribution.firebase.dev/i/a8efff56e3f0fdb0"
+ }
+
+ # Clean up Flutter envs
+ - name: Clean up
+ if: ${{ always() }}
+ run: |
+ rm $RUNNER_TEMP/flutter-c7c2c-6df892fe6ddb.json
+ flutter clean
+ cd example
+ flutter clean
\ No newline at end of file
diff --git a/.github/workflows/release_modal_android_internal.yml b/.github/workflows/release_modal_android_internal.yml
new file mode 100644
index 0000000..29bb0c7
--- /dev/null
+++ b/.github/workflows/release_modal_android_internal.yml
@@ -0,0 +1,121 @@
+name: Build Android App Internal (beta)
+
+on:
+ workflow_dispatch:
+ push:
+ # branches:
+ # - master
+ tags:
+ - 'v[0-9]+.[0-9]+.[0-9]-beta[0-9]**'
+
+jobs:
+ build_with_signing:
+ name: Build Android App Internal (beta)
+ runs-on: macos-latest
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Create temp firebase key
+ env:
+ FIREBASE_KEY_BASE64: ${{ secrets.FIREBASE_KEY_BASE64 }}
+ run: |
+ # create variables
+ FIREBASE_KEY_PATH=$RUNNER_TEMP/flutter-c7c2c-6df892fe6ddb.json
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$FIREBASE_KEY_BASE64" | base64 --decode -o $FIREBASE_KEY_PATH
+ # Setup Java 11
+ - name: Setup Java 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '17'
+ architecture: x86_64
+ cache: 'gradle'
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ # Install Flutter SDK
+ - name: Install Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.5'
+ # Get package dependencies and generate files
+ - name: Get package dependencies and generate files
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ working-directory: example
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Build Android example app
+ - name: Build Android APK
+ working-directory: example
+ env:
+ PROJECT_ID: ${{ secrets.PROJECT_ID }}
+ APPKIT_AUTH: ${{ secrets.APPKIT_AUTH }}
+ APPKIT_PROJECT_ID: ${{ secrets.APPKIT_PROJECT_ID }}
+ AUTH_SERVICE_URL: ${{ secrets.AUTH_SERVICE_URL }}
+ run: |
+ # Get app version from file
+ GRADLE_FILE=android/gradle.properties
+ VERSION_FILE=$GITHUB_WORKSPACE/lib/version.dart
+
+ VERSION=`echo $(cat $VERSION_FILE) | sed "s/[^']*'\([^']*\)'.*/\1/"`
+
+ # Set versionName on gradle.properties
+ awk -F"=" -v newval="$VERSION" 'BEGIN{OFS=FS} $1=="versionName"{$2=newval}1' $GRADLE_FILE > "$GRADLE_FILE.tmp" && mv "$GRADLE_FILE.tmp" $GRADLE_FILE
+
+ # Increment versionCode (build number) on gradle.properties
+ awk -F"=" 'BEGIN{OFS=FS} $1=="versionCode"{$2=$2+1}1' $GRADLE_FILE > "$GRADLE_FILE.tmp" && mv "$GRADLE_FILE.tmp" $GRADLE_FILE
+
+ # Get new versionCode
+ NEXT_BUILD=$(grep 'versionCode' $GRADLE_FILE | cut -d'=' -f2)
+
+ # Build Android app with flutter
+ flutter build apk --build-name $VERSION --build-number $NEXT_BUILD --dart-define="PROJECT_ID=$PROJECT_ID" --dart-define="APPKIT_AUTH=$APPKIT_AUTH" --dart-define="APPKIT_PROJECT_ID=$APPKIT_PROJECT_ID" --dart-define="AUTH_SERVICE_URL=$AUTH_SERVICE_URL" --release --flavor beta
+
+ # Setup Node
+ - name: Setup Node
+ uses: actions/setup-node@v3
+ # Setup Firebase
+ - name: Setup Firebase
+ uses: w9jds/setup-firebase@main
+ with:
+ tools-version: 13.0.1
+ firebase_token: ${{ secrets.FIREBASE_TOKEN }}
+ - name: Upload APK
+ working-directory: example/build/app/outputs/flutter-apk
+ env:
+ APP_ID: ${{ secrets.ANDROID_APP_ID_INTERNAL }}
+ run: |
+ firebase appdistribution:distribute app-beta-release.apk --app $APP_ID --release-notes "Web3Modal Flutter beta release" --groups "flutter-team, javascript-team, kotlin-team"
+ - name: Notify Channel
+ uses: slackapi/slack-github-action@v1.24.0
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ SLACK_WEBHOOK_TYPE: 'INCOMING_WEBHOOK'
+ with:
+ payload: |-
+ {
+ "text":"🤖 New *Android* build *${{ github.ref_name }}* version for *Web3Modal Flutter* was just deployed. Test at https://appdistribution.firebase.dev/i/a47ee97e86fbdfff"
+ }
+ # Clean up Flutter envs
+ - name: Clean up
+ if: ${{ always() }}
+ run: |
+ rm $RUNNER_TEMP/flutter-c7c2c-6df892fe6ddb.json
+ flutter clean
+ cd example
+ flutter clean
\ No newline at end of file
diff --git a/.github/workflows/release_modal_ios.yml b/.github/workflows/release_modal_ios.yml
new file mode 100644
index 0000000..c51f444
--- /dev/null
+++ b/.github/workflows/release_modal_ios.yml
@@ -0,0 +1,129 @@
+name: Build iOS App Release
+
+on:
+ workflow_dispatch:
+ push:
+ # branches:
+ # - 'release_v*' #${{ github.ref_name }}
+ tags:
+ - v[0-9]+.[0-9]+.[0-9]+
+
+jobs:
+ build_with_signing:
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ # Install the Apple certificate and provisioning profile
+ - name: Install the Apple certificate and provisioning profile
+ env:
+ BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_DISTRIBUTION_CERT }}
+ P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
+ BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.PROVISIONING_PROFILE_BASE64 }}
+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
+ run: |
+ # create variables
+ BUILD_CERT_PATH=$RUNNER_TEMP/build_certificate.p12
+ PP_PATH=$RUNNER_TEMP/FlutterAppStoreProfileWithPush.mobileprovision
+ KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $BUILD_CERT_PATH
+ echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
+
+ # create temporary keychain
+ security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+ security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
+ security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+
+ # import certificate to keychain
+ security import $BUILD_CERT_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
+ security list-keychain -d user -s $KEYCHAIN_PATH
+
+ # apply provisioning profile
+ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
+ cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
+ # Create p8 Auth Key from secrets
+ - name: Create p8 Auth Key
+ env:
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ run: |
+ # Create private_keys folder
+ KEY_PATH=$GITHUB_WORKSPACE/example/build/ios/ipa/private_keys
+ mkdir -p $KEY_PATH
+ AUTH_KEY_PATH=$KEY_PATH/AuthKey_$APP_STORE_KEY_ID.p8
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$APP_STORE_CONNECT_KEY" | base64 --decode -o $AUTH_KEY_PATH
+ # Install Flutter SDK
+ - name: Install Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.5'
+ # Get package dependencies and generate files
+ - name: Get package dependencies and generate files
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ working-directory: example
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Build ios example app
+ - name: Build ios example app
+ working-directory: example
+ env:
+ PROJECT_ID: ${{ secrets.PROJECT_ID }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ APPKIT_AUTH: ${{ secrets.APPKIT_AUTH }}
+ APPKIT_PROJECT_ID: ${{ secrets.APPKIT_PROJECT_ID }}
+ AUTH_SERVICE_URL: ${{ secrets.AUTH_SERVICE_URL }}
+ run: |
+ # Get app version from file
+ FILE_VALUE=$(echo | grep "^version: " pubspec.yaml)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ # Build ios app with flutter
+ flutter build ios --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --dart-define="APPKIT_AUTH=$APPKIT_AUTH" --dart-define="APPKIT_PROJECT_ID=$APPKIT_PROJECT_ID" --dart-define="AUTH_SERVICE_URL=$AUTH_SERVICE_URL" --config-only --release
+
+ cd ios
+ agvtool new-marketing-version $VERSION_NUMBER
+ agvtool next-version -all
+
+ # Archive and export
+ xcodebuild -workspace "$GITHUB_WORKSPACE/example/ios/Runner.xcworkspace" -scheme Runner -sdk iphoneos -destination generic/platform=iOS -archivePath "$GITHUB_WORKSPACE/example/ios/Runner.xcarchive" archive
+ xcodebuild -exportArchive -allowProvisioningUpdates -sdk iphoneos -archivePath "$GITHUB_WORKSPACE/example/ios/Runner.xcarchive" -exportOptionsPlist "$GITHUB_WORKSPACE/example/ios/Runner/ExportOptionsRelease.plist" -exportPath "$GITHUB_WORKSPACE/example/build/ios/ipa" -authenticationKeyIssuerID $APPLE_ISSUER_ID -authenticationKeyID $APP_STORE_KEY_ID -authenticationKeyPath "$GITHUB_WORKSPACE/example/build/ios/ipa/private_keys/AuthKey_$APP_STORE_KEY_ID.p8"
+ # Upload IPA to Testflight
+ - name: Upload IPA to Testflight
+ working-directory: example/build/ios/ipa
+ env:
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ run: xcrun altool --upload-app --type ios -f web3modal_flutter.ipa --apiKey $APP_STORE_KEY_ID --apiIssuer $APPLE_ISSUER_ID
+ - name: Notify Channel
+ uses: slackapi/slack-github-action@v1.24.0
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ SLACK_WEBHOOK_TYPE: 'INCOMING_WEBHOOK'
+ with:
+ payload: |-
+ {
+ "text":"🍎 New *iOS* build *${{ github.ref_name }}* stable version for *Web3Modal Flutter* was just deployed."
+ }
+ # Clean up
+ - name: Clean up
+ if: ${{ always() }}
+ run: |
+ security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
+ rm ~/Library/MobileDevice/Provisioning\ Profiles/FlutterAppStoreProfileWithPush.mobileprovision
+ flutter clean
+ cd example
+ flutter clean
\ No newline at end of file
diff --git a/.github/workflows/release_modal_ios_internal.yml b/.github/workflows/release_modal_ios_internal.yml
new file mode 100644
index 0000000..e6d75b8
--- /dev/null
+++ b/.github/workflows/release_modal_ios_internal.yml
@@ -0,0 +1,137 @@
+name: Build iOS App Internal (beta)
+
+on:
+ workflow_dispatch:
+ push:
+ # branches:
+ # - master
+ tags:
+ - 'v[0-9]+.[0-9]+.[0-9]-beta[0-9]**'
+
+jobs:
+ build_with_signing:
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ # Install the Apple certificate and provisioning profile
+ - name: Install the Apple certificate and provisioning profile
+ env:
+ BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_DISTRIBUTION_CERT }}
+ P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
+ BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.PROVISIONING_PROFILE_INTERNAL_BASE64 }}
+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
+ run: |
+ # create variables
+ BUILD_CERT_PATH=$RUNNER_TEMP/build_certificate.p12
+ PP_PATH=$RUNNER_TEMP/FlutterAppStoreProfileInternal.mobileprovision
+ KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $BUILD_CERT_PATH
+ echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
+
+ # create temporary keychain
+ security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+ security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
+ security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+
+ # import certificate to keychain
+ security import $BUILD_CERT_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
+ security list-keychain -d user -s $KEYCHAIN_PATH
+
+ # apply provisioning profile
+ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
+ cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
+ # Create p8 Auth Key from secrets
+ - name: Create p8 Auth Key
+ env:
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ run: |
+ # Create private_keys folder
+ KEY_PATH=$GITHUB_WORKSPACE/example/build/ios/ipa/private_keys
+ mkdir -p $KEY_PATH
+ AUTH_KEY_PATH=$KEY_PATH/AuthKey_$APP_STORE_KEY_ID.p8
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$APP_STORE_CONNECT_KEY" | base64 --decode -o $AUTH_KEY_PATH
+ # Install Flutter SDK
+ - name: Install Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.5'
+ # Get package dependencies and generate files
+ - name: Get package dependencies and generate files
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ working-directory: example
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+ # Build ios example app
+ - name: Build ios example app
+ working-directory: example
+ env:
+ PROJECT_ID: ${{ secrets.PROJECT_ID }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ APPKIT_AUTH: ${{ secrets.APPKIT_AUTH }}
+ APPKIT_PROJECT_ID: ${{ secrets.APPKIT_PROJECT_ID }}
+ AUTH_SERVICE_URL: ${{ secrets.AUTH_SERVICE_URL }}
+ run: |
+ # Get app version from file
+ FILE_VALUE=$(echo | grep "^version: " pubspec.yaml)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ # Change bundleId in Runner scheme
+ sed -i '' 's/com.web3modal.flutterExample/com.web3modal.flutterExample.internal/g' ios/Runner.xcodeproj/project.pbxproj
+ sed -i '' 's/com.web3modal.flutterExample/com.web3modal.flutterExample.internal/g' ios/Runner/Info.plist
+
+ # Change provisioning prfile in project.pbxproj
+ sed -i '' 's/FlutterAppStoreProfileWithPush/FlutterAppStoreProfileInternal/g' ios/Runner.xcodeproj/project.pbxproj
+
+ # Build ios app with flutter
+ flutter build ios --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --dart-define="APPKIT_AUTH=$APPKIT_AUTH" --dart-define="APPKIT_PROJECT_ID=$APPKIT_PROJECT_ID" --dart-define="AUTH_SERVICE_URL=$AUTH_SERVICE_URL" --config-only --release
+
+ cd ios
+ agvtool new-marketing-version $VERSION_NUMBER
+ agvtool next-version -all
+
+ # Archive and export
+ xcodebuild -workspace "$GITHUB_WORKSPACE/example/ios/Runner.xcworkspace" -scheme Runner -sdk iphoneos -destination generic/platform=iOS -archivePath "$GITHUB_WORKSPACE/example/ios/Runner.xcarchive" archive
+ xcodebuild -exportArchive -allowProvisioningUpdates -sdk iphoneos -archivePath "$GITHUB_WORKSPACE/example/ios/Runner.xcarchive" -exportOptionsPlist "$GITHUB_WORKSPACE/example/ios/Runner/ExportOptionsInternal.plist" -exportPath "$GITHUB_WORKSPACE/example/build/ios/ipa" -authenticationKeyIssuerID $APPLE_ISSUER_ID -authenticationKeyID $APP_STORE_KEY_ID -authenticationKeyPath "$GITHUB_WORKSPACE/example/build/ios/ipa/private_keys/AuthKey_$APP_STORE_KEY_ID.p8"
+ # Upload IPA to Testflight
+ - name: Upload IPA to Testflight
+ working-directory: example/build/ios/ipa
+ env:
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ run: |
+ xcrun altool --upload-app --type ios -f web3modal_flutter.ipa --apiKey $APP_STORE_KEY_ID --apiIssuer $APPLE_ISSUER_ID
+ - name: Notify Channel
+ uses: slackapi/slack-github-action@v1.24.0
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ SLACK_WEBHOOK_TYPE: 'INCOMING_WEBHOOK'
+ with:
+ payload: |-
+ {
+ "text":"🍎 New *iOS* build *${{ github.ref_name }}* version for *Web3Modal Flutter* was just deployed. Test at https://testflight.apple.com/join/pzF2SUVm"
+ }
+ # Clean up
+ - name: Clean up
+ if: ${{ always() }}
+ run: |
+ security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
+ rm ~/Library/MobileDevice/Provisioning\ Profiles/FlutterAppStoreProfileInternal.mobileprovision
+ flutter clean
+ cd example
+ flutter clean
diff --git a/.github/workflows/release_wallet_android.yml b/.github/workflows/release_wallet_android.yml
new file mode 100644
index 0000000..adde384
--- /dev/null
+++ b/.github/workflows/release_wallet_android.yml
@@ -0,0 +1,76 @@
+name: Android Wallet (production) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ # if: github.event.pull_request.merged == true
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'master') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Install Java 17
+ - name: Install Java 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '17'
+ architecture: x86_64
+ cache: 'gradle'
+
+ # Cache Gradle
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ - name: Add Secrets file
+ # working-directory: example/wallet/android
+ working-directory: packages/reown_walletkit/example/android
+ run: touch secrets.properties && echo "${{ secrets.SECRETS_FILE }}" >> secrets.properties
+
+ - name: Add Keystore file
+ # working-directory: example/wallet/android
+ working-directory: packages/reown_walletkit/example/android
+ run: echo "${{ secrets.KEYSTORE }}" | base64 --decode >> app/debug.keystore
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/wallet/android
+ working-directory: packages/reown_walletkit/example/android
+ env:
+ FLAVOR: "production"
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
+ FIREBASE_WALLET_ID: ${{ secrets.FIREBASE_WALLET_ID }}
+ DOWNLOAD_URL: ${{ secrets.DOWNLOAD_URL_WALLET }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane add_plugin firebase_app_distribution
+ fastlane release_firebase project_id:$PROJECT_ID app_version:$VERSION_NUMBER
+
+# Launch locally
+# Remove build: if:
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_wallet_android.yml
diff --git a/.github/workflows/release_wallet_android_internal.yml b/.github/workflows/release_wallet_android_internal.yml
new file mode 100644
index 0000000..dfc4ad3
--- /dev/null
+++ b/.github/workflows/release_wallet_android_internal.yml
@@ -0,0 +1,75 @@
+name: Android Wallet (internal) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'develop') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Install Java 17
+ - name: Install Java 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '17'
+ architecture: x86_64
+ cache: 'gradle'
+
+ # Cache Gradle
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ - name: Add Secrets file
+ # working-directory: example/wallet/android
+ working-directory: packages/reown_walletkit/example/android
+ run: touch secrets.properties && echo "${{ secrets.SECRETS_FILE }}" >> secrets.properties
+
+ - name: Add Keystore file
+ # working-directory: example/wallet/android
+ working-directory: packages/reown_walletkit/example/android
+ run: echo "${{ secrets.KEYSTORE }}" | base64 --decode >> app/debug.keystore
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/wallet/android
+ working-directory: packages/reown_walletkit/example/android
+ env:
+ FLAVOR: "internal"
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
+ FIREBASE_WALLET_ID: ${{ secrets.FIREBASE_WALLET_ID_INTERNAL }}
+ DOWNLOAD_URL: ${{ secrets.DOWNLOAD_URL_WALLET_INTERNAL }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane add_plugin firebase_app_distribution
+ fastlane release_firebase project_id:$PROJECT_ID app_version:$VERSION_NUMBER
+
+# Launch locally
+# Remove build: if:
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_wallet_android.yml
diff --git a/.github/workflows/release_wallet_ios.yml b/.github/workflows/release_wallet_ios.yml
new file mode 100644
index 0000000..e30fbd7
--- /dev/null
+++ b/.github/workflows/release_wallet_ios.yml
@@ -0,0 +1,76 @@
+name: iOS Wallet (production) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'master') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Cache
+ - name: Cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ .build
+ SourcePackagesCache
+ DerivedDataCache
+ key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
+ restore-keys: |
+ ${{ runner.os }}-spm-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ # Build App
+ - name: Build App
+ # working-directory: example/wallet
+ working-directory: packages/reown_walletkit
+ env:
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ run: |
+ PUBSPEC_FILE=../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ flutter build ios --flavor production --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --config-only --release
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/wallet/ios
+ working-directory: packages/reown_walletkit/example/ios
+ env:
+ BUNDLE_ID: "com.walletconnect.flutterwallet"
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_DAPP_ID: ${{ secrets.APPLE_WALLET_ID }}
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ GH_BASIC_AUTH: ${{ secrets.GH_BASIC_AUTH }}
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ TESTFLIGHT_URL: ${{ secrets.TESTFLIGHT_URL_WALLET }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane release_testflight username:$APPLE_ID token:$GH_BASIC_AUTH project_id:$PROJECT_ID app_id:$APPLE_DAPP_ID app_store_key_id:$APP_STORE_KEY_ID apple_issuer_id:$APPLE_ISSUER_ID app_store_connect_key:"$APP_STORE_CONNECT_KEY" match_git_url:$MATCH_GIT_URL app_version:$VERSION_NUMBER flavor:production
+
+# Launch locally
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_wallet_ios.yml
diff --git a/.github/workflows/release_wallet_ios_internal.yml b/.github/workflows/release_wallet_ios_internal.yml
new file mode 100644
index 0000000..e04edc4
--- /dev/null
+++ b/.github/workflows/release_wallet_ios_internal.yml
@@ -0,0 +1,76 @@
+name: iOS Wallet (internal) deploy
+
+on:
+ workflow_dispatch:
+ pull_request:
+ types:
+ - closed
+
+jobs:
+ build:
+ if: (github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'develop') || github.event_name == 'workflow_dispatch'
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Cache
+ - name: Cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ .build
+ SourcePackagesCache
+ DerivedDataCache
+ key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
+ restore-keys: |
+ ${{ runner.os }}-spm-
+
+ # Install Flutter and Dependencies
+ - uses: ./.github/actions/dependencies
+
+ # Build App
+ - name: Build App
+ # working-directory: example/wallet
+ working-directory: packages/reown_walletkit/example
+ env:
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ run: |
+ PUBSPEC_FILE=../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ flutter build ios --flavor internal --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --config-only --release
+
+ # Fastlane
+ - name: Fastlane
+ # working-directory: example/wallet/ios
+ working-directory: packages/reown_walletkit/example/ios
+ env:
+ BUNDLE_ID: "com.walletconnect.flutterwallet.internal"
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_DAPP_ID: ${{ secrets.APPLE_WALLET_ID_INTERNAL }}
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ GH_BASIC_AUTH: ${{ secrets.GH_BASIC_AUTH }}
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ TESTFLIGHT_URL: ${{ secrets.TESTFLIGHT_URL_WALLET_INTERNAL }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane release_testflight username:$APPLE_ID token:$GH_BASIC_AUTH project_id:$PROJECT_ID app_id:$APPLE_DAPP_ID app_store_key_id:$APP_STORE_KEY_ID apple_issuer_id:$APPLE_ISSUER_ID app_store_connect_key:"$APP_STORE_CONNECT_KEY" match_git_url:$MATCH_GIT_URL app_version:$VERSION_NUMBER flavor:internal
+
+# Launch locally
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_wallet_ios_internal.yml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..474a12e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,58 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+pubspec.lock
+/build/
+coverage/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# 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
+
+# fvm
+.fvm/
+
+**/secrets.properties
+**/*.keystore
+
+# Run scripts
+*.sh
+*.env.secret
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..bc3f0ae
--- /dev/null
+++ b/.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: "300451adae589accbece3490f4396f10bdf15e6e"
+ channel: "stable"
+
+project_type: package
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..41cc7d8
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.0.1
+
+* TODO: Describe initial release.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..212a53d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2024 Reown, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..237012c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# **Reown - Flutter**
+
+The communications protocol for web3, Reown brings the ecosystem together by enabling hundreds of wallets and apps to securely connect and interact. This repository contains Flutter implementation of WalletConnect protocol for Flutter applications.
+
+## SDK Chart
+
+| [Core SDK](packages/reown_core) | [Sign SDK](packages/reown_sign) | [WalletKit](packages/reown_walletkit) | [AppKit](packages/reown_appkit) |
+|--------------------------|---------------------------|--------------------------------|--------------------------|
+| 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 |
+
+## License
+
+Reown is released under the Apache 2.0 license. [See LICENSE](/LICENSE) for details.
\ No newline at end of file
diff --git a/packages/reown_appkit/.gitignore b/packages/reown_appkit/.gitignore
new file mode 100644
index 0000000..474a12e
--- /dev/null
+++ b/packages/reown_appkit/.gitignore
@@ -0,0 +1,58 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+pubspec.lock
+/build/
+coverage/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# 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
+
+# fvm
+.fvm/
+
+**/secrets.properties
+**/*.keystore
+
+# Run scripts
+*.sh
+*.env.secret
diff --git a/packages/reown_appkit/.metadata b/packages/reown_appkit/.metadata
new file mode 100644
index 0000000..5579401
--- /dev/null
+++ b/packages/reown_appkit/.metadata
@@ -0,0 +1,27 @@
+# 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: "300451adae589accbece3490f4396f10bdf15e6e"
+ channel: "stable"
+
+project_type: plugin
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 300451adae589accbece3490f4396f10bdf15e6e
+ base_revision: 300451adae589accbece3490f4396f10bdf15e6e
+
+ # 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/reown_appkit/CHANGELOG.md b/packages/reown_appkit/CHANGELOG.md
new file mode 100644
index 0000000..69b4a02
--- /dev/null
+++ b/packages/reown_appkit/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.0.1
+
+Initial release.
diff --git a/packages/reown_appkit/LICENSE b/packages/reown_appkit/LICENSE
new file mode 100644
index 0000000..212a53d
--- /dev/null
+++ b/packages/reown_appkit/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2024 Reown, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/packages/reown_appkit/README.md b/packages/reown_appkit/README.md
new file mode 100644
index 0000000..1bf04d9
--- /dev/null
+++ b/packages/reown_appkit/README.md
@@ -0,0 +1,17 @@
+# **Reown - AppKit Flutter**
+
+The all-in-one stack to build apps for the new internet
+With a layered feature stack spanning onboarding to payments, messaging and more, AppKit enables apps to build powerful top-to-bottom web3 experiences made to last, all through one seamless integration.
+
+Read more about it on our [website](https://reown.com/appkit)
+
+
+
+## Documentation
+
+For a full reference please check the [Official Documentation](https://docs.reown.com/appkit/flutter/core/installation)
+
+## Example
+
+Please check the [example](https://github.com/WalletConnect/Web3ModalFlutter/tree/master/packages/reown_appkit/example/modal) folder for the example.
+
diff --git a/packages/reown_appkit/analysis_options.yaml b/packages/reown_appkit/analysis_options.yaml
new file mode 100644
index 0000000..b677fc6
--- /dev/null
+++ b/packages/reown_appkit/analysis_options.yaml
@@ -0,0 +1,43 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:lints/recommended.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ non_constant_identifier_names: false
+ constant_identifier_names: false
+ avoid_print: true
+ prefer_single_quotes: true
+ sort_pub_dependencies: true
+ avoid_unnecessary_containers: true
+ cancel_subscriptions: true
+
+analyzer:
+ exclude:
+ - '**.freezed.dart'
+ - '**.g.dart'
+ - '**/*.freezed.dart'
+ - '**/*.g.dart'
+ - '**/generated_plugin_registrant.dart'
+ errors:
+ invalid_annotation_target: ignore
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/packages/reown_appkit/build.yaml b/packages/reown_appkit/build.yaml
new file mode 100644
index 0000000..71e3c33
--- /dev/null
+++ b/packages/reown_appkit/build.yaml
@@ -0,0 +1,16 @@
+targets:
+ $default:
+ builders:
+ build_version:
+ options:
+ output: lib/version.dart
+ freezed:
+ generate_for:
+ - lib/**.dart
+ - test/shared/shared_test_utils.dart
+ json_serializable:
+ options:
+ explicit_to_json: true
+ generate_for:
+ - lib/**.dart
+ - test/shared/shared_test_utils.dart
diff --git a/packages/reown_appkit/example/base/.gitignore b/packages/reown_appkit/example/base/.gitignore
new file mode 100644
index 0000000..0e140c0
--- /dev/null
+++ b/packages/reown_appkit/example/base/.gitignore
@@ -0,0 +1,59 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+pubspec.lock
+/build/
+coverage/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# 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
+
+# fvm
+.fvm/
+
+**/secrets.properties
+**/*.keystore
+
+# Run scripts
+*.sh
+*.env.secret
diff --git a/packages/reown_appkit/example/base/.metadata b/packages/reown_appkit/example/base/.metadata
new file mode 100644
index 0000000..cdf0334
--- /dev/null
+++ b/packages/reown_appkit/example/base/.metadata
@@ -0,0 +1,30 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
+ base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
+ - platform: web
+ create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
+ base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
+
+ # 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/reown_appkit/example/base/README.md b/packages/reown_appkit/example/base/README.md
new file mode 100644
index 0000000..a65265d
--- /dev/null
+++ b/packages/reown_appkit/example/base/README.md
@@ -0,0 +1,7 @@
+# dapp
+
+An example dApp built using flutter.
+
+## To Run
+
+`flutter run --dart-define=PROJECT_ID=xxx`
\ No newline at end of file
diff --git a/packages/reown_appkit/example/base/analysis_options.yaml b/packages/reown_appkit/example/base/analysis_options.yaml
new file mode 100644
index 0000000..b677fc6
--- /dev/null
+++ b/packages/reown_appkit/example/base/analysis_options.yaml
@@ -0,0 +1,43 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:lints/recommended.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ non_constant_identifier_names: false
+ constant_identifier_names: false
+ avoid_print: true
+ prefer_single_quotes: true
+ sort_pub_dependencies: true
+ avoid_unnecessary_containers: true
+ cancel_subscriptions: true
+
+analyzer:
+ exclude:
+ - '**.freezed.dart'
+ - '**.g.dart'
+ - '**/*.freezed.dart'
+ - '**/*.g.dart'
+ - '**/generated_plugin_registrant.dart'
+ errors:
+ invalid_annotation_target: ignore
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/packages/reown_appkit/example/base/android/.gitignore b/packages/reown_appkit/example/base/android/.gitignore
new file mode 100644
index 0000000..6f56801
--- /dev/null
+++ b/packages/reown_appkit/example/base/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/reown_appkit/example/base/android/Gemfile b/packages/reown_appkit/example/base/android/Gemfile
new file mode 100644
index 0000000..cdd3a6b
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/Gemfile
@@ -0,0 +1,6 @@
+source "https://rubygems.org"
+
+gem "fastlane"
+
+plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
+eval_gemfile(plugins_path) if File.exist?(plugins_path)
diff --git a/packages/reown_appkit/example/base/android/Gemfile.lock b/packages/reown_appkit/example/base/android/Gemfile.lock
new file mode 100644
index 0000000..1d021b0
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/Gemfile.lock
@@ -0,0 +1,228 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.7)
+ base64
+ nkf
+ rexml
+ addressable (2.8.7)
+ public_suffix (>= 2.0.2, < 7.0)
+ artifactory (3.0.17)
+ atomos (0.1.3)
+ aws-eventstream (1.3.0)
+ aws-partitions (1.956.0)
+ aws-sdk-core (3.201.1)
+ aws-eventstream (~> 1, >= 1.3.0)
+ aws-partitions (~> 1, >= 1.651.0)
+ aws-sigv4 (~> 1.8)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.88.0)
+ aws-sdk-core (~> 3, >= 3.201.0)
+ aws-sigv4 (~> 1.5)
+ aws-sdk-s3 (1.156.0)
+ aws-sdk-core (~> 3, >= 3.201.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.5)
+ aws-sigv4 (1.8.0)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ base64 (0.2.0)
+ claide (1.1.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ declarative (0.0.20)
+ digest-crc (0.6.5)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.6.20240107)
+ dotenv (2.8.1)
+ emoji_regex (3.2.3)
+ excon (0.111.0)
+ faraday (1.10.3)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.4)
+ multipart-post (~> 2)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
+ faraday (~> 1.0)
+ fastimage (2.3.1)
+ fastlane (2.221.1)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored (~> 1.2)
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-env (>= 1.6.0, < 2.0.0)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (>= 0.1.1, < 1.0.0)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.5)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
+ fastlane-plugin-firebase_app_distribution (0.9.1)
+ google-apis-firebaseappdistribution_v1 (~> 0.3.0)
+ google-apis-firebaseappdistribution_v1alpha (~> 0.2.0)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.54.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.3)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ google-apis-firebaseappdistribution_v1 (0.3.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-firebaseappdistribution_v1alpha (0.2.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.31.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-cloud-core (1.7.0)
+ google-cloud-env (>= 1.0, < 3.a)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.4.0)
+ google-cloud-storage (1.47.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.31.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-cookie (1.0.6)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ jmespath (1.6.2)
+ json (2.7.2)
+ jwt (2.8.2)
+ base64
+ mini_magick (4.13.2)
+ mini_mime (1.1.5)
+ multi_json (1.15.0)
+ multipart-post (2.4.1)
+ nanaimo (0.3.0)
+ naturally (2.2.1)
+ nkf (0.2.0)
+ optparse (0.5.0)
+ os (1.1.4)
+ plist (3.7.1)
+ public_suffix (6.0.0)
+ rake (13.2.1)
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.2.9)
+ strscan
+ rouge (2.0.7)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.5)
+ signet (0.19.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.10)
+ CFPropertyList
+ naturally
+ strscan (3.1.0)
+ terminal-notifier (2.0.0)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.2)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ uber (0.1.0)
+ unicode-display_width (2.5.0)
+ word_wrap (1.0.0)
+ xcodeproj (1.24.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.3.0)
+ rexml (~> 3.2.4)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ arm64-darwin-23
+ ruby
+
+DEPENDENCIES
+ fastlane
+ fastlane-plugin-firebase_app_distribution
+
+BUNDLED WITH
+ 2.5.14
diff --git a/packages/reown_appkit/example/base/android/app/build.gradle b/packages/reown_appkit/example/base/android/app/build.gradle
new file mode 100644
index 0000000..6ab904e
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/build.gradle
@@ -0,0 +1,109 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('secrets.properties')
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ compileSdkVersion flutter.compileSdkVersion
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.walletconnect.flutterdapp"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
+ minSdkVersion flutter.minSdkVersion
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ // Specifies one flavor dimension.
+ flavorDimensions = ["version"]
+
+ productFlavors {
+ internal {
+ dimension "version"
+ applicationIdSuffix ".internal"
+ manifestPlaceholders = [
+ appIcon: "@mipmap/ic_launcher_internal",
+ applicationLabel: "FL Dapp (internal)",
+ ]
+ }
+ production {
+ dimension "version"
+ manifestPlaceholders = [
+ appIcon: "@mipmap/ic_launcher",
+ applicationLabel: "FL Dapp",
+ ]
+ }
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file(keystoreProperties['WC_FILENAME'])
+ storePassword keystoreProperties['WC_STORE_PASSWORD']
+ keyAlias keystoreProperties['WC_KEYSTORE_ALIAS']
+ keyPassword keystoreProperties['WC_KEY_PASSWORD']
+ }
+ }
+
+ 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
+ }
+ }
+
+ namespace 'com.walletconnect.flutterdapp'
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
diff --git a/packages/reown_appkit/example/base/android/app/src/debug/AndroidManifest.xml b/packages/reown_appkit/example/base/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/AndroidManifest.xml b/packages/reown_appkit/example/base/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4215461
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/ic_launcher-playstore.png b/packages/reown_appkit/example/base/android/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000..bbea762
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/ic_launcher-playstore.png differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/ic_launcher_internal-playstore.png b/packages/reown_appkit/example/base/android/app/src/main/ic_launcher_internal-playstore.png
new file mode 100644
index 0000000..cbb9ef7
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/ic_launcher_internal-playstore.png differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/kotlin/com/example/dapp/MainActivity.kt b/packages/reown_appkit/example/base/android/app/src/main/kotlin/com/example/dapp/MainActivity.kt
new file mode 100644
index 0000000..c531c20
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/kotlin/com/example/dapp/MainActivity.kt
@@ -0,0 +1,65 @@
+package com.example.dapp
+
+import io.flutter.embedding.android.FlutterActivity
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.annotation.NonNull
+
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.plugin.common.EventChannel
+import io.flutter.plugin.common.MethodCall
+import io.flutter.plugin.common.MethodChannel
+
+class MainActivity: FlutterActivity() {
+ private val eventsChannel = "com.walletconnect.flutterdapp/events"
+ private val methodsChannel = "com.walletconnect.flutterdapp/methods"
+
+ private var initialLink: String? = null
+ private var linksReceiver: BroadcastReceiver? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val intent: Intent? = intent
+ initialLink = intent?.data?.toString()
+
+ EventChannel(flutterEngine?.dartExecutor?.binaryMessenger, eventsChannel).setStreamHandler(
+ object : EventChannel.StreamHandler {
+ override fun onListen(args: Any?, events: EventChannel.EventSink) {
+ linksReceiver = createChangeReceiver(events)
+ }
+ override fun onCancel(args: Any?) {
+ linksReceiver = null
+ }
+ }
+ )
+
+ MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, methodsChannel).setMethodCallHandler { call, result ->
+ if (call.method == "initialLink") {
+ if (initialLink != null) {
+ result.success(initialLink)
+ }
+ }
+ }
+ }
+
+ override fun onNewIntent(intent: Intent) {
+ super.onNewIntent(intent)
+ if (intent.action === Intent.ACTION_VIEW) {
+ linksReceiver?.onReceive(this.applicationContext, intent)
+ }
+ }
+
+ fun createChangeReceiver(events: EventChannel.EventSink): BroadcastReceiver? {
+ return object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ val dataString = intent.dataString ?:
+ events.error("UNAVAILABLE", "Link unavailable", null)
+ events.success(dataString)
+ }
+ }
+ }
+}
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/reown_appkit/example/base/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..f74085f
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/drawable/ic_launcher_background.xml b/packages/reown_appkit/example/base/android/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..ca3826a
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/drawable/ic_launcher_internal_background.xml b/packages/reown_appkit/example/base/android/app/src/main/res/drawable/ic_launcher_internal_background.xml
new file mode 100644
index 0000000..ca3826a
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/drawable/ic_launcher_internal_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/drawable/launch_background.xml b/packages/reown_appkit/example/base/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..304732f
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..c4a603d
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_internal.xml b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_internal.xml
new file mode 100644
index 0000000..c87a157
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_internal.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_internal_round.xml b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_internal_round.xml
new file mode 100644
index 0000000..c87a157
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_internal_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..c4a603d
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..4cb5c1e
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..4482ea7
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal.webp
new file mode 100644
index 0000000..da4f9d6
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal_foreground.webp
new file mode 100644
index 0000000..effa105
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal_round.webp
new file mode 100644
index 0000000..b7d20b0
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_internal_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..da1b55f
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..e66eaba
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..93e464c
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal.webp
new file mode 100644
index 0000000..b9fb3e8
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal_foreground.webp
new file mode 100644
index 0000000..a0ca446
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal_round.webp
new file mode 100644
index 0000000..484b1cb
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_internal_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..eb82d85
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..c3c8239
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..3ce0046
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal.webp
new file mode 100644
index 0000000..5cc18a9
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal_foreground.webp
new file mode 100644
index 0000000..5b0cae3
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal_round.webp
new file mode 100644
index 0000000..462b01b
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_internal_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..5276092
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..9cf8da3
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..8d1771a
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal.webp
new file mode 100644
index 0000000..a9755e4
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal_foreground.webp
new file mode 100644
index 0000000..7d6ceae
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal_round.webp
new file mode 100644
index 0000000..53f36b0
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_internal_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..af8dfaa
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..683e871
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..04d8335
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal.webp
new file mode 100644
index 0000000..5509505
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal_foreground.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal_foreground.webp
new file mode 100644
index 0000000..fd9d02a
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal_foreground.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal_round.webp
new file mode 100644
index 0000000..7fa4e47
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_internal_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..30cee2f
Binary files /dev/null and b/packages/reown_appkit/example/base/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/values-night/styles.xml b/packages/reown_appkit/example/base/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..06952be
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/main/res/values/styles.xml b/packages/reown_appkit/example/base/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..cb1ef88
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/app/src/profile/AndroidManifest.xml b/packages/reown_appkit/example/base/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/packages/reown_appkit/example/base/android/build.gradle b/packages/reown_appkit/example/base/android/build.gradle
new file mode 100644
index 0000000..482db1b
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ ext.kotlin_version = '1.9.0'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.1.1'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+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/reown_appkit/example/base/android/fastlane/Appfile b/packages/reown_appkit/example/base/android/fastlane/Appfile
new file mode 100644
index 0000000..09bd2c5
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/fastlane/Appfile
@@ -0,0 +1,2 @@
+json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
+package_name("com.walletconnect.flutterdapp") # e.g. com.krausefx.app
diff --git a/packages/reown_appkit/example/base/android/fastlane/Fastfile b/packages/reown_appkit/example/base/android/fastlane/Fastfile
new file mode 100644
index 0000000..228e7db
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/fastlane/Fastfile
@@ -0,0 +1,98 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+default_platform(:android)
+
+platform :android do
+
+ # Helper method to read the changelog
+ def read_changelog
+ changelog_file = '../../../../CHANGELOG.md'
+ changelog = ""
+
+ if File.exist?(changelog_file)
+ File.open(changelog_file, 'r') do |file|
+ changelog = file.read
+ end
+
+ # Split the changelog into entries based on the version header pattern
+ entries = changelog.split(/^##\s/)
+
+ # Get the latest entry, which is the first one after splitting
+ latest_entry = entries[1]
+
+ # Re-add the '##' header to the latest entry and remove empty lines
+ changelog = latest_entry.strip if latest_entry
+ changelog = changelog.gsub /^$\n/, ''
+ else
+ UI.user_error!("CHANGELOG.md file not found")
+ end
+
+ changelog
+ end
+
+
+ lane :release_firebase do |options|
+
+ slack_url = ENV['SLACK_URL']
+ firebase_token = ENV['FIREBASE_TOKEN']
+ firebase_dapp_id = ENV['FIREBASE_DAPP_ID']
+ _flavor = ENV['FLAVOR']
+ _download_url = ENV['DOWNLOAD_URL']
+
+ _latest_release = firebase_app_distribution_get_latest_release(
+ app: "#{firebase_dapp_id}",
+ )
+ if _latest_release && _latest_release[:buildVersion] && !_latest_release[:buildVersion].empty?
+ _new_build_number = _latest_release[:buildVersion].to_i + 1
+ else
+ _new_build_number = 1
+ end
+
+ _app_version = "#{options[:app_version]}"
+ _project_id = "#{options[:project_id]}"
+
+ # gradle(task: 'assemble', build_type: 'Release')
+ sh "flutter build apk --build-name #{_app_version} --build-number #{_new_build_number} --dart-define='PROJECT_ID=#{_project_id}' --flavor #{_flavor} --release"
+
+ changelog = read_changelog
+
+ firebase_app_distribution(
+ app: "#{firebase_dapp_id}",
+ groups: "flutter-team, javascript-team, kotlin-team, rust-team, unity, wc-testers",
+ android_artifact_path: "../build/app/outputs/flutter-apk/app-#{_flavor}-release.apk",
+ release_notes: changelog,
+ android_artifact_type: "APK",
+ )
+
+ slack(
+ message: "📱 Flutter Dapp #{_app_version}-#{_flavor} (#{_new_build_number}) for 🤖 Android successfully released!\n\n",
+ default_payloads: [],
+ attachment_properties: {
+ fields: [
+ {
+ title: "CHANGELOG",
+ value: changelog,
+ },
+ {
+ title: "LINK",
+ value: "#{_download_url}",
+ },
+ ]
+ }
+ )
+
+ end
+end
diff --git a/packages/reown_appkit/example/base/android/fastlane/Pluginfile b/packages/reown_appkit/example/base/android/fastlane/Pluginfile
new file mode 100644
index 0000000..b18539b
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/fastlane/Pluginfile
@@ -0,0 +1,5 @@
+# Autogenerated by fastlane
+#
+# Ensure this file is checked in to source control!
+
+gem 'fastlane-plugin-firebase_app_distribution'
diff --git a/packages/reown_appkit/example/base/android/gradle.properties b/packages/reown_appkit/example/base/android/gradle.properties
new file mode 100644
index 0000000..b9a9a24
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/gradle.properties
@@ -0,0 +1,6 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
+android.defaults.buildfeatures.buildconfig=true
+android.nonTransitiveRClass=false
+android.nonFinalResIds=false
diff --git a/packages/reown_appkit/example/base/android/gradle/wrapper/gradle-wrapper.properties b/packages/reown_appkit/example/base/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..8bc9958
--- /dev/null
+++ b/packages/reown_appkit/example/base/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-8.0-all.zip
diff --git a/packages/reown_appkit/example/base/android/settings.gradle b/packages/reown_appkit/example/base/android/settings.gradle
new file mode 100644
index 0000000..44e62bc
--- /dev/null
+++ b/packages/reown_appkit/example/base/android/settings.gradle
@@ -0,0 +1,11 @@
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/packages/reown_appkit/example/base/ios/.gitignore b/packages/reown_appkit/example/base/ios/.gitignore
new file mode 100644
index 0000000..7a7f987
--- /dev/null
+++ b/packages/reown_appkit/example/base/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/reown_appkit/example/base/ios/Flutter/AppFrameworkInfo.plist b/packages/reown_appkit/example/base/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..7c56964
--- /dev/null
+++ b/packages/reown_appkit/example/base/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/reown_appkit/example/base/ios/Flutter/Debug-internal.xcconfig b/packages/reown_appkit/example/base/ios/Flutter/Debug-internal.xcconfig
new file mode 100644
index 0000000..4e71b8d
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Flutter/Debug-internal.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-internal.xcconfig"
+#include "Generated.xcconfig"
diff --git a/packages/reown_appkit/example/base/ios/Flutter/Debug-production.xcconfig b/packages/reown_appkit/example/base/ios/Flutter/Debug-production.xcconfig
new file mode 100644
index 0000000..b3b72ba
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Flutter/Debug-production.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-production.xcconfig"
+#include "Generated.xcconfig"
diff --git a/packages/reown_appkit/example/base/ios/Flutter/Debug.xcconfig b/packages/reown_appkit/example/base/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..4e71b8d
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-internal.xcconfig"
+#include "Generated.xcconfig"
diff --git a/packages/reown_appkit/example/base/ios/Flutter/Release-internal.xcconfig b/packages/reown_appkit/example/base/ios/Flutter/Release-internal.xcconfig
new file mode 100644
index 0000000..daaf1c7
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Flutter/Release-internal.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release-internal.xcconfig"
+#include "Generated.xcconfig"
diff --git a/packages/reown_appkit/example/base/ios/Flutter/Release-production.xcconfig b/packages/reown_appkit/example/base/ios/Flutter/Release-production.xcconfig
new file mode 100644
index 0000000..f54fd05
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Flutter/Release-production.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release-production.xcconfig"
+#include "Generated.xcconfig"
diff --git a/packages/reown_appkit/example/base/ios/Flutter/Release.xcconfig b/packages/reown_appkit/example/base/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..daaf1c7
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release-internal.xcconfig"
+#include "Generated.xcconfig"
diff --git a/packages/reown_appkit/example/base/ios/Gemfile b/packages/reown_appkit/example/base/ios/Gemfile
new file mode 100644
index 0000000..7a118b4
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "fastlane"
diff --git a/packages/reown_appkit/example/base/ios/Gemfile.lock b/packages/reown_appkit/example/base/ios/Gemfile.lock
new file mode 100644
index 0000000..550231d
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Gemfile.lock
@@ -0,0 +1,220 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.7)
+ base64
+ nkf
+ rexml
+ addressable (2.8.7)
+ public_suffix (>= 2.0.2, < 7.0)
+ artifactory (3.0.17)
+ atomos (0.1.3)
+ aws-eventstream (1.3.0)
+ aws-partitions (1.956.0)
+ aws-sdk-core (3.201.1)
+ aws-eventstream (~> 1, >= 1.3.0)
+ aws-partitions (~> 1, >= 1.651.0)
+ aws-sigv4 (~> 1.8)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.88.0)
+ aws-sdk-core (~> 3, >= 3.201.0)
+ aws-sigv4 (~> 1.5)
+ aws-sdk-s3 (1.156.0)
+ aws-sdk-core (~> 3, >= 3.201.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.5)
+ aws-sigv4 (1.8.0)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ base64 (0.2.0)
+ claide (1.1.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ declarative (0.0.20)
+ digest-crc (0.6.5)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.6.20240107)
+ dotenv (2.8.1)
+ emoji_regex (3.2.3)
+ excon (0.111.0)
+ faraday (1.10.3)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.4)
+ multipart-post (~> 2)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
+ faraday (~> 1.0)
+ fastimage (2.3.1)
+ fastlane (2.221.1)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored (~> 1.2)
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-env (>= 1.6.0, < 2.0.0)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (>= 0.1.1, < 1.0.0)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.5)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.54.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.3)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.31.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-cloud-core (1.7.0)
+ google-cloud-env (>= 1.0, < 3.a)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.4.0)
+ google-cloud-storage (1.47.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.31.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-cookie (1.0.6)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ jmespath (1.6.2)
+ json (2.7.2)
+ jwt (2.8.2)
+ base64
+ mini_magick (4.13.2)
+ mini_mime (1.1.5)
+ multi_json (1.15.0)
+ multipart-post (2.4.1)
+ nanaimo (0.3.0)
+ naturally (2.2.1)
+ nkf (0.2.0)
+ optparse (0.5.0)
+ os (1.1.4)
+ plist (3.7.1)
+ public_suffix (6.0.0)
+ rake (13.2.1)
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.2.9)
+ strscan
+ rouge (2.0.7)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.5)
+ signet (0.19.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.10)
+ CFPropertyList
+ naturally
+ strscan (3.1.0)
+ terminal-notifier (2.0.0)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.2)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ uber (0.1.0)
+ unicode-display_width (2.5.0)
+ word_wrap (1.0.0)
+ xcodeproj (1.24.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.3.0)
+ rexml (~> 3.2.4)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ arm64-darwin-23
+ ruby
+
+DEPENDENCIES
+ fastlane
+
+BUNDLED WITH
+ 2.5.14
diff --git a/packages/reown_appkit/example/base/ios/Podfile b/packages/reown_appkit/example/base/ios/Podfile
new file mode 100644
index 0000000..2562dc1
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '13.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug-production' => :debug,
+ 'Profile-production' => :release,
+ 'Release-production' => :release,
+ 'Debug-internal' => :debug,
+ 'Profile-internal' => :release,
+ 'Release-internal' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/packages/reown_appkit/example/base/ios/Podfile.lock b/packages/reown_appkit/example/base/ios/Podfile.lock
new file mode 100644
index 0000000..b6f12b6
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Podfile.lock
@@ -0,0 +1,83 @@
+PODS:
+ - appcheck (1.0.3):
+ - Flutter
+ - coinbase_wallet_sdk (0.0.1):
+ - CoinbaseWalletSDK/CrossPlatform (= 1.0.4)
+ - Flutter
+ - CoinbaseWalletSDK/Client (1.0.4)
+ - CoinbaseWalletSDK/CrossPlatform (1.0.4):
+ - CoinbaseWalletSDK/Client
+ - connectivity_plus (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - Flutter (1.0.0)
+ - package_info_plus (0.4.5):
+ - Flutter
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - shared_preferences_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - sqflite (0.0.3):
+ - Flutter
+ - FlutterMacOS
+ - url_launcher_ios (0.0.1):
+ - Flutter
+ - webview_flutter_wkwebview (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - appcheck (from `.symlinks/plugins/appcheck/ios`)
+ - coinbase_wallet_sdk (from `.symlinks/plugins/coinbase_wallet_sdk/ios`)
+ - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
+ - Flutter (from `Flutter`)
+ - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
+ - sqflite (from `.symlinks/plugins/sqflite/darwin`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+ - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
+
+SPEC REPOS:
+ trunk:
+ - CoinbaseWalletSDK
+
+EXTERNAL SOURCES:
+ appcheck:
+ :path: ".symlinks/plugins/appcheck/ios"
+ coinbase_wallet_sdk:
+ :path: ".symlinks/plugins/coinbase_wallet_sdk/ios"
+ connectivity_plus:
+ :path: ".symlinks/plugins/connectivity_plus/darwin"
+ Flutter:
+ :path: Flutter
+ package_info_plus:
+ :path: ".symlinks/plugins/package_info_plus/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ shared_preferences_foundation:
+ :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
+ sqflite:
+ :path: ".symlinks/plugins/sqflite/darwin"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+ webview_flutter_wkwebview:
+ :path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
+
+SPEC CHECKSUMS:
+ appcheck: e1ab9d4e03736f03e0401554a134d1ed502d7629
+ coinbase_wallet_sdk: 7ccd4e1a7940deba6ba9bd81beece999a2268c15
+ CoinbaseWalletSDK: ea1f37512bbc69ebe07416e3b29bf840f5cc3152
+ connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+ sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
+ url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
+ webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1
+
+PODFILE CHECKSUM: 0772a2bd8cd4c7aaeb2576ddfaf6b03be722593b
+
+COCOAPODS: 1.15.2
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.pbxproj b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..6437c7a
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,859 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0964B3132C49545400AE1CDA /* Info-internal.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0964B3122C49545400AE1CDA /* Info-internal.plist */; };
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 92B107A01DA9BFE13AE94BEF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51D7456F29714BCA579AE584 /* Pods_Runner.framework */; };
+ 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 PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0389ADBF49B36FF8EF3FF10F /* Pods-Runner.release-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-production.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-production.xcconfig"; sourceTree = ""; };
+ 0964B30E2C494D2000AE1CDA /* Debug-production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Debug-production.xcconfig"; path = "Flutter/Debug-production.xcconfig"; sourceTree = ""; };
+ 0964B30F2C494D2000AE1CDA /* Release-internal.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Release-internal.xcconfig"; path = "Flutter/Release-internal.xcconfig"; sourceTree = ""; };
+ 0964B3102C494D2000AE1CDA /* Debug-internal.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Debug-internal.xcconfig"; path = "Flutter/Debug-internal.xcconfig"; sourceTree = ""; };
+ 0964B3112C494D2000AE1CDA /* Release-production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Release-production.xcconfig"; path = "Flutter/Release-production.xcconfig"; sourceTree = ""; };
+ 0964B3122C49545400AE1CDA /* Info-internal.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-internal.plist"; sourceTree = ""; };
+ 09969A8C2C73BC9100B14363 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
+ 0B37FE275F6AD47AD7B9F5FD /* Pods-Runner.profile-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-production.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-production.xcconfig"; sourceTree = ""; };
+ 11FCBDE5DEDE8D525B6B991E /* Pods-Runner.debug-internal.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-internal.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-internal.xcconfig"; sourceTree = ""; };
+ 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 = ""; };
+ 352BB1B55A21C7D1731084E8 /* Pods-Runner.debug-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-production.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-production.xcconfig"; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 3F79388B1397C876ED2819AC /* Pods-Runner.profile-internal.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-internal.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-internal.xcconfig"; sourceTree = ""; };
+ 51D7456F29714BCA579AE584 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 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 = ""; };
+ E7AC93372A74CCE50D6F8DB4 /* Pods-Runner.release-internal.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-internal.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-internal.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 92B107A01DA9BFE13AE94BEF /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 337F646810BF58BC9EACB5E5 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 352BB1B55A21C7D1731084E8 /* Pods-Runner.debug-production.xcconfig */,
+ 11FCBDE5DEDE8D525B6B991E /* Pods-Runner.debug-internal.xcconfig */,
+ 0389ADBF49B36FF8EF3FF10F /* Pods-Runner.release-production.xcconfig */,
+ E7AC93372A74CCE50D6F8DB4 /* Pods-Runner.release-internal.xcconfig */,
+ 0B37FE275F6AD47AD7B9F5FD /* Pods-Runner.profile-production.xcconfig */,
+ 3F79388B1397C876ED2819AC /* Pods-Runner.profile-internal.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 0964B3102C494D2000AE1CDA /* Debug-internal.xcconfig */,
+ 0964B30E2C494D2000AE1CDA /* Debug-production.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 0964B30F2C494D2000AE1CDA /* Release-internal.xcconfig */,
+ 0964B3112C494D2000AE1CDA /* Release-production.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 337F646810BF58BC9EACB5E5 /* Pods */,
+ E810EF87987B4BB060C2D081 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 09969A8C2C73BC9100B14363 /* Runner.entitlements */,
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 0964B3122C49545400AE1CDA /* Info-internal.plist */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ E810EF87987B4BB060C2D081 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 51D7456F29714BCA579AE584 /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 1D6CBBAE1D8060C96151B8C3 /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ D2DBFBF4E9D3D9BCB7D585CB /* [CP] Embed Pods Frameworks */,
+ );
+ 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 = {
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 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 */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0964B3132C49545400AE1CDA /* Info-internal.plist in Resources */,
+ 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 */
+ 1D6CBBAE1D8060C96151B8C3 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 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\n";
+ };
+ 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\n";
+ };
+ D2DBFBF4E9D3D9BCB7D585CB /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase 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 */
+ 0964B3082C4944E700AE1CDA /* Debug-internal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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 = 13.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = "Debug-internal";
+ };
+ 0964B3092C4944E700AE1CDA /* Debug-internal */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-internal";
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 2;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = "Runner/Info-internal.plist";
+ INFOPLIST_KEY_CFBundleDisplayName = "Flutter Dapp Internal";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterdapp.internal;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.walletconnect.flutterdapp.internal";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = "Debug-internal";
+ };
+ 0964B30A2C4944EF00AE1CDA /* Release-internal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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 = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = "Release-internal";
+ };
+ 0964B30B2C4944EF00AE1CDA /* Release-internal */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-internal";
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 2;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = "Runner/Info-internal.plist";
+ INFOPLIST_KEY_CFBundleDisplayName = "Flutter Dapp Internal";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterdapp.internal;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.walletconnect.flutterdapp.internal";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = "Release-internal";
+ };
+ 0964B30C2C4944F600AE1CDA /* Profile-internal */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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 = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTS_MACCATALYST = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = "Profile-internal";
+ };
+ 0964B30D2C4944F600AE1CDA /* Profile-internal */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-internal";
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 2;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
+ "DEVELOPMENT_TEAM[sdk=macosx*]" = W5R8AG9K22;
+ ENABLE_BITCODE = NO;
+ ENABLE_HARDENED_RUNTIME = NO;
+ INFOPLIST_FILE = "Runner/Info-internal.plist";
+ INFOPLIST_KEY_CFBundleDisplayName = "Flutter Dapp Internal";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterdapp.internal;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.walletconnect.flutterdapp.internal";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = "Profile-internal";
+ };
+ 249021D3217E4FDB00AE95B9 /* Profile-production */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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 = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = "Profile-production";
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile-production */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 2;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "Flutter Dapp";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterdapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.walletconnect.flutterdapp 1724090152";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = "Profile-production";
+ };
+ 97C147031CF9000F007C117D /* Debug-production */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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 = 13.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = "Debug-production";
+ };
+ 97C147041CF9000F007C117D /* Release-production */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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 = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = "Release-production";
+ };
+ 97C147061CF9000F007C117D /* Debug-production */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 2;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "Flutter Dapp";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterdapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.walletconnect.flutterdapp";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = "Debug-production";
+ };
+ 97C147071CF9000F007C117D /* Release-production */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 2;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "Flutter Dapp";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterdapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.walletconnect.flutterdapp 1724090152";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = "Release-production";
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug-production */,
+ 0964B3082C4944E700AE1CDA /* Debug-internal */,
+ 97C147041CF9000F007C117D /* Release-production */,
+ 0964B30A2C4944EF00AE1CDA /* Release-internal */,
+ 249021D3217E4FDB00AE95B9 /* Profile-production */,
+ 0964B30C2C4944F600AE1CDA /* Profile-internal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = "Release-internal";
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug-production */,
+ 0964B3092C4944E700AE1CDA /* Debug-internal */,
+ 97C147071CF9000F007C117D /* Release-production */,
+ 0964B30B2C4944EF00AE1CDA /* Release-internal */,
+ 249021D4217E4FDB00AE95B9 /* Profile-production */,
+ 0964B30D2C4944F600AE1CDA /* Profile-internal */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = "Release-internal";
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcodeproj/xcshareddata/xcschemes/internal.xcscheme b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/xcshareddata/xcschemes/internal.xcscheme
new file mode 100644
index 0000000..a6e93f1
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/xcshareddata/xcschemes/internal.xcscheme
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcodeproj/xcshareddata/xcschemes/production.xcscheme b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/xcshareddata/xcschemes/production.xcscheme
new file mode 100644
index 0000000..8c0bdda
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcodeproj/xcshareddata/xcschemes/production.xcscheme
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/reown_appkit/example/base/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..21a3cc1
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/reown_appkit/example/base/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/reown_appkit/example/base/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner/AppDelegate.swift b/packages/reown_appkit/example/base/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..805d27d
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/AppDelegate.swift
@@ -0,0 +1,98 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+
+ private static let EVENTS_CHANNEL = "com.walletconnect.flutterdapp/events"
+ private static let METHODS_CHANNEL = "com.walletconnect.flutterdapp/methods"
+
+ private var eventsChannel: FlutterEventChannel?
+ private var methodsChannel: FlutterMethodChannel?
+ var initialLink: String?
+
+ private let linkStreamHandler = LinkStreamHandler()
+
+ override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+
+ let controller = window.rootViewController as! FlutterViewController
+ eventsChannel = FlutterEventChannel(name: AppDelegate.EVENTS_CHANNEL, binaryMessenger: controller.binaryMessenger)
+ eventsChannel?.setStreamHandler(linkStreamHandler)
+
+ methodsChannel = FlutterMethodChannel(name: AppDelegate.METHODS_CHANNEL, binaryMessenger: controller.binaryMessenger)
+ methodsChannel?.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
+ if (call.method == "initialLink") {
+ if let link = self?.initialLink {
+ let handled = self?.linkStreamHandler.handleLink(link)
+ if (handled == true) {
+ self?.initialLink = nil
+ }
+ }
+ }
+ })
+
+ // Add your deep link handling logic here
+ if let url = launchOptions?[.url] as? URL {
+ self.initialLink = url.absoluteString
+ }
+
+ if let userActivityDictionary = launchOptions?[.userActivityDictionary] as? [String: Any],
+ let userActivity = userActivityDictionary["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity,
+ userActivity.activityType == NSUserActivityTypeBrowsingWeb {
+
+ handleIncomingUniversalLink(userActivity: userActivity)
+ }
+
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+
+ override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
+ return linkStreamHandler.handleLink(url.absoluteString)
+ }
+
+ override func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
+ if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
+ handleIncomingUniversalLink(userActivity: userActivity)
+ return true
+ }
+ return false
+ }
+
+ private func handleIncomingUniversalLink(userActivity: NSUserActivity) {
+ if let url = userActivity.webpageURL {
+ // Handle the URL, navigate to appropriate screen
+ print("App launched with Universal Link: \(url.absoluteString)")
+ let handled = linkStreamHandler.handleLink(url.absoluteString)
+ if (!handled){
+ self.initialLink = url.absoluteString
+ }
+ }
+ }
+}
+
+class LinkStreamHandler: NSObject, FlutterStreamHandler {
+ var eventSink: FlutterEventSink?
+ var queuedLinks = [String]()
+
+ func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
+ self.eventSink = events
+ queuedLinks.forEach({ events($0) })
+ queuedLinks.removeAll()
+ return nil
+ }
+
+ func onCancel(withArguments arguments: Any?) -> FlutterError? {
+ self.eventSink = nil
+ return nil
+ }
+
+ func handleLink(_ link: String) -> Bool {
+ guard let eventSink = eventSink else {
+ queuedLinks.append(link)
+ return false
+ }
+ eventSink(link)
+ return true
+ }
+}
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/100.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/100.png
new file mode 100644
index 0000000..1562d69
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/100.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/1024.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/1024.png
new file mode 100644
index 0000000..70e8759
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/1024.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/114.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/114.png
new file mode 100644
index 0000000..739ca0e
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/114.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/120.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/120.png
new file mode 100644
index 0000000..9289ddf
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/120.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/144.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/144.png
new file mode 100644
index 0000000..54378b5
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/144.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/152.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/152.png
new file mode 100644
index 0000000..b662208
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/152.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/167.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/167.png
new file mode 100644
index 0000000..84c6ef8
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/167.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/180.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/180.png
new file mode 100644
index 0000000..b51c501
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/180.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/20.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/20.png
new file mode 100644
index 0000000..489f465
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/20.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/29.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/29.png
new file mode 100644
index 0000000..2391946
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/29.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/40.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/40.png
new file mode 100644
index 0000000..619433e
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/40.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/50.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/50.png
new file mode 100644
index 0000000..bef95ed
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/50.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/57.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/57.png
new file mode 100644
index 0000000..0b66b60
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/57.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/58.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/58.png
new file mode 100644
index 0000000..ed6d763
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/58.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/60.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/60.png
new file mode 100644
index 0000000..00d81c4
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/60.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/72.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/72.png
new file mode 100644
index 0000000..73b1217
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/72.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/76.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/76.png
new file mode 100644
index 0000000..78908a0
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/76.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/80.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/80.png
new file mode 100644
index 0000000..df0c2bd
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/80.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/87.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/87.png
new file mode 100644
index 0000000..d842fb7
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/87.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/Contents.json b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/Contents.json
new file mode 100644
index 0000000..4fdf882
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon-internal.appiconset/Contents.json
@@ -0,0 +1,158 @@
+{
+ "images" : [
+ {
+ "filename" : "40.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "60.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "29.png",
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "87.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "57.png",
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "57x57"
+ },
+ {
+ "filename" : "114.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "57x57"
+ },
+ {
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "180.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "20.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "40.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "29.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "40.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "50.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "50x50"
+ },
+ {
+ "filename" : "100.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "50x50"
+ },
+ {
+ "filename" : "72.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "144.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "76.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "152.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "167.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "filename" : "1024.png",
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..d36b1fa
--- /dev/null
+++ b/packages/reown_appkit/example/base/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/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..dc9ada4
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..28c6bf0
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..f091b6b
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cde121
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..d0ef06e
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..dcdc230
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..c8f9ed8
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..75b2d16
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..c4df70d
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..6a84f41
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..d0e1f58
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/Contents.json b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..0bedcf2
--- /dev/null
+++ b/packages/reown_appkit/example/base/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/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/reown_appkit/example/base/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/packages/reown_appkit/example/base/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/reown_appkit/example/base/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/reown_appkit/example/base/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..f2e259c
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner/Base.lproj/Main.storyboard b/packages/reown_appkit/example/base/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner/Info-internal.plist b/packages/reown_appkit/example/base/ios/Runner/Info-internal.plist
new file mode 100644
index 0000000..0db52ba
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Info-internal.plist
@@ -0,0 +1,73 @@
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Flutter Dapp Internal
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ com.walletconnect.flutterdapp.internal
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Flutter Dapp Internal
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ com.walletconnect.flutterdapp.internal
+ CFBundleURLSchemes
+
+ wcflutterdapp-internal
+
+
+
+ CFBundleVersion
+ 2
+ LSApplicationCategoryType
+
+ LSApplicationQueriesSchemes
+
+ wcflutterwallet-internal
+ walletapp
+
+ ITSAppUsesNonExemptEncryption
+
+ LSRequiresIPhoneOS
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner/Info.plist b/packages/reown_appkit/example/base/ios/Runner/Info.plist
new file mode 100644
index 0000000..cc81ca1
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Info.plist
@@ -0,0 +1,73 @@
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Flutter Dapp
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ com.walletconnect.flutterdapp
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Flutter Dapp
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ com.walletconnect.flutterdapp
+ CFBundleURLSchemes
+
+ wcflutterdapp
+
+
+
+ CFBundleVersion
+ 2
+ ITSAppUsesNonExemptEncryption
+
+ LSApplicationCategoryType
+
+ LSApplicationQueriesSchemes
+
+ wcflutterwallet
+ walletapp
+
+ LSRequiresIPhoneOS
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner/Runner-Bridging-Header.h b/packages/reown_appkit/example/base/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/packages/reown_appkit/example/base/ios/Runner/Runner.entitlements b/packages/reown_appkit/example/base/ios/Runner/Runner.entitlements
new file mode 100644
index 0000000..84ca64b
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/Runner.entitlements
@@ -0,0 +1,11 @@
+
+
+
+
+ com.apple.developer.associated-domains
+
+ applinks:lab.web3modal.com
+ applinks:dev.lab.web3modal.com
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/Runner/RunnerProfile-internal.entitlements b/packages/reown_appkit/example/base/ios/Runner/RunnerProfile-internal.entitlements
new file mode 100644
index 0000000..0c67376
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/Runner/RunnerProfile-internal.entitlements
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/ios/fastlane/Appfile b/packages/reown_appkit/example/base/ios/fastlane/Appfile
new file mode 100644
index 0000000..de1b076
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/fastlane/Appfile
@@ -0,0 +1,5 @@
+itc_team_id("123564616") # App Store Connect Team ID
+team_id("W5R8AG9K22") # Developer Portal Team ID
+
+# For more information about the Appfile, see:
+# https://docs.fastlane.tools/advanced/#appfile
diff --git a/packages/reown_appkit/example/base/ios/fastlane/Fastfile b/packages/reown_appkit/example/base/ios/fastlane/Fastfile
new file mode 100644
index 0000000..ed18ff1
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/fastlane/Fastfile
@@ -0,0 +1,142 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "120"
+
+default_platform(:ios)
+
+platform :ios do
+
+ # Helper method to read the changelog
+ def read_changelog
+ changelog_file = '../../../../CHANGELOG.md'
+ changelog = ""
+
+ if File.exist?(changelog_file)
+ File.open(changelog_file, 'r') do |file|
+ changelog = file.read
+ end
+
+ # Split the changelog into entries based on the version header pattern
+ entries = changelog.split(/^##\s/)
+
+ # Get the latest entry, which is the first one after splitting
+ latest_entry = entries[1]
+
+ # Re-add the '##' header to the latest entry and remove empty lines
+ changelog = latest_entry.strip if latest_entry
+ changelog = changelog.gsub /^$\n/, ''
+ else
+ UI.user_error!("CHANGELOG.md file not found")
+ end
+
+ changelog
+ end
+
+ lane :release_testflight do |options|
+
+ # Setup the keychain and match to work with CI
+ setup_ci
+
+ match_password = ENV['MATCH_PASSWORD']
+ slack_url = ENV['SLACK_URL']
+ app_identifier = ENV['BUNDLE_ID']
+ _testflight_url = ENV['TESTFLIGHT_URL']
+
+ api_key = app_store_connect_api_key(
+ key_id: options[:app_store_key_id],
+ issuer_id: options[:apple_issuer_id],
+ key_content: options[:app_store_connect_key],
+ duration: 1200,
+ in_house: false,
+ )
+
+ match(
+ readonly: false,
+ type: "appstore",
+ app_identifier: "#{app_identifier}",
+ git_url: options[:match_git_url],
+ git_basic_authorization: options[:token],
+ api_key: api_key,
+ include_all_certificates: true,
+ force_for_new_devices: true,
+ force_for_new_certificates: true,
+ verbose: true,
+ )
+
+ number = latest_testflight_build_number(
+ app_identifier: "#{app_identifier}",
+ username: options[:username],
+ )
+ if number && !number.to_s.empty?
+ new_build_number = number.to_i + 1
+ else
+ # Handle the case where there is no previous build number
+ new_build_number = 1
+ end
+
+ increment_build_number(
+ build_number: new_build_number,
+ xcodeproj: "Runner.xcodeproj"
+ )
+
+ _flavor = options[:flavor]
+
+ gym(
+ configuration: "Release-#{_flavor}",
+ # project: "Runner.xcodeproj",
+ workspace: "Runner.xcworkspace",
+ scheme: _flavor,
+ export_method: "app-store",
+ clean: true,
+ xcargs: "PROJECT_ID='#{options[:project_id]}'"
+ )
+
+ changelog = read_changelog
+
+ upload_to_testflight(
+ apple_id: options[:app_id],
+ app_version: options[:app_version],
+ build_number: "#{new_build_number}",
+ app_identifier: "#{app_identifier}",
+ changelog: changelog,
+ distribute_external: true,
+ notify_external_testers: true,
+ skip_waiting_for_build_processing: false,
+ groups: ["External Testers"]
+ )
+
+ slack(
+ message: "📱 Flutter Dapp #{options[:app_version]}-#{_flavor} (#{new_build_number}) for 🍎 iOS successfully released!\n\n",
+ default_payloads: [],
+ attachment_properties: {
+ fields: [
+ {
+ title: "CHANGELOG",
+ value: changelog,
+ },
+ {
+ title: "LINK",
+ value: "#{_testflight_url}",
+ },
+ ]
+ }
+ )
+
+ clean_build_artifacts()
+
+ end
+
+end
diff --git a/packages/reown_appkit/example/base/ios/fastlane/README.md b/packages/reown_appkit/example/base/ios/fastlane/README.md
new file mode 100644
index 0000000..8b40179
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/fastlane/README.md
@@ -0,0 +1,32 @@
+fastlane documentation
+----
+
+# Installation
+
+Make sure you have the latest version of the Xcode command line tools installed:
+
+```sh
+xcode-select --install
+```
+
+For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
+
+# Available Actions
+
+## iOS
+
+### ios release_testflight
+
+```sh
+[bundle exec] fastlane ios release_testflight
+```
+
+
+
+----
+
+This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
+
+More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
+
+The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
diff --git a/packages/reown_appkit/example/base/ios/fastlane/report.xml b/packages/reown_appkit/example/base/ios/fastlane/report.xml
new file mode 100644
index 0000000..f0b30e6
--- /dev/null
+++ b/packages/reown_appkit/example/base/ios/fastlane/report.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/reown_appkit/example/base/lib/main.dart b/packages/reown_appkit/example/base/lib/main.dart
new file mode 100644
index 0000000..0464bd7
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/main.dart
@@ -0,0 +1,373 @@
+import 'dart:convert';
+import 'dart:developer';
+
+import 'package:flutter/material.dart';
+import 'package:reown_appkit/reown_appkit.dart';
+
+import 'package:reown_appkit_dapp/models/chain_metadata.dart';
+import 'package:reown_appkit_dapp/models/page_data.dart';
+import 'package:reown_appkit_dapp/pages/connect_page.dart';
+import 'package:reown_appkit_dapp/pages/pairings_page.dart';
+import 'package:reown_appkit_dapp/pages/sessions_page.dart';
+import 'package:reown_appkit_dapp/utils/constants.dart';
+import 'package:reown_appkit_dapp/utils/crypto/chain_data.dart';
+import 'package:reown_appkit_dapp/utils/crypto/helpers.dart';
+import 'package:reown_appkit_dapp/utils/dart_defines.dart';
+import 'package:reown_appkit_dapp/utils/deep_link_handler.dart';
+import 'package:reown_appkit_dapp/utils/string_constants.dart';
+import 'package:reown_appkit_dapp/widgets/event_widget.dart';
+
+void main() {
+ WidgetsFlutterBinding.ensureInitialized();
+ DeepLinkHandler.initListener();
+ runApp(const MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ const MyApp({super.key});
+
+ // This widget is the root of your application.
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: StringConstants.appTitle,
+ theme: ThemeData(
+ primarySwatch: Colors.blue,
+ ),
+ home: const MyHomePage(),
+ );
+ }
+}
+
+class MyHomePage extends StatefulWidget {
+ const MyHomePage({super.key});
+
+ @override
+ State createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State {
+ bool _initializing = true;
+
+ ReownAppKit? _appKit;
+
+ List _pageDatas = [];
+ int _selectedIndex = 0;
+
+ @override
+ void initState() {
+ super.initState();
+ initialize();
+ }
+
+ String get _flavor {
+ String flavor = '-${const String.fromEnvironment('FLUTTER_APP_FLAVOR')}';
+ return flavor.replaceAll('-production', '');
+ }
+
+ String _universalLink() {
+ Uri link = Uri.parse('https://lab.web3modal.com/flutter_appkit');
+ if (_flavor.isNotEmpty) {
+ return link
+ .replace(path: '${link.path}_internal')
+ .replace(host: 'dev.${link.host}')
+ .toString();
+ }
+ return link.toString();
+ }
+
+ Redirect _constructRedirect() {
+ return Redirect(
+ native: 'wcflutterdapp$_flavor://',
+ // universal: _universalLink(),
+ // // enable linkMode on Wallet so Dapps can use relay-less connection
+ // // universal: value must be set on cloud config as well
+ // linkMode: true,
+ );
+ }
+
+ Future initialize() async {
+ _appKit = ReownAppKit(
+ core: ReownCore(
+ projectId: DartDefines.projectId,
+ logLevel: LogLevel.error,
+ ),
+ metadata: PairingMetadata(
+ name: 'Flutter Dapp Sample',
+ description: 'Reown\'s sample dapp with Flutter',
+ url: _universalLink(),
+ icons: [
+ 'https://images.prismic.io/wallet-connect/65785a56531ac2845a260732_WalletConnect-App-Logo-1024X1024.png'
+ ],
+ redirect: _constructRedirect(),
+ ),
+ );
+
+ _appKit!.core.addLogListener(_logListener);
+
+ // Register event handlers
+ _appKit!.core.relayClient.onRelayClientError.subscribe(
+ _relayClientError,
+ );
+ _appKit!.core.relayClient.onRelayClientConnect.subscribe(_setState);
+ _appKit!.core.relayClient.onRelayClientDisconnect.subscribe(_setState);
+ _appKit!.core.relayClient.onRelayClientMessage.subscribe(
+ _onRelayMessage,
+ );
+
+ _appKit!.onSessionPing.subscribe(_onSessionPing);
+ _appKit!.onSessionEvent.subscribe(_onSessionEvent);
+ _appKit!.onSessionUpdate.subscribe(_onSessionUpdate);
+ _appKit!.onSessionConnect.subscribe(_onSessionConnect);
+ _appKit!.onSessionAuthResponse.subscribe(_onSessionAuthResponse);
+
+ await _appKit!.init();
+ await _registerEventHandlers();
+
+ DeepLinkHandler.init(_appKit!);
+ DeepLinkHandler.checkInitialLink();
+
+ // Loop through all the chain data
+ for (final ChainMetadata chain in ChainData.allChains) {
+ // Loop through the events for that chain
+ for (final event in getChainEvents(chain.type)) {
+ _appKit!.registerEventHandler(
+ chainId: chain.chainId,
+ event: event,
+ );
+ }
+ }
+
+ setState(() {
+ _pageDatas = [
+ PageData(
+ page: ConnectPage(appKit: _appKit!),
+ title: StringConstants.connectPageTitle,
+ icon: Icons.home,
+ ),
+ PageData(
+ page: PairingsPage(appKit: _appKit!),
+ title: StringConstants.pairingsPageTitle,
+ icon: Icons.vertical_align_center_rounded,
+ ),
+ PageData(
+ page: SessionsPage(appKit: _appKit!),
+ title: StringConstants.sessionsPageTitle,
+ icon: Icons.workspaces_filled,
+ ),
+ ];
+
+ _initializing = false;
+ });
+ }
+
+ Future _registerEventHandlers() async {
+ final onLine = _appKit!.core.connectivity.isOnline.value;
+ if (!onLine) {
+ await Future.delayed(const Duration(milliseconds: 500));
+ _registerEventHandlers();
+ return;
+ }
+
+ // Loop through all the chain data
+ for (final ChainMetadata chain in ChainData.allChains) {
+ // Loop through the events for that chain
+ for (final event in getChainEvents(chain.type)) {
+ _appKit!.registerEventHandler(
+ chainId: chain.chainId,
+ event: event,
+ );
+ }
+ }
+ }
+
+ void _onSessionConnect(SessionConnect? event) {
+ debugPrint('[SampleDapp] _onSessionConnect $event');
+ Future.delayed(const Duration(milliseconds: 500), () {
+ setState(() => _selectedIndex = 2);
+ });
+ }
+
+ void _onSessionAuthResponse(SessionAuthResponse? response) {
+ debugPrint('[SampleDapp] _onSessionAuthResponse $response');
+ if (response?.session != null) {
+ Future.delayed(const Duration(milliseconds: 500), () {
+ setState(() => _selectedIndex = 2);
+ });
+ }
+ }
+
+ void _setState(dynamic args) => setState(() {});
+
+ void _relayClientError(ErrorEvent? event) {
+ debugPrint('[SampleDapp] _relayClientError ${event?.error}');
+ _setState('');
+ }
+
+ @override
+ void dispose() {
+ // Unregister event handlers
+ _appKit!.core.removeLogListener(_logListener);
+
+ _appKit!.core.relayClient.onRelayClientError.unsubscribe(
+ _relayClientError,
+ );
+ _appKit!.core.relayClient.onRelayClientConnect.unsubscribe(_setState);
+ _appKit!.core.relayClient.onRelayClientDisconnect.unsubscribe(_setState);
+ _appKit!.core.relayClient.onRelayClientMessage.unsubscribe(
+ _onRelayMessage,
+ );
+
+ _appKit!.onSessionPing.unsubscribe(_onSessionPing);
+ _appKit!.onSessionEvent.unsubscribe(_onSessionEvent);
+ _appKit!.onSessionUpdate.unsubscribe(_onSessionUpdate);
+ _appKit!.onSessionConnect.subscribe(_onSessionConnect);
+ _appKit!.onSessionAuthResponse.subscribe(_onSessionAuthResponse);
+
+ super.dispose();
+ }
+
+ void _logListener(LogEvent event) {
+ if (event.level == Level.debug) {
+ // TODO send to mixpanel
+ log('${event.message}');
+ } else {
+ debugPrint('${event.message}');
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ if (_initializing) {
+ return const Center(
+ child: CircularProgressIndicator(
+ color: StyleConstants.primaryColor,
+ ),
+ );
+ }
+
+ final List navRail = [];
+ if (MediaQuery.of(context).size.width >= Constants.smallScreen) {
+ navRail.add(_buildNavigationRail());
+ }
+ navRail.add(
+ Expanded(
+ child: _pageDatas[_selectedIndex].page,
+ ),
+ );
+
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(_pageDatas[_selectedIndex].title),
+ centerTitle: true,
+ actions: [
+ const Text('Relay '),
+ CircleAvatar(
+ radius: 6.0,
+ backgroundColor: _appKit!.core.relayClient.isConnected
+ ? Colors.green
+ : Colors.red,
+ ),
+ const SizedBox(width: 16.0),
+ ],
+ ),
+ body: Center(
+ child: Container(
+ constraints: BoxConstraints(
+ maxWidth: Constants.smallScreen.toDouble(),
+ ),
+ child: Row(
+ children: navRail,
+ ),
+ ),
+ ),
+ bottomNavigationBar:
+ MediaQuery.of(context).size.width < Constants.smallScreen
+ ? _buildBottomNavBar()
+ : null,
+ );
+ }
+
+ Widget _buildBottomNavBar() {
+ return BottomNavigationBar(
+ currentIndex: _selectedIndex,
+ unselectedItemColor: Colors.grey,
+ selectedItemColor: Colors.indigoAccent,
+ showUnselectedLabels: true,
+ type: BottomNavigationBarType.fixed,
+ // called when one tab is selected
+ onTap: (index) => setState(() => _selectedIndex = index),
+ // bottom tab items
+ items: _pageDatas
+ .map(
+ (e) => BottomNavigationBarItem(
+ icon: Icon(e.icon),
+ label: e.title,
+ ),
+ )
+ .toList(),
+ );
+ }
+
+ Widget _buildNavigationRail() {
+ return NavigationRail(
+ selectedIndex: _selectedIndex,
+ onDestinationSelected: (index) => setState(() => _selectedIndex = index),
+ labelType: NavigationRailLabelType.selected,
+ destinations: _pageDatas
+ .map(
+ (e) => NavigationRailDestination(
+ icon: Icon(e.icon),
+ label: Text(e.title),
+ ),
+ )
+ .toList(),
+ );
+ }
+
+ void _onSessionPing(SessionPing? args) {
+ debugPrint('[SampleDapp] _onSessionPing $args');
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return EventWidget(
+ title: StringConstants.receivedPing,
+ content: 'Topic: ${args!.topic}',
+ );
+ },
+ );
+ }
+
+ void _onSessionEvent(SessionEvent? args) {
+ debugPrint('[SampleDapp] _onSessionEvent $args');
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return EventWidget(
+ title: StringConstants.receivedEvent,
+ content:
+ 'Topic: ${args!.topic}\nEvent Name: ${args.name}\nEvent Data: ${args.data}',
+ );
+ },
+ );
+ }
+
+ void _onSessionUpdate(SessionUpdate? args) {
+ debugPrint('[SampleDapp] _onSessionUpdate $args');
+ }
+
+ void _onRelayMessage(MessageEvent? args) async {
+ if (args != null) {
+ try {
+ final payloadString = await _appKit!.core.crypto.decode(
+ args.topic,
+ args.message,
+ );
+ final data = jsonDecode(payloadString ?? '{}') as Map;
+ debugPrint('[SampleDapp] _onRelayMessage data $data');
+ } catch (e) {
+ debugPrint('[SampleDapp] _onRelayMessage error $e');
+ }
+ }
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/models/accounts.dart b/packages/reown_appkit/example/base/lib/models/accounts.dart
new file mode 100644
index 0000000..309725e
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/models/accounts.dart
@@ -0,0 +1,76 @@
+import 'package:flutter/foundation.dart';
+
+class AccountDetails {
+ final String address;
+ final String chain;
+
+ const AccountDetails({
+ required this.address,
+ required this.chain,
+ });
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+
+ return other is AccountDetails &&
+ other.address == address &&
+ other.chain == chain;
+ }
+
+ @override
+ int get hashCode => address.hashCode ^ chain.hashCode;
+}
+
+class Account {
+ final int id;
+ final String name;
+ final String mnemonic;
+ final String privateKey;
+ final List details;
+
+ const Account({
+ required this.id,
+ required this.name,
+ required this.mnemonic,
+ required this.privateKey,
+ required this.details,
+ });
+
+ Account copyWith({
+ int? id,
+ String? name,
+ String? mnemonic,
+ String? privateKey,
+ List? details,
+ }) {
+ return Account(
+ id: id ?? this.id,
+ name: name ?? this.name,
+ mnemonic: mnemonic ?? this.mnemonic,
+ privateKey: privateKey ?? this.privateKey,
+ details: details ?? this.details,
+ );
+ }
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+
+ return other is Account &&
+ other.id == id &&
+ other.name == name &&
+ other.mnemonic == mnemonic &&
+ other.privateKey == privateKey &&
+ listEquals(other.details, details);
+ }
+
+ @override
+ int get hashCode {
+ return id.hashCode ^
+ name.hashCode ^
+ mnemonic.hashCode ^
+ privateKey.hashCode ^
+ details.hashCode;
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/models/chain_metadata.dart b/packages/reown_appkit/example/base/lib/models/chain_metadata.dart
new file mode 100644
index 0000000..834a0ba
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/models/chain_metadata.dart
@@ -0,0 +1,51 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+
+enum ChainType {
+ eip155,
+ solana,
+ kadena,
+ cosmos,
+ polkadot,
+}
+
+class ChainMetadata {
+ final String chainId;
+ final String name;
+ final String logo;
+ final bool isTestnet;
+ final Color color;
+ final ChainType type;
+ final List rpc;
+
+ const ChainMetadata({
+ required this.chainId,
+ required this.name,
+ required this.logo,
+ this.isTestnet = false,
+ required this.color,
+ required this.type,
+ required this.rpc,
+ });
+
+ @override
+ bool operator ==(Object other) {
+ if (identical(this, other)) return true;
+
+ return other is ChainMetadata &&
+ other.chainId == chainId &&
+ other.name == name &&
+ other.logo == logo &&
+ other.isTestnet == isTestnet &&
+ listEquals(other.rpc, rpc);
+ }
+
+ @override
+ int get hashCode {
+ return chainId.hashCode ^
+ name.hashCode ^
+ logo.hashCode ^
+ rpc.hashCode ^
+ isTestnet.hashCode;
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/models/eth/ethereum_sign_message.dart b/packages/reown_appkit/example/base/lib/models/eth/ethereum_sign_message.dart
new file mode 100644
index 0000000..f5dda50
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/models/eth/ethereum_sign_message.dart
@@ -0,0 +1,19 @@
+enum WCSignType {
+ message,
+ personalMessage,
+ typedMessageV2,
+ typedMessageV3,
+ typedMessageV4,
+}
+
+class EthereumSignMessage {
+ final String data;
+ final String address;
+ final WCSignType type;
+
+ const EthereumSignMessage({
+ required this.data,
+ required this.address,
+ required this.type,
+ });
+}
diff --git a/packages/reown_appkit/example/base/lib/models/page_data.dart b/packages/reown_appkit/example/base/lib/models/page_data.dart
new file mode 100644
index 0000000..1a9f4e4
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/models/page_data.dart
@@ -0,0 +1,13 @@
+import 'package:flutter/material.dart';
+
+class PageData {
+ Widget page;
+ String title;
+ IconData icon;
+
+ PageData({
+ required this.page,
+ required this.title,
+ required this.icon,
+ });
+}
diff --git a/packages/reown_appkit/example/base/lib/models/solana/solana_sign_transaction.dart b/packages/reown_appkit/example/base/lib/models/solana/solana_sign_transaction.dart
new file mode 100644
index 0000000..294aded
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/models/solana/solana_sign_transaction.dart
@@ -0,0 +1,72 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'solana_sign_transaction.g.dart';
+
+@JsonSerializable(includeIfNull: false)
+class SolanaSignTransaction {
+ final String feePayer;
+ final String recentBlockhash;
+ final List instructions;
+
+ SolanaSignTransaction({
+ required this.feePayer,
+ required this.recentBlockhash,
+ required this.instructions,
+ });
+
+ factory SolanaSignTransaction.fromJson(Map json) =>
+ _$SolanaSignTransactionFromJson(json);
+
+ Map toJson() => _$SolanaSignTransactionToJson(this);
+
+ @override
+ String toString() {
+ return 'SolanaSignTransaction(feePayer: $feePayer, recentBlockhash: $recentBlockhash, instructions: $instructions)';
+ }
+}
+
+@JsonSerializable(includeIfNull: false)
+class SolanaInstruction {
+ final String programId;
+ final List keys;
+ final String data;
+
+ SolanaInstruction({
+ required this.programId,
+ required this.keys,
+ required this.data,
+ });
+
+ factory SolanaInstruction.fromJson(Map json) =>
+ _$SolanaInstructionFromJson(json);
+
+ Map toJson() => _$SolanaInstructionToJson(this);
+
+ @override
+ String toString() {
+ return 'SolanaInstruction(programId: $programId, keys: $keys, data: $data)';
+ }
+}
+
+@JsonSerializable(includeIfNull: false)
+class SolanaKeyMetadata {
+ final String pubkey;
+ final bool isSigner;
+ final bool isWritable;
+
+ SolanaKeyMetadata({
+ required this.pubkey,
+ required this.isSigner,
+ required this.isWritable,
+ });
+
+ factory SolanaKeyMetadata.fromJson(Map json) =>
+ _$SolanaKeyMetadataFromJson(json);
+
+ Map toJson() => _$SolanaKeyMetadataToJson(this);
+
+ @override
+ String toString() {
+ return 'SolanaKeyMetadata(pubkey: $pubkey, isSigner: $isSigner, isWritable: $isWritable)';
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/models/solana/solana_sign_transaction.g.dart b/packages/reown_appkit/example/base/lib/models/solana/solana_sign_transaction.g.dart
new file mode 100644
index 0000000..ada6a96
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/models/solana/solana_sign_transaction.g.dart
@@ -0,0 +1,55 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'solana_sign_transaction.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+SolanaSignTransaction _$SolanaSignTransactionFromJson(
+ Map json) =>
+ SolanaSignTransaction(
+ feePayer: json['feePayer'] as String,
+ recentBlockhash: json['recentBlockhash'] as String,
+ instructions: (json['instructions'] as List)
+ .map((e) => SolanaInstruction.fromJson(e as Map))
+ .toList(),
+ );
+
+Map _$SolanaSignTransactionToJson(
+ SolanaSignTransaction instance) =>
+ {
+ 'feePayer': instance.feePayer,
+ 'recentBlockhash': instance.recentBlockhash,
+ 'instructions': instance.instructions,
+ };
+
+SolanaInstruction _$SolanaInstructionFromJson(Map json) =>
+ SolanaInstruction(
+ programId: json['programId'] as String,
+ keys: (json['keys'] as List)
+ .map((e) => SolanaKeyMetadata.fromJson(e as Map))
+ .toList(),
+ data: json['data'] as String,
+ );
+
+Map _$SolanaInstructionToJson(SolanaInstruction instance) =>
+ {
+ 'programId': instance.programId,
+ 'keys': instance.keys,
+ 'data': instance.data,
+ };
+
+SolanaKeyMetadata _$SolanaKeyMetadataFromJson(Map json) =>
+ SolanaKeyMetadata(
+ pubkey: json['pubkey'] as String,
+ isSigner: json['isSigner'] as bool,
+ isWritable: json['isWritable'] as bool,
+ );
+
+Map _$SolanaKeyMetadataToJson(SolanaKeyMetadata instance) =>
+ {
+ 'pubkey': instance.pubkey,
+ 'isSigner': instance.isSigner,
+ 'isWritable': instance.isWritable,
+ };
diff --git a/packages/reown_appkit/example/base/lib/pages/connect_page.dart b/packages/reown_appkit/example/base/lib/pages/connect_page.dart
new file mode 100644
index 0000000..cdb4826
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/pages/connect_page.dart
@@ -0,0 +1,582 @@
+import 'dart:async';
+
+import 'package:fl_toast/fl_toast.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:package_info_plus/package_info_plus.dart';
+import 'package:qr_flutter/qr_flutter.dart';
+import 'package:reown_appkit/reown_appkit.dart';
+import 'package:reown_appkit_dapp/models/chain_metadata.dart';
+import 'package:reown_appkit_dapp/utils/constants.dart';
+import 'package:reown_appkit_dapp/utils/crypto/chain_data.dart';
+import 'package:reown_appkit_dapp/utils/crypto/eip155.dart';
+import 'package:reown_appkit_dapp/utils/crypto/polkadot.dart';
+import 'package:reown_appkit_dapp/utils/crypto/solana.dart';
+import 'package:reown_appkit_dapp/utils/sample_wallets.dart';
+import 'package:reown_appkit_dapp/utils/string_constants.dart';
+import 'package:reown_appkit_dapp/widgets/chain_button.dart';
+
+class ConnectPage extends StatefulWidget {
+ const ConnectPage({
+ super.key,
+ required this.appKit,
+ });
+
+ final ReownAppKit appKit;
+
+ @override
+ ConnectPageState createState() => ConnectPageState();
+}
+
+class ConnectPageState extends State {
+ bool _testnetOnly = false;
+ final List _selectedChains = [];
+ bool _shouldDismissQrCode = true;
+
+ @override
+ void initState() {
+ super.initState();
+ widget.appKit.onSessionConnect.subscribe(_onSessionConnect);
+ }
+
+ @override
+ void dispose() {
+ widget.appKit.onSessionConnect.unsubscribe(_onSessionConnect);
+ super.dispose();
+ }
+
+ void _selectChain(ChainMetadata chain) {
+ setState(() {
+ if (_selectedChains.contains(chain)) {
+ _selectedChains.remove(chain);
+ } else {
+ _selectedChains.add(chain);
+ }
+ _updateNamespaces();
+ });
+ }
+
+ Map requiredNamespaces = {};
+ Map optionalNamespaces = {};
+
+ void _updateNamespaces() {
+ optionalNamespaces = {};
+
+ final evmChains =
+ _selectedChains.where((e) => e.type == ChainType.eip155).toList();
+ if (evmChains.isNotEmpty) {
+ optionalNamespaces['eip155'] = RequiredNamespace(
+ chains: evmChains.map((c) => c.chainId).toList(),
+ methods: EIP155.methods.values.toList(),
+ events: EIP155.events.values.toList(),
+ );
+ }
+
+ final solanaChains =
+ _selectedChains.where((e) => e.type == ChainType.solana).toList();
+ if (solanaChains.isNotEmpty) {
+ optionalNamespaces['solana'] = RequiredNamespace(
+ chains: solanaChains.map((c) => c.chainId).toList(),
+ methods: Solana.methods.values.toList(),
+ events: Solana.events.values.toList(),
+ );
+ }
+
+ final polkadotChains =
+ _selectedChains.where((e) => e.type == ChainType.polkadot).toList();
+ if (polkadotChains.isNotEmpty) {
+ optionalNamespaces['polkadot'] = RequiredNamespace(
+ chains: polkadotChains.map((c) => c.chainId).toList(),
+ methods: Polkadot.methods.values.toList(),
+ events: Polkadot.events.values.toList(),
+ );
+ }
+
+ if (optionalNamespaces.isEmpty) {
+ requiredNamespaces = {};
+ } else {
+ // WalletConnectModal still requires to have requiredNamespaces
+ // this has to be changed in that SDK
+ requiredNamespaces = {
+ 'eip155': const RequiredNamespace(
+ chains: ['eip155:1'],
+ methods: ['personal_sign', 'eth_signTransaction'],
+ events: ['chainChanged'],
+ ),
+ };
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ // Build the list of chain buttons, clear if the textnet changed
+ final testChains = ChainData.allChains.where((e) => e.isTestnet).toList();
+ final mainChains = ChainData.allChains.where((e) => !e.isTestnet).toList();
+ final List chains = _testnetOnly ? testChains : mainChains;
+
+ final List evmChainButtons = [];
+ final List nonEvmChainButtons = [];
+
+ final evmChains = chains.where((e) => e.type == ChainType.eip155);
+ final nonEvmChains = chains.where((e) => e.type != ChainType.eip155);
+
+ for (final ChainMetadata chain in evmChains) {
+ // Build the button
+ evmChainButtons.add(
+ ChainButton(
+ chain: chain,
+ onPressed: () => _selectChain(chain),
+ selected: _selectedChains.contains(chain),
+ ),
+ );
+ }
+
+ for (final ChainMetadata chain in nonEvmChains) {
+ // Build the button
+ nonEvmChainButtons.add(
+ ChainButton(
+ chain: chain,
+ onPressed: () => _selectChain(chain),
+ selected: _selectedChains.contains(chain),
+ ),
+ );
+ }
+
+ return ListView(
+ padding: const EdgeInsets.symmetric(horizontal: StyleConstants.linear8),
+ children: [
+ const Text(
+ 'Flutter Dapp',
+ style: StyleConstants.subtitleText,
+ textAlign: TextAlign.center,
+ ),
+ const SizedBox(height: StyleConstants.linear8),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ const Text(
+ StringConstants.testnetsOnly,
+ style: StyleConstants.buttonText,
+ ),
+ Switch(
+ value: _testnetOnly,
+ onChanged: (value) {
+ setState(() {
+ _selectedChains.clear();
+ _testnetOnly = value;
+ });
+ },
+ ),
+ ],
+ ),
+ const Text('EVM Chains:', style: StyleConstants.buttonText),
+ const SizedBox(height: StyleConstants.linear8),
+ Wrap(
+ spacing: 10.0,
+ children: evmChainButtons,
+ ),
+ const Divider(),
+ const Text('Non EVM Chains:', style: StyleConstants.buttonText),
+ Wrap(
+ spacing: 10.0,
+ children: nonEvmChainButtons,
+ ),
+ const SizedBox(height: StyleConstants.linear8),
+ const Divider(),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: StyleConstants.linear8),
+ const Text(
+ 'Connect Session Propose:',
+ style: StyleConstants.buttonText,
+ ),
+ const SizedBox(height: StyleConstants.linear8),
+ Column(
+ children: WCSampleWallets.getSampleWallets().map((wallet) {
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 8.0),
+ child: ElevatedButton(
+ style: _buttonStyle,
+ onPressed: _selectedChains.isEmpty
+ ? null
+ : () {
+ _onConnect(
+ nativeLink: '${wallet['schema']}',
+ closeModal: () {
+ if (Navigator.canPop(context)) {
+ Navigator.of(context).pop();
+ }
+ },
+ showToast: (m) async {
+ showPlatformToast(
+ child: Text(m),
+ context: context,
+ );
+ },
+ );
+ },
+ child: Text(
+ '${wallet['name']}',
+ style: StyleConstants.buttonText,
+ ),
+ ),
+ );
+ }).toList(),
+ ),
+ const SizedBox(height: StyleConstants.linear8),
+ const Divider(),
+ const Text(
+ '1-Click Auth with LinkMode:',
+ style: StyleConstants.buttonText,
+ ),
+ const SizedBox(height: StyleConstants.linear8),
+ Column(
+ children: WCSampleWallets.getSampleWallets().map((wallet) {
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 8.0),
+ child: ElevatedButton(
+ style: _buttonStyle,
+ onPressed: _selectedChains.isEmpty
+ ? null
+ : () {
+ _sessionAuthenticate(
+ nativeLink: '${wallet['schema']}',
+ universalLink: '${wallet['universal']}',
+ closeModal: () {
+ if (Navigator.canPop(context)) {
+ Navigator.of(context).pop();
+ }
+ },
+ showToast: (message) {
+ showPlatformToast(
+ child: Text(message),
+ context: context,
+ );
+ },
+ );
+ },
+ child: Text(
+ '${wallet['name']}',
+ style: StyleConstants.buttonText,
+ ),
+ ),
+ );
+ }).toList(),
+ ),
+ ],
+ ),
+ const SizedBox(height: StyleConstants.linear16),
+ const Divider(height: 1.0),
+ const SizedBox(height: StyleConstants.linear16),
+ const Text(
+ 'Redirect:',
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const Text('Native: '),
+ Expanded(
+ child: Text(
+ '${widget.appKit.metadata.redirect?.native}',
+ style: const TextStyle(fontWeight: FontWeight.bold),
+ ),
+ ),
+ ],
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const Text('Universal: '),
+ Expanded(
+ child: Text(
+ '${widget.appKit.metadata.redirect?.universal}',
+ style: const TextStyle(fontWeight: FontWeight.bold),
+ ),
+ ),
+ ],
+ ),
+ Row(
+ children: [
+ const Text('Link Mode: '),
+ Text(
+ '${widget.appKit.metadata.redirect?.linkMode}',
+ style: const TextStyle(fontWeight: FontWeight.bold),
+ ),
+ ],
+ ),
+ const SizedBox(height: StyleConstants.linear8),
+ FutureBuilder(
+ future: PackageInfo.fromPlatform(),
+ builder: (context, snapshot) {
+ if (!snapshot.hasData) {
+ return const SizedBox.shrink();
+ }
+ final v = snapshot.data!.version;
+ final b = snapshot.data!.buildNumber;
+ const f = String.fromEnvironment('FLUTTER_APP_FLAVOR');
+ // return Text('App Version: $v-$f ($b) - SDK v$packageVersion');
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const Text('App Version: '),
+ Expanded(
+ child: Text(
+ '$v-$f ($b) - SDK v$packageVersion',
+ style: const TextStyle(fontWeight: FontWeight.bold),
+ ),
+ ),
+ ],
+ );
+ },
+ ),
+ const SizedBox(height: StyleConstants.linear16),
+ ],
+ );
+ }
+
+ Future _onConnect({
+ required String nativeLink,
+ VoidCallback? closeModal,
+ Function(String message)? showToast,
+ }) async {
+ debugPrint('[SampleDapp] Creating connection with $nativeLink');
+ // It is currently safer to send chains approvals on optionalNamespaces
+ // but depending on Wallet implementation you may need to send some (for innstance eip155:1) as required
+ final connectResponse = await widget.appKit.connect(
+ requiredNamespaces: requiredNamespaces,
+ optionalNamespaces: optionalNamespaces,
+ );
+
+ try {
+ final encodedUri = Uri.encodeComponent(connectResponse.uri.toString());
+ final uri = '$nativeLink?uri=$encodedUri';
+ await ReownCoreUtils.openURL(uri);
+ } catch (e) {
+ _showQrCode(connectResponse.uri.toString());
+ }
+
+ debugPrint('[SampleDapp] Awaiting session proposal settlement');
+ try {
+ await connectResponse.session.future;
+ showToast?.call(StringConstants.connectionEstablished);
+ } on JsonRpcError catch (e) {
+ showToast?.call(e.message.toString());
+ }
+ closeModal?.call();
+ }
+
+ void _sessionAuthenticate({
+ required String nativeLink,
+ required String universalLink,
+ VoidCallback? closeModal,
+ Function(String message)? showToast,
+ }) async {
+ debugPrint(
+ '[SampleDapp] Creating authenticate with $nativeLink, $universalLink');
+ final methods1 = requiredNamespaces['eip155']?.methods ?? [];
+ final methods2 = optionalNamespaces['eip155']?.methods ?? [];
+ final authResponse = await widget.appKit.authenticate(
+ params: SessionAuthRequestParams(
+ chains: _selectedChains.map((e) => e.chainId).toList(),
+ domain: Uri.parse(widget.appKit.metadata.url).authority,
+ nonce: AuthUtils.generateNonce(),
+ uri: widget.appKit.metadata.url,
+ statement: 'Welcome to example flutter app',
+ methods: {...methods1, ...methods2}.toList(),
+ ),
+ walletUniversalLink: universalLink,
+ );
+
+ debugPrint('[SampleDapp] authResponse.uri ${authResponse.uri}');
+ try {
+ // If response uri is not universalLink show QR Code
+ if (authResponse.uri?.authority != Uri.parse(universalLink).authority) {
+ _showQrCode('${authResponse.uri}', walletScheme: nativeLink);
+ } else {
+ await ReownCoreUtils.openURL(authResponse.uri.toString());
+ }
+ } catch (e) {
+ debugPrint('[SampleDapp] authResponse error $e');
+ _showQrCode('${authResponse.uri}', walletScheme: nativeLink);
+ }
+
+ try {
+ debugPrint('[SampleDapp] Awaiting 1-CA session');
+ final response = await authResponse.completer.future;
+
+ if (response.session != null) {
+ showToast?.call(
+ '${StringConstants.authSucceeded} and ${StringConstants.connectionEstablished}',
+ );
+ } else {
+ final error = response.error ?? response.jsonRpcError;
+ showToast?.call(error.toString());
+ }
+ } catch (e) {
+ debugPrint('[SampleDapp] 1-CA $e');
+ showToast?.call(StringConstants.connectionFailed);
+ }
+ closeModal?.call();
+ }
+
+ Future _showQrCode(String uri, {String walletScheme = ''}) async {
+ // Show the QR code
+ debugPrint('[SampleDapp] Showing QR Code: $uri');
+ _shouldDismissQrCode = true;
+ if (kIsWeb) {
+ await showDialog(
+ context: context,
+ barrierDismissible: false,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ insetPadding: const EdgeInsets.all(0.0),
+ contentPadding: const EdgeInsets.all(0.0),
+ backgroundColor: Colors.white,
+ content: SizedBox(
+ width: 400.0,
+ child: AspectRatio(
+ aspectRatio: 0.8,
+ child: Padding(
+ padding: const EdgeInsets.all(20.0),
+ child: _QRCodeView(
+ uri: uri,
+ ),
+ ),
+ ),
+ ),
+ actions: [
+ TextButton(
+ onPressed: () => Navigator.pop(context),
+ child: const Text('Cancel'),
+ )
+ ],
+ );
+ },
+ );
+ _shouldDismissQrCode = false;
+ return;
+ }
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ fullscreenDialog: true,
+ builder: (context) => QRCodeScreen(
+ uri: uri,
+ walletScheme: walletScheme,
+ ),
+ ),
+ );
+ }
+
+ void _onSessionConnect(SessionConnect? event) async {
+ if (event == null) return;
+
+ setState(() => _selectedChains.clear());
+
+ if (_shouldDismissQrCode && Navigator.canPop(context)) {
+ _shouldDismissQrCode = false;
+ Navigator.pop(context);
+ }
+ }
+
+ ButtonStyle get _buttonStyle => ButtonStyle(
+ backgroundColor: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.disabled)) {
+ return StyleConstants.grayColor;
+ }
+ return StyleConstants.primaryColor;
+ },
+ ),
+ minimumSize: MaterialStateProperty.all(const Size(
+ 1000.0,
+ StyleConstants.linear48,
+ )),
+ shape: MaterialStateProperty.all(
+ RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(
+ StyleConstants.linear8,
+ ),
+ ),
+ ),
+ );
+}
+
+class QRCodeScreen extends StatefulWidget {
+ const QRCodeScreen({
+ super.key,
+ required this.uri,
+ this.walletScheme = '',
+ });
+ final String uri;
+ final String walletScheme;
+
+ @override
+ State createState() => _QRCodeScreenState();
+}
+
+class _QRCodeScreenState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Material(
+ child: Scaffold(
+ appBar: AppBar(title: const Text(StringConstants.scanQrCode)),
+ body: _QRCodeView(
+ uri: widget.uri,
+ walletScheme: widget.walletScheme,
+ ),
+ ),
+ );
+ }
+}
+
+class _QRCodeView extends StatelessWidget {
+ const _QRCodeView({
+ required this.uri,
+ this.walletScheme = '',
+ });
+ final String uri;
+ final String walletScheme;
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ QrImageView(data: uri),
+ const SizedBox(
+ height: StyleConstants.linear16,
+ ),
+ ElevatedButton(
+ onPressed: () {
+ Clipboard.setData(
+ ClipboardData(text: uri.toString()),
+ ).then(
+ (_) => showPlatformToast(
+ child: const Text(StringConstants.copiedToClipboard),
+ context: context,
+ ),
+ );
+ },
+ child: const Text('Copy URL to Clipboard'),
+ ),
+ Visibility(
+ visible: walletScheme.isNotEmpty,
+ child: ElevatedButton(
+ onPressed: () async {
+ final encodedUri = Uri.encodeComponent(uri);
+ await ReownCoreUtils.openURL('$walletScheme?uri=$encodedUri');
+ },
+ child: const Text('Open Test Wallet'),
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/pages/pairings_page.dart b/packages/reown_appkit/example/base/lib/pages/pairings_page.dart
new file mode 100644
index 0000000..a3db3e0
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/pages/pairings_page.dart
@@ -0,0 +1,110 @@
+import 'package:flutter/material.dart';
+import 'package:reown_appkit/reown_appkit.dart';
+
+import 'package:reown_appkit_dapp/utils/constants.dart';
+import 'package:reown_appkit_dapp/utils/string_constants.dart';
+import 'package:reown_appkit_dapp/widgets/pairing_item.dart';
+
+class PairingsPage extends StatefulWidget {
+ const PairingsPage({
+ super.key,
+ required this.appKit,
+ });
+
+ final ReownAppKit appKit;
+
+ @override
+ PairingsPageState createState() => PairingsPageState();
+}
+
+class PairingsPageState extends State {
+ List _pairings = [];
+
+ @override
+ void initState() {
+ _pairings = widget.appKit.pairings.getAll();
+ // widget.appKit.onSessionDelete.subscribe(_onSessionDelete);
+ widget.appKit.core.pairing.onPairingDelete.subscribe(_onPairingDelete);
+ widget.appKit.core.pairing.onPairingExpire.subscribe(_onPairingDelete);
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ // widget.appKit.onSessionDelete.unsubscribe(_onSessionDelete);
+ widget.appKit.core.pairing.onPairingDelete.unsubscribe(_onPairingDelete);
+ widget.appKit.core.pairing.onPairingExpire.unsubscribe(_onPairingDelete);
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final List pairingItems = _pairings
+ .map(
+ (PairingInfo pairing) => PairingItem(
+ key: ValueKey(pairing.topic),
+ pairing: pairing,
+ onTap: () async {
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: const Text(
+ StringConstants.deletePairing,
+ style: StyleConstants.titleText,
+ ),
+ content: Text(
+ pairing.topic,
+ ),
+ actions: [
+ TextButton(
+ child: const Text(
+ StringConstants.cancel,
+ ),
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ ),
+ TextButton(
+ child: const Text(
+ StringConstants.delete,
+ ),
+ onPressed: () async {
+ try {
+ widget.appKit.core.pairing.disconnect(
+ topic: pairing.topic,
+ );
+ Navigator.of(context).pop();
+ } catch (e) {
+ debugPrint('[SampleDapp] ${e.toString()}');
+ }
+ },
+ ),
+ ],
+ );
+ },
+ );
+ },
+ ),
+ )
+ .toList();
+
+ return Center(
+ child: Container(
+ constraints: const BoxConstraints(
+ maxWidth: StyleConstants.maxWidth,
+ ),
+ child: ListView(
+ padding: const EdgeInsets.all(0.0),
+ children: pairingItems,
+ ),
+ ),
+ );
+ }
+
+ void _onPairingDelete(PairingEvent? event) {
+ setState(() {
+ _pairings = widget.appKit.pairings.getAll();
+ });
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/pages/sessions_page.dart b/packages/reown_appkit/example/base/lib/pages/sessions_page.dart
new file mode 100644
index 0000000..3b23b9d
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/pages/sessions_page.dart
@@ -0,0 +1,121 @@
+import 'package:flutter/material.dart';
+import 'package:reown_appkit/reown_appkit.dart';
+
+import 'package:reown_appkit_dapp/utils/constants.dart';
+import 'package:reown_appkit_dapp/utils/string_constants.dart';
+import 'package:reown_appkit_dapp/widgets/session_item.dart';
+import 'package:reown_appkit_dapp/widgets/session_widget.dart';
+
+class SessionsPage extends StatefulWidget {
+ const SessionsPage({
+ super.key,
+ required this.appKit,
+ });
+
+ final ReownAppKit appKit;
+
+ @override
+ SessionsPageState createState() => SessionsPageState();
+}
+
+class SessionsPageState extends State {
+ Map _activeSessions = {};
+ String _selectedSession = '';
+
+ @override
+ void initState() {
+ _activeSessions = widget.appKit.getActiveSessions();
+ widget.appKit.onSessionDelete.subscribe(_onSessionDelete);
+ widget.appKit.onSessionExpire.subscribe(_onSessionExpire);
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ widget.appKit.onSessionDelete.unsubscribe(_onSessionDelete);
+ widget.appKit.onSessionExpire.unsubscribe(_onSessionExpire);
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final List sessions = _activeSessions.values.toList();
+ return Center(
+ child: Container(
+ constraints: const BoxConstraints(
+ maxWidth: StyleConstants.maxWidth,
+ ),
+ child: Align(
+ alignment: Alignment.topCenter,
+ child: SingleChildScrollView(
+ child: ExpansionPanelList(
+ elevation: 0.0,
+ materialGapSize: 0.0,
+ expansionCallback: (int index, bool isExpanded) {
+ setState(() {
+ _selectedSession = !isExpanded ? '' : sessions[index].topic;
+ });
+ },
+ children: sessions
+ .map(
+ (session) => ExpansionPanel(
+ canTapOnHeader: true,
+ isExpanded: _selectedSession == session.topic,
+ backgroundColor: Colors.blue.withOpacity(0.2),
+ headerBuilder: (context, isExpanded) {
+ return SessionItem(
+ key: ValueKey(session.topic),
+ session: session,
+ );
+ },
+ body: Container(
+ height: MediaQuery.of(context).size.height - 300.0,
+ padding: const EdgeInsets.symmetric(horizontal: 12.0),
+ child: _buildSessionView(),
+ ),
+ ),
+ )
+ .toList(),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+
+ Widget _buildSessionView() {
+ if (_selectedSession == '') {
+ return const Center(
+ child: Text(
+ StringConstants.noSessionSelected,
+ style: StyleConstants.titleText,
+ ),
+ );
+ }
+
+ final SessionData session = _activeSessions[_selectedSession]!;
+
+ return SessionWidget(
+ appKit: widget.appKit,
+ session: session,
+ );
+ }
+
+ void _onSessionDelete(SessionDelete? event) {
+ setState(() {
+ if (event!.topic == _selectedSession) {
+ _selectedSession = '';
+ }
+ _activeSessions = widget.appKit.getActiveSessions();
+ });
+ }
+
+ void _onSessionExpire(SessionExpire? event) {
+ setState(() {
+ if (event!.topic == _selectedSession) {
+ _selectedSession = '';
+ }
+ _activeSessions = widget.appKit.getActiveSessions();
+ });
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/constants.dart b/packages/reown_appkit/example/base/lib/utils/constants.dart
new file mode 100644
index 0000000..a17612d
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/constants.dart
@@ -0,0 +1,54 @@
+import 'package:flutter/material.dart';
+
+class Constants {
+ static const smallScreen = 640;
+}
+
+class StyleConstants {
+ static const Color primaryColor = Color.fromARGB(255, 16, 165, 206);
+ static const Color secondaryColor = Color(0xFF1A1A1A);
+ static const Color grayColor = Color.fromARGB(255, 180, 180, 180);
+ static const Color titleTextColor = Color(0xFFFFFFFF);
+
+ // Linear
+ static const double linear8 = 8;
+ static const double linear16 = 16;
+ static const double linear24 = 24;
+ static const double linear32 = 32;
+ static const double linear48 = 48;
+ static const double linear56 = 56;
+ static const double linear72 = 72;
+ static const double linear80 = 80;
+
+ // Magic Number
+ static const double magic10 = 10;
+ static const double magic14 = 14;
+ static const double magic20 = 20;
+ static const double magic40 = 28;
+ static const double magic64 = 64;
+
+ // Width
+ static const double maxWidth = 500;
+
+ // Text styles
+ static const TextStyle titleText = TextStyle(
+ color: Colors.black,
+ fontSize: magic40,
+ fontWeight: FontWeight.w600,
+ );
+ static const TextStyle subtitleText = TextStyle(
+ color: Colors.black,
+ fontSize: linear24,
+ fontWeight: FontWeight.w600,
+ );
+ static const TextStyle paragraph = TextStyle(
+ color: Colors.black,
+ fontSize: linear16,
+ fontWeight: FontWeight.w600,
+ );
+ static const TextStyle buttonText = TextStyle(
+ color: Colors.black,
+ fontSize: magic14,
+ fontWeight: FontWeight.w600,
+ );
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/crypto/chain_data.dart b/packages/reown_appkit/example/base/lib/utils/crypto/chain_data.dart
new file mode 100644
index 0000000..b6b4396
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/crypto/chain_data.dart
@@ -0,0 +1,199 @@
+import 'package:flutter/material.dart';
+import 'package:reown_appkit_dapp/models/chain_metadata.dart';
+
+class ChainData {
+ static final List eip155Chains = [
+ ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:1',
+ name: 'Ethereum',
+ logo: '/chain-logos/eip155-1.png',
+ color: Colors.blue.shade300,
+ rpc: ['https://eth.drpc.org'],
+ ),
+ ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:137',
+ name: 'Polygon',
+ logo: '/chain-logos/eip155-137.png',
+ color: Colors.purple.shade300,
+ rpc: ['https://polygon-rpc.com/'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:42161',
+ name: 'Arbitrum',
+ logo: '/chain-logos/eip155-42161.png',
+ color: Colors.blue,
+ rpc: ['https://arbitrum.blockpi.network/v1/rpc/public'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:10',
+ name: 'OP Mainnet',
+ logo: '/chain-logos/eip155-10.png',
+ color: Colors.red,
+ rpc: ['https://mainnet.optimism.io/'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:43114',
+ name: 'Avalanche',
+ logo: '/chain-logos/eip155-43114.png',
+ color: Colors.orange,
+ rpc: ['https://api.avax.network/ext/bc/C/rpc'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:56',
+ name: 'BNB Smart Chain Mainnet',
+ logo: '/chain-logos/eip155-56.png',
+ color: Colors.orange,
+ rpc: ['https://bsc-dataseed1.bnbchain.org'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:42220',
+ name: 'Celo',
+ logo: '/chain-logos/eip155-42220.png',
+ color: Colors.green,
+ rpc: ['https://forno.celo.org/'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:100',
+ name: 'Gnosis',
+ logo: '/chain-logos/eip155-100.png',
+ color: Colors.greenAccent,
+ rpc: ['https://rpc.gnosischain.com/'],
+ ),
+ const ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:324',
+ name: 'zkSync',
+ logo: '/chain-logos/eip155-324.png',
+ color: Colors.black,
+ rpc: ['https://mainnet.era.zksync.io'],
+ ),
+ ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:11155111',
+ name: 'Sepolia',
+ logo: '/chain-logos/eip155-1.png',
+ color: Colors.blue.shade300,
+ isTestnet: true,
+ rpc: ['https://ethereum-sepolia.publicnode.com'],
+ ),
+ ChainMetadata(
+ type: ChainType.eip155,
+ chainId: 'eip155:80001',
+ name: 'Polygon Mumbai',
+ logo: '/chain-logos/eip155-137.png',
+ color: Colors.purple.shade300,
+ isTestnet: true,
+ rpc: ['https://matic-mumbai.chainstacklabs.com'],
+ ),
+ ];
+
+ static final List solanaChains = [
+ const ChainMetadata(
+ type: ChainType.solana,
+ chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
+ name: 'Solana Mainnet',
+ logo: '/chain-logos/solana.png',
+ color: Color.fromARGB(255, 247, 0, 255),
+ rpc: ['https://api.mainnet-beta.solana.com'],
+ ),
+ const ChainMetadata(
+ type: ChainType.solana,
+ chainId: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',
+ name: 'Solana Devnet',
+ logo: '/chain-logos/solana.png',
+ color: Color.fromARGB(255, 247, 0, 255),
+ rpc: ['https://api.devnet.solana.com'],
+ ),
+ const ChainMetadata(
+ type: ChainType.solana,
+ chainId: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',
+ name: 'Solana Testnet',
+ logo: '/chain-logos/solana.png',
+ color: Colors.black,
+ isTestnet: true,
+ rpc: ['https://api.testnet.solana.com'],
+ ),
+ ];
+
+ static final List cosmosChains = [
+ // TODO TO BE SUPPORTED
+ const ChainMetadata(
+ type: ChainType.cosmos,
+ chainId: 'cosmos:cosmoshub-4',
+ name: 'Cosmos Mainnet',
+ logo: '/chain-logos/cosmos.png',
+ color: Colors.purple,
+ rpc: [
+ 'https://cosmos-rpc.polkachu.com:443',
+ 'https://rpc-cosmoshub-ia.cosmosia.notional.ventures:443',
+ 'https://rpc.cosmos.network:443',
+ ],
+ ),
+ ];
+
+ static final List kadenaChains = [
+ // TODO TO BE SUPPORTED
+ const ChainMetadata(
+ type: ChainType.kadena,
+ chainId: 'kadena:mainnet01',
+ name: 'Kadena Mainnet',
+ logo: '/chain-logos/kadena.png',
+ color: Colors.green,
+ rpc: [
+ 'https://api.chainweb.com',
+ ],
+ ),
+ const ChainMetadata(
+ type: ChainType.kadena,
+ chainId: 'kadena:testnet04',
+ name: 'Kadena Testnet',
+ logo: '/chain-logos/kadena.png',
+ color: Colors.green,
+ isTestnet: true,
+ rpc: [
+ 'https://api.chainweb.com',
+ ],
+ ),
+ ];
+
+ static final List polkadotChains = [
+ const ChainMetadata(
+ type: ChainType.polkadot,
+ chainId: 'polkadot:91b171bb158e2d3848fa23a9f1c25182',
+ name: 'Polkadot Mainnet',
+ logo: '/chain-logos/polkadot.png',
+ color: Color.fromARGB(255, 174, 57, 220),
+ rpc: [
+ 'wss://rpc.polkadot.io',
+ // 'wss://rpc.matrix.canary.enjin.io'
+ ],
+ ),
+ const ChainMetadata(
+ type: ChainType.polkadot,
+ chainId: 'polkadot:e143f23803ac50e8f6f8e62695d1ce9e',
+ name: 'Polkadot Testnet (Westend)',
+ logo: '/chain-logos/polkadot.png',
+ color: Color.fromARGB(255, 174, 57, 220),
+ isTestnet: true,
+ rpc: [
+ 'wss://westend-rpc.polkadot.io',
+ ],
+ ),
+ ];
+
+ static final List allChains = [
+ ...eip155Chains,
+ ...solanaChains,
+ ...polkadotChains,
+ // ...kadenaChains,
+ // ...cosmosChains,
+ ];
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/crypto/eip155.dart b/packages/reown_appkit/example/base/lib/utils/crypto/eip155.dart
new file mode 100644
index 0000000..0556792
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/crypto/eip155.dart
@@ -0,0 +1,277 @@
+import 'dart:convert';
+
+import 'package:eth_sig_util/util/utils.dart';
+import 'package:intl/intl.dart';
+import 'package:reown_appkit/reown_appkit.dart';
+import 'package:reown_appkit_dapp/models/chain_metadata.dart';
+import 'package:reown_appkit_dapp/utils/crypto/chain_data.dart';
+import 'package:reown_appkit_dapp/utils/smart_contracts.dart';
+import 'package:reown_appkit_dapp/utils/test_data.dart';
+
+enum EIP155Methods {
+ personalSign,
+ ethSign,
+ ethSignTransaction,
+ ethSignTypedData,
+ ethSendTransaction,
+}
+
+enum EIP155Events {
+ chainChanged,
+ accountsChanged,
+}
+
+class EIP155 {
+ static final Map methods = {
+ EIP155Methods.personalSign: 'personal_sign',
+ EIP155Methods.ethSign: 'eth_sign',
+ EIP155Methods.ethSignTransaction: 'eth_signTransaction',
+ EIP155Methods.ethSignTypedData: 'eth_signTypedData',
+ EIP155Methods.ethSendTransaction: 'eth_sendTransaction',
+ };
+
+ static final Map events = {
+ EIP155Events.chainChanged: 'chainChanged',
+ EIP155Events.accountsChanged: 'accountsChanged',
+ };
+
+ static Future callMethod({
+ required ReownAppKit appKit,
+ required String topic,
+ required String method,
+ required ChainMetadata chainData,
+ required String address,
+ }) {
+ switch (method) {
+ case 'personal_sign':
+ return personalSign(
+ appKit: appKit,
+ topic: topic,
+ chainId: chainData.chainId,
+ address: address,
+ message: testSignData,
+ );
+ case 'eth_sign':
+ return ethSign(
+ appKit: appKit,
+ topic: topic,
+ chainId: chainData.chainId,
+ address: address,
+ message: testSignData,
+ );
+ case 'eth_signTypedData':
+ return ethSignTypedData(
+ appKit: appKit,
+ topic: topic,
+ chainId: chainData.chainId,
+ address: address,
+ data: typedData,
+ );
+ case 'eth_signTransaction':
+ return ethSignTransaction(
+ appKit: appKit,
+ topic: topic,
+ chainId: chainData.chainId,
+ transaction: Transaction(
+ from: EthereumAddress.fromHex(address),
+ to: EthereumAddress.fromHex(
+ '0x59e2f66C0E96803206B6486cDb39029abAE834c0',
+ ),
+ value: EtherAmount.fromInt(EtherUnit.finney, 12), // == 0.012
+ ),
+ );
+ case 'eth_sendTransaction':
+ return ethSendTransaction(
+ appKit: appKit,
+ topic: topic,
+ chainId: chainData.chainId,
+ transaction: Transaction(
+ from: EthereumAddress.fromHex(address),
+ to: EthereumAddress.fromHex(
+ '0x59e2f66C0E96803206B6486cDb39029abAE834c0',
+ ),
+ value: EtherAmount.fromInt(EtherUnit.finney, 11), // == 0.011
+ ),
+ );
+ default:
+ throw 'Method unimplemented';
+ }
+ }
+
+ static Future callSmartContract({
+ required ReownAppKit appKit,
+ required String topic,
+ required String address,
+ required String action,
+ }) {
+ // Create DeployedContract object using contract's ABI and address
+ final deployedContract = DeployedContract(
+ ContractAbi.fromJson(
+ jsonEncode(SepoliaTestContract.readContractAbi),
+ 'Alfreedoms',
+ ),
+ EthereumAddress.fromHex(SepoliaTestContract.contractAddress),
+ );
+
+ final sepolia =
+ ChainData.allChains.firstWhere((e) => e.chainId == 'eip155:11155111');
+
+ switch (action) {
+ case 'read':
+ return readSmartContract(
+ appKit: appKit,
+ rpcUrl: sepolia.rpc.first,
+ contract: deployedContract,
+ address: address,
+ );
+ case 'write':
+ return appKit.requestWriteContract(
+ topic: topic,
+ chainId: sepolia.chainId,
+ deployedContract: deployedContract,
+ functionName: 'transfer',
+ transaction: Transaction(
+ from: EthereumAddress.fromHex(address),
+ ),
+ parameters: [
+ // Recipient
+ EthereumAddress.fromHex(
+ '0x59e2f66C0E96803206B6486cDb39029abAE834c0',
+ ),
+ // Amount to Transfer
+ EtherAmount.fromInt(EtherUnit.finney, 10).getInWei, // == 0.010
+ ],
+ );
+ default:
+ return Future.value();
+ }
+ }
+
+ static Future personalSign({
+ required ReownAppKit appKit,
+ required String topic,
+ required String chainId,
+ required String address,
+ required String message,
+ }) async {
+ final bytes = utf8.encode(message);
+ final encoded = bytesToHex(bytes);
+
+ return await appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: methods[EIP155Methods.personalSign]!,
+ params: [encoded, address],
+ ),
+ );
+ }
+
+ static Future ethSign({
+ required ReownAppKit appKit,
+ required String topic,
+ required String chainId,
+ required String address,
+ required String message,
+ }) async {
+ return await appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: methods[EIP155Methods.ethSign]!,
+ params: [address, message],
+ ),
+ );
+ }
+
+ static Future ethSignTypedData({
+ required ReownAppKit appKit,
+ required String topic,
+ required String chainId,
+ required String address,
+ required String data,
+ }) async {
+ return await appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: methods[EIP155Methods.ethSignTypedData]!,
+ params: [address, data],
+ ),
+ );
+ }
+
+ static Future ethSignTransaction({
+ required ReownAppKit appKit,
+ required String topic,
+ required String chainId,
+ required Transaction transaction,
+ }) async {
+ return await appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: methods[EIP155Methods.ethSignTransaction]!,
+ params: [transaction.toJson()],
+ ),
+ );
+ }
+
+ static Future ethSendTransaction({
+ required ReownAppKit appKit,
+ required String topic,
+ required String chainId,
+ required Transaction transaction,
+ }) async {
+ return await appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: methods[EIP155Methods.ethSendTransaction]!,
+ params: [transaction.toJson()],
+ ),
+ );
+ }
+
+ static Future readSmartContract({
+ required ReownAppKit appKit,
+ required String rpcUrl,
+ required String address,
+ required DeployedContract contract,
+ }) async {
+ final results = await Future.wait([
+ // results[0]
+ appKit.requestReadContract(
+ deployedContract: contract,
+ functionName: 'name',
+ rpcUrl: rpcUrl,
+ ),
+ // results[1]
+ appKit.requestReadContract(
+ deployedContract: contract,
+ functionName: 'totalSupply',
+ rpcUrl: rpcUrl,
+ ),
+ // results[2]
+ appKit.requestReadContract(
+ deployedContract: contract,
+ functionName: 'balanceOf',
+ rpcUrl: rpcUrl,
+ parameters: [
+ EthereumAddress.fromHex(address),
+ ],
+ ),
+ ]);
+
+ final oCcy = NumberFormat('#,##0.00', 'en_US');
+ final name = results[0].first.toString();
+ final total = results[1].first / BigInt.from(1000000000000000000);
+ final balance = results[2].first / BigInt.from(1000000000000000000);
+
+ return {
+ 'name': name,
+ 'totalSupply': oCcy.format(total),
+ 'balance': oCcy.format(balance),
+ };
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/crypto/helpers.dart b/packages/reown_appkit/example/base/lib/utils/crypto/helpers.dart
new file mode 100644
index 0000000..6ead377
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/crypto/helpers.dart
@@ -0,0 +1,55 @@
+import 'package:flutter/material.dart';
+import 'package:reown_appkit_dapp/models/chain_metadata.dart';
+import 'package:reown_appkit_dapp/utils/crypto/chain_data.dart';
+import 'package:reown_appkit_dapp/utils/crypto/eip155.dart';
+import 'package:reown_appkit_dapp/utils/crypto/polkadot.dart';
+import 'package:reown_appkit_dapp/utils/crypto/solana.dart';
+
+String getChainName(String chain) {
+ try {
+ return ChainData.allChains
+ .where((element) => element.chainId == chain)
+ .first
+ .name;
+ } catch (e) {
+ debugPrint('[SampleDapp] Invalid chain');
+ }
+ return 'Unknown';
+}
+
+ChainMetadata getChainMetadataFromChain(String chain) {
+ try {
+ return ChainData.allChains
+ .where((element) => element.chainId == chain)
+ .first;
+ } catch (e) {
+ debugPrint('[SampleDapp] Invalid chain');
+ }
+ return ChainData.eip155Chains[0];
+}
+
+List getChainMethods(ChainType value) {
+ switch (value) {
+ case ChainType.eip155:
+ return EIP155.methods.values.toList();
+ case ChainType.solana:
+ return Solana.methods.values.toList();
+ case ChainType.polkadot:
+ return Polkadot.methods.values.toList();
+ default:
+ return [];
+ }
+}
+
+List getChainEvents(ChainType value) {
+ switch (value) {
+ case ChainType.eip155:
+ return EIP155.events.values.toList();
+ case ChainType.solana:
+ return Solana.events.values.toList();
+ case ChainType.polkadot:
+ return Polkadot.events.values.toList();
+ default:
+ return [];
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/crypto/kadena.dart b/packages/reown_appkit/example/base/lib/utils/crypto/kadena.dart
new file mode 100644
index 0000000..4c6f01c
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/crypto/kadena.dart
@@ -0,0 +1,225 @@
+// import 'dart:convert';
+
+// import 'package:kadena_dart_sdk/kadena_dart_sdk.dart';
+// import 'package:reown_appkit/reown_appkit.dart';
+// import 'package:reown_appkit_dapp/utils/test_data.dart';
+
+// enum KadenaMethods {
+// sign,
+// quicksign,
+// kadenaSignV1,
+// kadenaQuicksignV1,
+// kadenaGetAccountsV1,
+// }
+
+// enum KadenaEvents {
+// none,
+// }
+
+// extension KadenaMethodsX on KadenaMethods {
+// String? get value => Kadena.methods[this];
+// }
+
+// extension KadenaMethodsStringX on String {
+// KadenaMethods? toKadenaMethod() {
+// final entries = Kadena.methods.entries.where(
+// (element) => element.value == this,
+// );
+// return (entries.isNotEmpty) ? entries.first.key : null;
+// }
+// }
+
+// extension KadenaEventsX on KadenaEvents {
+// String? get value => Kadena.events[this];
+// }
+
+// extension KadenaEventsStringX on String {
+// KadenaEvents? toKadenaEvent() {
+// final entries = Kadena.events.entries.where(
+// (element) => element.value == this,
+// );
+// return (entries.isNotEmpty) ? entries.first.key : null;
+// }
+// }
+
+// class Kadena {
+// static final Map methods = {
+// KadenaMethods.sign: 'kadena_sign',
+// KadenaMethods.quicksign: 'kadena_quicksign',
+// KadenaMethods.kadenaSignV1: 'kadena_sign_v1',
+// KadenaMethods.kadenaQuicksignV1: 'kadena_quicksign_v1',
+// KadenaMethods.kadenaGetAccountsV1: 'kadena_getAccounts_v1'
+// };
+
+// static final Map events = {};
+
+// static Future callMethod({
+// required ReownAppKit appKit,
+// required String topic,
+// required KadenaMethods method,
+// required String chainId,
+// required String address,
+// }) {
+// final String addressActual =
+// address.startsWith('k**') ? address.substring(3) : address;
+
+// switch (method) {
+// case KadenaMethods.sign:
+// case KadenaMethods.kadenaSignV1:
+// return kadenaSignV1(
+// appKit: appKit,
+// method: method,
+// topic: topic,
+// chainId: chainId,
+// data: createSignRequest(
+// networkId: chainId.split(':')[1],
+// signingPubKey: addressActual,
+// sender: 'k:$addressActual',
+// caps: [
+// DappCapp(
+// role: 'Test',
+// description: 'description',
+// cap: Capability(
+// name: 'coin.GAS',
+// ),
+// ),
+// DappCapp(
+// role: 'Test',
+// description: 'description',
+// cap: Capability(
+// name: 'coin.TRANSFER',
+// args: ['sender', 'receiver', 1.0],
+// ),
+// ),
+// ],
+// ),
+// );
+// case KadenaMethods.quicksign:
+// case KadenaMethods.kadenaQuicksignV1:
+// return kadenaQuicksignV1(
+// appKit: appKit,
+// topic: topic,
+// chainId: chainId,
+// data: QuicksignRequest(
+// commandSigDatas: [
+// CommandSigData(
+// cmd: jsonEncode(
+// createPactCommandPayload(
+// networkId: chainId.split(':')[1],
+// sender: 'k:$addressActual',
+// signerCaps: [
+// SignerCapabilities(
+// pubKey: addressActual,
+// clist: [
+// Capability(
+// name: 'coin.GAS',
+// ),
+// Capability(
+// name: 'coin.TRANSFER',
+// args: ['sender', 'receiver', 1.0],
+// ),
+// ],
+// ),
+// ],
+// ).toJson(),
+// ),
+// sigs: [
+// QuicksignSigner(
+// pubKey: addressActual,
+// ),
+// ],
+// ),
+// CommandSigData(
+// cmd: jsonEncode(
+// createPactCommandPayload(
+// networkId: chainId.split(':')[1],
+// sender: 'k:$addressActual',
+// signerCaps: [
+// SignerCapabilities(
+// pubKey: addressActual,
+// clist: [
+// Capability(
+// name: 'coin.GAS',
+// ),
+// Capability(
+// name: 'coin.TRANSFER',
+// args: ['sender2', 'receiver2', 2.0],
+// ),
+// ],
+// ),
+// ],
+// ).toJson(),
+// ),
+// sigs: [
+// QuicksignSigner(
+// pubKey: addressActual,
+// ),
+// ],
+// ),
+// ],
+// ),
+// );
+
+// case KadenaMethods.kadenaGetAccountsV1:
+// return kadenaGetAccountsV1(
+// appKit: appKit,
+// topic: topic,
+// chainId: chainId,
+// data: createGetAccountsRequest(account: '$chainId:$addressActual'),
+// );
+// }
+// }
+
+// static Future kadenaSignV1({
+// required ReownAppKit appKit,
+// required KadenaMethods method,
+// required String topic,
+// required String chainId,
+// required SignRequest data,
+// }) async {
+// // print(jsonEncode(data));
+// final ret = await appKit.request(
+// topic: topic,
+// chainId: chainId,
+// request: SessionRequestParams(
+// method: methods[method]!,
+// params: data,
+// ),
+// );
+// // print('ret: $ret');
+// // print(ret.runtimeType);
+// return ret;
+// }
+
+// static Future kadenaQuicksignV1({
+// required ReownAppKit appKit,
+// required String topic,
+// required String chainId,
+// required QuicksignRequest data,
+// }) async {
+// return await appKit.request(
+// topic: topic,
+// chainId: chainId,
+// request: SessionRequestParams(
+// method: methods[KadenaMethods.kadenaQuicksignV1]!,
+// params: data.toJson(),
+// ),
+// );
+// }
+
+// static Future kadenaGetAccountsV1({
+// required ReownAppKit appKit,
+// required String topic,
+// required String chainId,
+// required GetAccountsRequest data,
+// }) async {
+// return await appKit.request(
+// topic: topic,
+// chainId: chainId,
+// request: SessionRequestParams(
+// method: methods[KadenaMethods.kadenaGetAccountsV1]!,
+// params: data.toJson(),
+// ),
+// );
+// }
+// }
diff --git a/packages/reown_appkit/example/base/lib/utils/crypto/polkadot.dart b/packages/reown_appkit/example/base/lib/utils/crypto/polkadot.dart
new file mode 100644
index 0000000..27eec4f
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/crypto/polkadot.dart
@@ -0,0 +1,82 @@
+import 'package:reown_appkit/reown_appkit.dart';
+
+enum PolkadotMethods {
+ polkadotSignTransaction,
+ polkadotSignMessage,
+}
+
+enum PolkadotEvents {
+ none,
+}
+
+class Polkadot {
+ static final Map methods = {
+ PolkadotMethods.polkadotSignTransaction: 'polkadot_signTransaction',
+ PolkadotMethods.polkadotSignMessage: 'polkadot_signMessage'
+ };
+
+ static final Map events = {};
+
+ static Future callMethod({
+ required ReownAppKit appKit,
+ required String topic,
+ required String method,
+ required String chainId,
+ required String address,
+ }) {
+ switch (method) {
+ case 'polkadot_signMessage':
+ return appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: method,
+ params: {
+ 'address': address,
+ 'message':
+ 'This is an example message to be signed - ${DateTime.now()}',
+ },
+ ),
+ );
+ case 'polkadot_signTransaction':
+ return appKit.request(
+ topic: topic,
+ chainId: chainId,
+ request: SessionRequestParams(
+ method: method,
+ params: {
+ 'address': address,
+ 'transactionPayload': {
+ 'specVersion': '0x00002468',
+ 'transactionVersion': '0x0000000e',
+ 'address': address,
+ 'blockHash':
+ '0x554d682a74099d05e8b7852d19c93b527b5fae1e9e1969f6e1b82a2f09a14cc9',
+ 'blockNumber': '0x00cb539c',
+ 'era': '0xc501',
+ 'genesisHash':
+ '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e',
+ 'method':
+ '0x0001784920616d207369676e696e672074686973207472616e73616374696f6e21',
+ 'nonce': '0x00000000',
+ 'signedExtensions': [
+ 'CheckNonZeroSender',
+ 'CheckSpecVersion',
+ 'CheckTxVersion',
+ 'CheckGenesis',
+ 'CheckMortality',
+ 'CheckNonce',
+ 'CheckWeight',
+ 'ChargeTransactionPayment',
+ ],
+ 'tip': '0x00000000000000000000000000000000',
+ 'version': 4,
+ },
+ },
+ ),
+ );
+ default:
+ throw 'Method unimplemented';
+ }
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/crypto/solana.dart b/packages/reown_appkit/example/base/lib/utils/crypto/solana.dart
new file mode 100644
index 0000000..329d83c
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/crypto/solana.dart
@@ -0,0 +1,116 @@
+import 'dart:convert';
+import 'package:bs58/bs58.dart';
+import 'package:solana_web3/solana_web3.dart' as solana;
+
+import 'package:reown_appkit/reown_appkit.dart';
+
+import 'package:reown_appkit_dapp/models/chain_metadata.dart';
+
+enum SolanaMethods {
+ solanaSignTransaction,
+ solanaSignMessage,
+}
+
+enum SolanaEvents {
+ none,
+}
+
+class Solana {
+ static final Map methods = {
+ SolanaMethods.solanaSignTransaction: 'solana_signTransaction',
+ SolanaMethods.solanaSignMessage: 'solana_signMessage'
+ };
+
+ static final Map events = {};
+
+ static Future callMethod({
+ required ReownAppKit appKit,
+ required String topic,
+ required String method,
+ required ChainMetadata chainData,
+ required String address,
+ bool isV0 = false,
+ }) async {
+ switch (method) {
+ case 'solana_signMessage':
+ final bytes = utf8.encode(
+ 'This is an example message to be signed - ${DateTime.now()}',
+ );
+ final message = base58.encode(bytes);
+ return appKit.request(
+ topic: topic,
+ chainId: chainData.chainId,
+ request: SessionRequestParams(
+ method: method,
+ params: {
+ 'pubkey': address,
+ 'message': message,
+ },
+ ),
+ );
+ case 'solana_signTransaction':
+ // Create a connection to the devnet cluster.
+ final cluster = solana.Cluster.https(
+ Uri.parse(chainData.rpc.first).authority,
+ );
+ // final cluster = solana.Cluster.devnet;
+ final connection = solana.Connection(cluster);
+
+ // Fetch the latest blockhash.
+ final blockhash = await connection.getLatestBlockhash();
+
+ // Create a System Program instruction to transfer 0.5 SOL from [address1] to [address2].
+ final transactionv0 = solana.Transaction.v0(
+ payer: solana.Pubkey.fromBase58(address),
+ recentBlockhash: blockhash.blockhash,
+ instructions: [
+ solana.TransactionInstruction.fromJson({
+ 'programId': '11111111111111111111111111111111',
+ 'data': [2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
+ 'keys': [
+ {
+ 'isSigner': true,
+ 'isWritable': true,
+ 'pubkey': address,
+ },
+ {
+ 'isSigner': false,
+ 'isWritable': true,
+ 'pubkey': '8vCyX7oB6Pc3pbWMGYYZF5pbSnAdQ7Gyr32JqxqCy8ZR'
+ }
+ ]
+ }),
+ // SystemProgram.transfer(
+ // fromPubkey: solana.Pubkey.fromBase58(address),
+ // toPubkey: solana.Pubkey.fromBase58(
+ // '8vCyX7oB6Pc3pbWMGYYZF5pbSnAdQ7Gyr32JqxqCy8ZR',
+ // ),
+ // lamports: solana.solToLamports(0.5),
+ // ),
+ ],
+ );
+
+ const config = solana.TransactionSerializableConfig(
+ verifySignatures: false,
+ );
+ final bytes = transactionv0.serialize(config).asUint8List();
+ final encodedV0Trx = base64.encode(bytes);
+
+ return appKit.request(
+ topic: topic,
+ chainId: chainData.chainId,
+ request: SessionRequestParams(
+ method: method,
+ params: {
+ 'transaction': encodedV0Trx,
+ 'pubkey': address,
+ 'feePayer': address,
+ ...transactionv0.message.toJson(),
+ },
+ ),
+ );
+ default:
+ throw 'Method unimplemented';
+ }
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/dart_defines.dart b/packages/reown_appkit/example/base/lib/utils/dart_defines.dart
new file mode 100644
index 0000000..d70ca8f
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/dart_defines.dart
@@ -0,0 +1,5 @@
+class DartDefines {
+ static const String projectId = String.fromEnvironment(
+ 'PROJECT_ID',
+ );
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/deep_link_handler.dart b/packages/reown_appkit/example/base/lib/utils/deep_link_handler.dart
new file mode 100644
index 0000000..7e22515
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/deep_link_handler.dart
@@ -0,0 +1,60 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:reown_appkit/reown_appkit.dart';
+
+class DeepLinkHandler {
+ static const _methodChannel = MethodChannel(
+ 'com.walletconnect.flutterdapp/methods',
+ );
+ static const _eventChannel = EventChannel(
+ 'com.walletconnect.flutterdapp/events',
+ );
+ static final waiting = ValueNotifier(false);
+ static late IReownAppKit _appKit;
+
+ static void initListener() {
+ if (kIsWeb) return;
+ try {
+ _eventChannel.receiveBroadcastStream().listen(
+ _onLink,
+ onError: _onError,
+ );
+ } catch (e) {
+ debugPrint('[SampleWallet] [DeepLinkHandler] checkInitialLink $e');
+ }
+ }
+
+ static void init(IReownAppKit appKit) {
+ if (kIsWeb) return;
+ _appKit = appKit;
+ }
+
+ static void checkInitialLink() async {
+ if (kIsWeb) return;
+ try {
+ _methodChannel.invokeMethod('initialLink');
+ } catch (e) {
+ debugPrint('[SampleWallet] [DeepLinkHandler] checkInitialLink $e');
+ }
+ }
+
+ static Uri get nativeUri =>
+ Uri.parse(_appKit.metadata.redirect?.native ?? '');
+ static Uri get universalUri =>
+ Uri.parse(_appKit.metadata.redirect?.universal ?? '');
+ static String get host => universalUri.host;
+
+ static void _onLink(dynamic link) async {
+ if (link == null) return;
+ final envelope = ReownCoreUtils.getSearchParamFromURL(link, 'wc_ev');
+ if (envelope.isNotEmpty) {
+ debugPrint('[SampleDapp] is linkMode $link');
+ await _appKit.dispatchEnvelope(link);
+ }
+ }
+
+ static void _onError(dynamic error) {
+ debugPrint('[SampleDapp] _onError $error');
+ waiting.value = false;
+ }
+}
diff --git a/packages/reown_appkit/example/base/lib/utils/sample_wallets.dart b/packages/reown_appkit/example/base/lib/utils/sample_wallets.dart
new file mode 100644
index 0000000..e7730c6
--- /dev/null
+++ b/packages/reown_appkit/example/base/lib/utils/sample_wallets.dart
@@ -0,0 +1,90 @@
+import 'dart:io';
+
+class WCSampleWallets {
+ static List