Copy disabled (too large)
Download .txt
Showing preview only (106,815K chars total). Download the full file to get everything.
Repository: zk-passport/proof-of-passport
Branch: main
Commit: ea96497e2496
Files: 3708
Total size: 172.3 MB
Directory structure:
gitextract_ajsfews0/
├── .actrc
├── .coderabbit.yaml
├── .cursor/
│ ├── mcp.json
│ └── rules/
│ ├── compliance-verification.mdc
│ └── test-memory-optimization.mdc
├── .cursorignore
├── .cursorrules
├── .editorconfig
├── .eslintignore
├── .gitattributes
├── .gitguardian.yml
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actionlint.yaml
│ ├── actions/
│ │ ├── cache-built-deps/
│ │ │ └── action.yml
│ │ ├── cache-bundler/
│ │ │ └── action.yml
│ │ ├── cache-core-sdk-build/
│ │ │ └── action.yml
│ │ ├── cache-gradle/
│ │ │ └── action.yml
│ │ ├── cache-mobile-sdk-build/
│ │ │ └── action.yml
│ │ ├── cache-pods/
│ │ │ └── action.yml
│ │ ├── cache-sdk-build/
│ │ │ └── action.yml
│ │ ├── cache-yarn/
│ │ │ └── action.yml
│ │ ├── cleanup-gradle-artifacts/
│ │ │ └── action.yml
│ │ ├── clone-android-passport-nfc-reader/
│ │ │ └── action.yml
│ │ ├── create-version-bump-pr/
│ │ │ └── action.yml
│ │ ├── find-ios-simulator/
│ │ │ └── action.yml
│ │ ├── free-disk-space/
│ │ │ └── action.yml
│ │ ├── generate-github-token/
│ │ │ └── action.yml
│ │ ├── get-version/
│ │ │ └── action.yml
│ │ ├── mobile-setup/
│ │ │ └── action.yml
│ │ ├── push-changes/
│ │ │ └── action.yml
│ │ ├── yarn-install/
│ │ │ └── action.yml
│ │ └── yarnrc-hash/
│ │ └── action.yml
│ └── workflows/
│ ├── block-non-dev-to-main.yml
│ ├── circuits-build.yml
│ ├── circuits.yml
│ ├── common-ci.yml
│ ├── contracts.yml
│ ├── core-sdk-ci.yml
│ ├── gitleaks.yml
│ ├── kmp-ci.yml
│ ├── mobile-bundle-analysis.yml
│ ├── mobile-ci.yml
│ ├── mobile-deploy-auto.yml
│ ├── mobile-deploy.yml
│ ├── mobile-e2e.yml
│ ├── mobile-sdk-ci.yml
│ ├── mobile-sdk-demo-ci.yml
│ ├── mobile-sdk-demo-e2e.yml
│ ├── native-shells-ci.yml
│ ├── npm-publish.yml
│ ├── qrcode-sdk-ci.yml
│ ├── release-calendar.yml
│ ├── rn-sdk-test-app-ci.yml
│ ├── swift-sdk-ci.yml
│ ├── web.yml
│ ├── webview-app-ci.yml
│ ├── webview-bridge-ci.yml
│ └── workspace-ci.yml
├── .gitignore
├── .gitleaks.toml
├── .gitleaksignore
├── .gitmodules
├── .husky/
│ └── pre-commit
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│ ├── settings.json
│ └── tasks.json
├── .watchmanconfig
├── AGENTS.md
├── CLAUDE.md
├── LICENSE
├── README.md
├── app/
│ ├── .babelrc
│ ├── .bundle/
│ │ └── config
│ ├── .codecov.yml
│ ├── .eslintrc.cjs
│ ├── .gitattributes
│ ├── .github/
│ │ └── workflows/
│ │ └── test-coverage.yml
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── .ruby-version
│ ├── .tool-versions
│ ├── AGENTS.md
│ ├── App.tsx
│ ├── Gemfile
│ ├── LICENSE
│ ├── README.md
│ ├── android/
│ │ ├── .gitignore
│ │ ├── app/
│ │ │ ├── build.gradle
│ │ │ ├── debug.keystore
│ │ │ ├── google-services.json
│ │ │ ├── proguard-rules.pro
│ │ │ └── src/
│ │ │ ├── debug/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── res/
│ │ │ │ └── xml/
│ │ │ │ └── network_security_config.xml
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── assets/
│ │ │ │ │ ├── fonts/
│ │ │ │ │ │ ├── Advercase-Regular.otf
│ │ │ │ │ │ ├── DINOT-Bold.otf
│ │ │ │ │ │ ├── DINOT-Medium.otf
│ │ │ │ │ │ └── IBMPlexMono-Regular.otf
│ │ │ │ │ └── masterList
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── proofofpassportapp/
│ │ │ │ │ ├── BackupModule.kt
│ │ │ │ │ ├── BackupPackage.kt
│ │ │ │ │ ├── CameraActivityPackage.java
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ ├── NativeLoggerBridgeModule.kt
│ │ │ │ │ ├── PhotoPickerActivity.java
│ │ │ │ │ ├── QRCodeScannerModule.java
│ │ │ │ │ ├── QRCodeScannerPackage.java
│ │ │ │ │ ├── ui/
│ │ │ │ │ │ ├── CameraMLKitFragment.kt
│ │ │ │ │ │ ├── PassportOCRViewManager.kt
│ │ │ │ │ │ ├── QRCodeScannerViewManager.kt
│ │ │ │ │ │ └── QrCodeScannerFragment.kt
│ │ │ │ │ └── utils/
│ │ │ │ │ └── QrCodeDetectorProcessor.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── rn_edit_text_material.xml
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ └── ic_launcher.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ ├── backup_rules.xml
│ │ │ │ ├── network_security_config.xml
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ └── release/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── awesomeproject/
│ │ │ └── ReactNativeFlipper.java
│ │ ├── build.gradle
│ │ ├── dev-keystore
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── link-assets-manifest.json
│ │ └── settings.gradle
│ ├── app.json
│ ├── babel.config.cjs
│ ├── babel.config.test.cjs
│ ├── declarations.d.ts
│ ├── deployments/
│ │ ├── artifacts/
│ │ │ ├── Deploy_Registry#Formatter.dbg.json
│ │ │ ├── Deploy_Registry#Formatter.json
│ │ │ ├── Deploy_Registry#OpenPassportRegister.dbg.json
│ │ │ ├── Deploy_Registry#OpenPassportRegister.json
│ │ │ ├── Deploy_Registry#PoseidonT3.dbg.json
│ │ │ ├── Deploy_Registry#PoseidonT3.json
│ │ │ ├── Deploy_Registry#Registry.dbg.json
│ │ │ ├── Deploy_Registry#Registry.json
│ │ │ ├── Deploy_Registry#SBT.dbg.json
│ │ │ ├── Deploy_Registry#SBT.json
│ │ │ ├── Deploy_Registry#Verifier_disclose.dbg.json
│ │ │ ├── Deploy_Registry#Verifier_disclose.json
│ │ │ ├── Deploy_Registry#Verifier_dsc_4096.dbg.json
│ │ │ ├── Deploy_Registry#Verifier_dsc_4096.json
│ │ │ ├── Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537.dbg.json
│ │ │ ├── Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537.json
│ │ │ ├── Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537.dbg.json
│ │ │ └── Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537.json
│ │ └── deployed_addresses.json
│ ├── docs/
│ │ ├── DOCSTRING_STYLE_GUIDE.md
│ │ ├── MOBILE_DEPLOYMENT.md
│ │ ├── TREE_SHAKING.md
│ │ └── examples/
│ │ └── tree-shaking/
│ │ ├── granular-circuits-example.ts
│ │ ├── level2-optimal-example.ts
│ │ ├── level3-migration-guide.ts
│ │ ├── level3-optimal-example.ts
│ │ └── optimal-pattern-example.ts
│ ├── env.sample
│ ├── env.ts
│ ├── fastlane/
│ │ ├── DEV.md
│ │ ├── Fastfile
│ │ ├── Pluginfile
│ │ ├── README.md
│ │ ├── helpers/
│ │ │ ├── android.rb
│ │ │ ├── common.rb
│ │ │ ├── ios.rb
│ │ │ ├── slack.rb
│ │ │ └── version_manager.rb
│ │ ├── helpers.rb
│ │ └── test/
│ │ ├── app_name_test.rb
│ │ └── helpers_test.rb
│ ├── firebase.json
│ ├── index.js
│ ├── ios/
│ │ ├── .bundle/
│ │ │ └── config
│ │ ├── .xcode.env
│ │ ├── App Thinning Size Report.txt
│ │ ├── AppDelegate.swift
│ │ ├── CameraView.swift
│ │ ├── GoogleService-Info.plist
│ │ ├── LiveMRZScannerView.swift
│ │ ├── LottieView.swift
│ │ ├── MRZScannerModule.m
│ │ ├── MRZScannerModule.swift
│ │ ├── MrzOcrCorrection.swift
│ │ ├── MrzResultMapper.swift
│ │ ├── MrzScanEngine.swift
│ │ ├── NativeLoggerBridge.m
│ │ ├── NativeLoggerBridge.swift
│ │ ├── NotificationService/
│ │ │ ├── Info.plist
│ │ │ ├── NotificationService.h
│ │ │ └── NotificationService.m
│ │ ├── OpenPassport/
│ │ │ ├── GoogleService-Info.plist
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ ├── LaunchScreen.storyboard
│ │ │ ├── OpenPassport.entitlements
│ │ │ ├── OpenPassportDebug.entitlements
│ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ └── passport.json
│ │ ├── OpenPassport.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ ├── PassportOCRViewManager.m
│ │ ├── PassportOCRViewManager.swift
│ │ ├── PassportReader.m
│ │ ├── PassportReader.swift
│ │ ├── PassportReaderCore.swift
│ │ ├── PhotoLibraryQRScannerViewController.swift
│ │ ├── Podfile
│ │ ├── PrivacyInfo.xcprivacy
│ │ ├── QKMRZScannerViewRepresentable.swift
│ │ ├── QRCodeScannerViewManager.m
│ │ ├── QRCodeScannerViewManager.swift
│ │ ├── QRScannerBridge.m
│ │ ├── QRScannerBridge.swift
│ │ ├── QRScannerViewController.swift
│ │ ├── ScannerHostingController.swift
│ │ ├── Self.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── OpenPassport.xcscheme
│ │ ├── Self.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── SelfAnalytics.swift
│ │ ├── link-assets-manifest.json
│ │ ├── local-pods/
│ │ │ ├── DiditSDK/
│ │ │ │ └── DiditSDK.podspec
│ │ │ └── OpenSSL-Universal/
│ │ │ └── OpenSSL-Universal.podspec
│ │ ├── passport.json
│ │ └── scripts/
│ │ ├── install-ios-deps-if-needed.sh
│ │ └── pod-install-with-cache-fix.sh
│ ├── jest.config.cjs
│ ├── jest.setup.js
│ ├── metro.config.cjs
│ ├── package.json
│ ├── react-native.config.cjs
│ ├── scripts/
│ │ ├── alias-imports.cjs
│ │ ├── analyze-tree-shaking.cjs
│ │ ├── bundle-analyze-ci.cjs
│ │ ├── capture-ios-crash-artifacts.cjs
│ │ ├── check-test-requires.cjs
│ │ ├── cleanup-ios-build.sh
│ │ ├── cleanup-private-modules.cjs
│ │ ├── find-type-import-issues.mjs
│ │ ├── generate-changelog.sh
│ │ ├── mobile-ci-build-android.sh
│ │ ├── mobile-deploy-confirm.cjs
│ │ ├── release.sh
│ │ ├── run-ios-simulator.cjs
│ │ ├── setup-macos.sh
│ │ ├── setup-private-modules.cjs
│ │ ├── tag.cjs
│ │ ├── test-e2e-local.sh
│ │ ├── test-tree-shaking.cjs
│ │ ├── tests/
│ │ │ ├── aliasImports.test.cjs
│ │ │ ├── bundleAnalyzeCi.test.cjs
│ │ │ ├── cleanupIosBuild.test.cjs
│ │ │ ├── mobileDeployConfirm.test.cjs
│ │ │ ├── mobileDeployConfirmModule.test.cjs
│ │ │ └── treeShaking.test.cjs
│ │ ├── upload_to_play_store.py
│ │ ├── version-manager.cjs
│ │ ├── version-manager.test.cjs
│ │ └── version.cjs
│ ├── src/
│ │ ├── assets/
│ │ │ ├── animations/
│ │ │ │ ├── launch_onboarding.json
│ │ │ │ ├── loader.ts
│ │ │ │ ├── passport_onboarding.json
│ │ │ │ ├── passport_scan.json
│ │ │ │ ├── passport_verify.json
│ │ │ │ ├── proof_failed.json
│ │ │ │ ├── proof_success.json
│ │ │ │ ├── qr_scan.json
│ │ │ │ ├── splash.json
│ │ │ │ └── warning.json
│ │ │ └── fonts/
│ │ │ ├── Advercase-Regular.otf
│ │ │ ├── DINOT-Bold.otf
│ │ │ ├── DINOT-Medium.otf
│ │ │ └── IBMPlexMono-Regular.otf
│ │ ├── components/
│ │ │ ├── AlertModal.tsx
│ │ │ ├── BackupDocumentationLink.tsx
│ │ │ ├── Disclosures.tsx
│ │ │ ├── ErrorBoundary.tsx
│ │ │ ├── FeedbackModal.tsx
│ │ │ ├── InputField.tsx
│ │ │ ├── LoadingUI.tsx
│ │ │ ├── Mnemonic.tsx
│ │ │ ├── PointHistoryList.tsx
│ │ │ ├── SystemBars.tsx
│ │ │ ├── Tips.tsx
│ │ │ ├── WebViewFooter.tsx
│ │ │ ├── documents/
│ │ │ │ ├── IDSelectorItem.tsx
│ │ │ │ ├── IDSelectorSheet.tsx
│ │ │ │ └── index.ts
│ │ │ ├── homescreen/
│ │ │ │ ├── CardBottomContent.tsx
│ │ │ │ ├── CardHeader.tsx
│ │ │ │ ├── EmptyIdCard.tsx
│ │ │ │ ├── ExpiredIdCard.tsx
│ │ │ │ ├── IdAttribute.tsx
│ │ │ │ ├── IdCard.tsx
│ │ │ │ ├── IdCardRevealed.tsx
│ │ │ │ ├── KycIdCard.tsx
│ │ │ │ ├── PendingIdCard.tsx
│ │ │ │ ├── SvgXmlWrapper.native.tsx
│ │ │ │ ├── SvgXmlWrapper.tsx
│ │ │ │ ├── SvgXmlWrapper.web.tsx
│ │ │ │ ├── UnregisteredIdCard.tsx
│ │ │ │ ├── cardSecurityBadge.ts
│ │ │ │ └── cardStyles.ts
│ │ │ ├── native/
│ │ │ │ ├── PassportCamera.tsx
│ │ │ │ ├── PassportCamera.web.tsx
│ │ │ │ ├── QRCodeScanner.tsx
│ │ │ │ ├── QRCodeScanner.web.tsx
│ │ │ │ └── RCTFragment.tsx
│ │ │ ├── navbar/
│ │ │ │ ├── AadhaarNavBar.tsx
│ │ │ │ ├── BaseNavBar.tsx
│ │ │ │ ├── DefaultNavBar.tsx
│ │ │ │ ├── DocumentFlowNavBar.tsx
│ │ │ │ ├── HeadlessNavForEuclid.tsx
│ │ │ │ ├── HomeNavBar.tsx
│ │ │ │ ├── IdDetailsNavBar.tsx
│ │ │ │ ├── Points.tsx
│ │ │ │ ├── PointsNavBar.tsx
│ │ │ │ ├── WebViewNavBar.tsx
│ │ │ │ └── index.ts
│ │ │ ├── proof-request/
│ │ │ │ ├── BottomActionBar.tsx
│ │ │ │ ├── BottomVerifyBar.tsx
│ │ │ │ ├── ConnectedWalletBadge.tsx
│ │ │ │ ├── DisclosureItem.tsx
│ │ │ │ ├── ProofMetadataBar.tsx
│ │ │ │ ├── ProofRequestCard.tsx
│ │ │ │ ├── ProofRequestHeader.tsx
│ │ │ │ ├── WalletAddressModal.tsx
│ │ │ │ ├── designTokens.ts
│ │ │ │ ├── icons.tsx
│ │ │ │ └── index.ts
│ │ │ ├── referral/
│ │ │ │ ├── CopyReferralButton.tsx
│ │ │ │ ├── ReferralHeader.tsx
│ │ │ │ ├── ReferralInfo.tsx
│ │ │ │ └── ShareButton.tsx
│ │ │ ├── starfall/
│ │ │ │ ├── StarfallLogoHeader.tsx
│ │ │ │ └── StarfallPIN.tsx
│ │ │ └── support/
│ │ │ └── SupportUuidRow.tsx
│ │ ├── config/
│ │ │ ├── index.ts
│ │ │ ├── remoteConfig.shared.ts
│ │ │ ├── remoteConfig.ts
│ │ │ ├── remoteConfig.web.ts
│ │ │ ├── segment.ts
│ │ │ ├── sentry.ts
│ │ │ └── sentry.web.ts
│ │ ├── consts/
│ │ │ ├── index.ts
│ │ │ ├── links.ts
│ │ │ └── recoveryPrompts.ts
│ │ ├── devtools/
│ │ │ ├── index.ts
│ │ │ ├── mocks/
│ │ │ │ ├── index.ts
│ │ │ │ ├── nfcScanner.ts
│ │ │ │ ├── react-native-community-blur.ts
│ │ │ │ ├── react-native-gesture-handler.ts
│ │ │ │ ├── react-native-passport-reader.ts
│ │ │ │ ├── react-native-safe-area-context.js
│ │ │ │ └── react-native-svg.ts
│ │ │ └── testing/
│ │ │ ├── index.ts
│ │ │ └── utils.ts
│ │ ├── hooks/
│ │ │ ├── useAppUpdates.ts
│ │ │ ├── useAppUpdates.web.ts
│ │ │ ├── useCardDimensions.ts
│ │ │ ├── useConnectionModal.ts
│ │ │ ├── useEarnPointsFlow.ts
│ │ │ ├── useErrorInjection.ts
│ │ │ ├── useFeedbackAutoHide.ts
│ │ │ ├── useFeedbackModal.ts
│ │ │ ├── useHapticNavigation.ts
│ │ │ ├── useHasRealDocument.ts
│ │ │ ├── useKycLauncher.ts
│ │ │ ├── useKycWebSocket.ts
│ │ │ ├── useMnemonic.ts
│ │ │ ├── useMockDataForm.ts
│ │ │ ├── useModal.ts
│ │ │ ├── useNetInfo.ts
│ │ │ ├── useNetInfo.web.ts
│ │ │ ├── useOpenSupportForm.ts
│ │ │ ├── usePendingKycRecovery.ts
│ │ │ ├── usePoints.ts
│ │ │ ├── usePointsGuardrail.ts
│ │ │ ├── useProofDisclosureStalenessCheck.ts
│ │ │ ├── useRecoveryPrompts.ts
│ │ │ ├── useReferralConfirmation.ts
│ │ │ ├── useReferralMessage.ts
│ │ │ ├── useReferralRegistration.ts
│ │ │ ├── useRegisterReferral.ts
│ │ │ ├── useSelfAppData.ts
│ │ │ ├── useSupportUuid.ts
│ │ │ └── useTestReferralFlow.ts
│ │ ├── integrations/
│ │ │ ├── haptics/
│ │ │ │ ├── index.ts
│ │ │ │ ├── shared.ts
│ │ │ │ ├── trigger.ts
│ │ │ │ └── trigger.web.ts
│ │ │ ├── keychain/
│ │ │ │ └── index.ts
│ │ │ ├── kyc/
│ │ │ │ ├── index.ts
│ │ │ │ ├── kycService.ts
│ │ │ │ └── types.ts
│ │ │ ├── nfc/
│ │ │ │ ├── nfcScanner.ts
│ │ │ │ └── passportReader.ts
│ │ │ ├── qrScanner.ts
│ │ │ ├── sharing.ts
│ │ │ └── turnkey.ts
│ │ ├── layouts/
│ │ │ ├── AppLayout.tsx
│ │ │ ├── ExpandableBottomLayout.tsx
│ │ │ └── SimpleScrolledTitleLayout.tsx
│ │ ├── navigation/
│ │ │ ├── account.ts
│ │ │ ├── account.web.ts
│ │ │ ├── app.tsx
│ │ │ ├── deeplinks.ts
│ │ │ ├── devTools.tsx
│ │ │ ├── documents.ts
│ │ │ ├── home.ts
│ │ │ ├── index.tsx
│ │ │ ├── onboarding.ts
│ │ │ ├── shared.ts
│ │ │ ├── starfall.ts
│ │ │ ├── types.ts
│ │ │ └── verification.ts
│ │ ├── polyfills/
│ │ │ └── buffer.js
│ │ ├── providers/
│ │ │ ├── authProvider.tsx
│ │ │ ├── authProvider.web.tsx
│ │ │ ├── databaseProvider.tsx
│ │ │ ├── feedbackProvider.tsx
│ │ │ ├── loggerProvider.tsx
│ │ │ ├── notificationTrackingProvider.tsx
│ │ │ ├── notificationTrackingProvider.web.tsx
│ │ │ ├── passportDataProvider.tsx
│ │ │ ├── remoteConfigProvider.tsx
│ │ │ └── selfClientProvider.tsx
│ │ ├── proving/
│ │ │ ├── index.ts
│ │ │ ├── loadingScreenStateText.ts
│ │ │ └── validateDocument.ts
│ │ ├── screens/
│ │ │ ├── account/
│ │ │ │ ├── recovery/
│ │ │ │ │ ├── AccountRecoveryChoiceScreen.tsx
│ │ │ │ │ ├── AccountRecoveryScreen.tsx
│ │ │ │ │ ├── DocumentDataNotFoundScreen.tsx
│ │ │ │ │ ├── RecoverWithPhraseScreen.tsx
│ │ │ │ │ └── recoveryCopy.ts
│ │ │ │ └── settings/
│ │ │ │ ├── CloudBackupScreen.tsx
│ │ │ │ ├── ProofSettingsScreen.tsx
│ │ │ │ ├── SecurityAndBackupScreen.tsx
│ │ │ │ ├── SettingsScreen.tsx
│ │ │ │ ├── ShowRecoveryPhraseScreen.tsx
│ │ │ │ ├── SupportScreen.tsx
│ │ │ │ └── settingsMenu.ts
│ │ │ ├── app/
│ │ │ │ ├── DeferredLinkingInfoScreen.tsx
│ │ │ │ ├── GratificationScreen.tsx
│ │ │ │ ├── LoadingScreen.tsx
│ │ │ │ ├── ModalScreen.tsx
│ │ │ │ ├── ReferralScreen.tsx
│ │ │ │ ├── SplashScreen.tsx
│ │ │ │ └── startupRouting.ts
│ │ │ ├── dev/
│ │ │ │ ├── CreateMockScreen.tsx
│ │ │ │ ├── CreateMockScreenDeepLink.tsx
│ │ │ │ ├── DevDangerZoneScreen.tsx
│ │ │ │ ├── DevFeatureFlagsScreen.tsx
│ │ │ │ ├── DevHapticFeedbackScreen.tsx
│ │ │ │ ├── DevLoadingScreen.tsx
│ │ │ │ ├── DevPrivateKeyScreen.tsx
│ │ │ │ ├── DevSettingsScreen.tsx
│ │ │ │ ├── SocialLoginDemoScreen.tsx
│ │ │ │ ├── TroubleshootingScreen.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── ErrorInjectionSelector.tsx
│ │ │ │ │ ├── LogLevelSelector.tsx
│ │ │ │ │ ├── ParameterSection.tsx
│ │ │ │ │ ├── ScreenSelector.tsx
│ │ │ │ │ ├── TopicToggleButton.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useDangerZoneActions.ts
│ │ │ │ │ └── useNotificationHandlers.ts
│ │ │ │ └── sections/
│ │ │ │ ├── DangerZoneSection.tsx
│ │ │ │ ├── DebugShortcutsSection.tsx
│ │ │ │ ├── DevTogglesSection.tsx
│ │ │ │ ├── PushNotificationsSection.tsx
│ │ │ │ └── index.ts
│ │ │ ├── documents/
│ │ │ │ ├── aadhaar/
│ │ │ │ │ ├── AadhaarUploadErrorScreen.tsx
│ │ │ │ │ ├── AadhaarUploadScreen.tsx
│ │ │ │ │ └── AadhaarUploadedSuccessScreen.tsx
│ │ │ │ ├── management/
│ │ │ │ │ ├── DocumentDataInfoScreen.tsx
│ │ │ │ │ ├── IdDetailsScreen.tsx
│ │ │ │ │ └── ManageDocumentsScreen.tsx
│ │ │ │ ├── scanning/
│ │ │ │ │ ├── DataConfirmationScreen.tsx
│ │ │ │ │ ├── DocumentCameraScreen.tsx
│ │ │ │ │ ├── DocumentCameraTroubleScreen.tsx
│ │ │ │ │ ├── DocumentNFCMethodSelectionScreen.tsx
│ │ │ │ │ ├── DocumentNFCScanScreen.tsx
│ │ │ │ │ ├── DocumentNFCScanScreen.web.tsx
│ │ │ │ │ ├── DocumentNFCTroubleScreen.tsx
│ │ │ │ │ ├── RegistrationFallbackMRZScreen.tsx
│ │ │ │ │ └── RegistrationFallbackNFCScreen.tsx
│ │ │ │ └── selection/
│ │ │ │ ├── ConfirmBelongingScreen.tsx
│ │ │ │ ├── CountryPickerScreen.tsx
│ │ │ │ ├── DocumentOnboardingScreen.tsx
│ │ │ │ ├── IDPickerScreen.tsx
│ │ │ │ └── LogoConfirmationScreen.tsx
│ │ │ ├── home/
│ │ │ │ ├── HomeScreen.tsx
│ │ │ │ ├── PointsInfoScreen.tsx
│ │ │ │ ├── ProofHistoryDetailScreen.tsx
│ │ │ │ ├── ProofHistoryList.tsx
│ │ │ │ └── ProofHistoryScreen.tsx
│ │ │ ├── kyc/
│ │ │ │ ├── KYCVerifiedScreen.tsx
│ │ │ │ ├── KycConnectionErrorScreen.tsx
│ │ │ │ ├── KycFailureScreen.tsx
│ │ │ │ └── KycSuccessScreen.tsx
│ │ │ ├── onboarding/
│ │ │ │ ├── AccountVerifiedSuccessScreen.tsx
│ │ │ │ ├── DisclaimerScreen.tsx
│ │ │ │ └── SaveRecoveryPhraseScreen.tsx
│ │ │ ├── shared/
│ │ │ │ ├── ComingSoonScreen.tsx
│ │ │ │ └── WebViewScreen.tsx
│ │ │ ├── starfall/
│ │ │ │ └── StarfallPushCodeScreen.tsx
│ │ │ └── verification/
│ │ │ ├── DocumentSelectorForProvingScreen.tsx
│ │ │ ├── ProofRequestStatusScreen.tsx
│ │ │ ├── ProveScreen.tsx
│ │ │ ├── ProvingScreenRouter.tsx
│ │ │ ├── QRCodeTroubleScreen.tsx
│ │ │ └── QRCodeViewFinderScreen.tsx
│ │ ├── services/
│ │ │ ├── analytics.ts
│ │ │ ├── cloud-backup/
│ │ │ │ ├── google.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── ios.ts
│ │ │ ├── logging/
│ │ │ │ ├── index.ts
│ │ │ │ └── logger/
│ │ │ │ ├── consoleInterceptor.ts
│ │ │ │ ├── lokiTransport.ts
│ │ │ │ └── nativeLoggerBridge.ts
│ │ │ ├── notifications/
│ │ │ │ ├── notificationService.shared.ts
│ │ │ │ ├── notificationService.ts
│ │ │ │ └── notificationService.web.ts
│ │ │ ├── points/
│ │ │ │ ├── api.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── eventPolling.ts
│ │ │ │ ├── getEvents.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── jobStatus.ts
│ │ │ │ ├── recordEvents.ts
│ │ │ │ ├── registerEvents.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── starfall/
│ │ │ │ └── pushCodeService.ts
│ │ │ ├── support.ts
│ │ │ └── supportUuid.ts
│ │ ├── stores/
│ │ │ ├── database.ts
│ │ │ ├── database.web.ts
│ │ │ ├── errorInjectionStore.ts
│ │ │ ├── pendingKycStore.ts
│ │ │ ├── pointEventStore.ts
│ │ │ ├── proofHistoryStore.ts
│ │ │ ├── proofTypes.ts
│ │ │ ├── settingStore.ts
│ │ │ └── userStore.ts
│ │ ├── types/
│ │ │ ├── countryIso3To2.d.ts
│ │ │ ├── global.d.ts
│ │ │ ├── mnemonic.ts
│ │ │ ├── png.d.ts
│ │ │ ├── react-native-keychain.d.ts
│ │ │ ├── reactNativePassportReader.d.ts
│ │ │ ├── svg.d.ts
│ │ │ └── vite-env.d.ts
│ │ └── utils/
│ │ ├── cameraPermission.ts
│ │ ├── cardBackgroundSelector.ts
│ │ ├── countryDemonyms.ts
│ │ ├── crypto/
│ │ │ ├── cryptoLoader.ts
│ │ │ ├── ethers.ts
│ │ │ └── mnemonic.ts
│ │ ├── devUtils.ts
│ │ ├── diffCalculator.ts
│ │ ├── disclosureUtils.ts
│ │ ├── documentAttributes.ts
│ │ ├── documentUtils.ts
│ │ ├── documents.ts
│ │ ├── formatUserId.ts
│ │ ├── index.ts
│ │ ├── jsonUtils.ts
│ │ ├── keychainErrors.ts
│ │ ├── modalCallbackRegistry.ts
│ │ ├── retry.ts
│ │ ├── styleUtils.ts
│ │ ├── webview.ts
│ │ └── yymmdd.ts
│ ├── tamagui.config.ts
│ ├── tests/
│ │ ├── __mocks__/
│ │ │ └── mobile-sdk-components.js
│ │ ├── __setup__/
│ │ │ ├── @env.js
│ │ │ ├── databaseMocks.ts
│ │ │ ├── expoCameraMock.js
│ │ │ ├── imageMock.js
│ │ │ ├── mocks/
│ │ │ │ ├── navigation.js
│ │ │ │ └── ui.js
│ │ │ ├── notificationServiceMock.js
│ │ │ ├── selfClientProvider.ts
│ │ │ └── svgMock.js
│ │ ├── build/
│ │ │ ├── android/
│ │ │ │ ├── build.gradle.test.ts
│ │ │ │ └── manifest.test.ts
│ │ │ └── ios/
│ │ │ ├── infoPlist.test.ts
│ │ │ └── pbxproj.test.ts
│ │ ├── e2e/
│ │ │ ├── launch.android.flow.yaml
│ │ │ └── launch.ios.flow.yaml
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── ErrorBoundary.test.tsx
│ │ │ │ ├── InputField.test.tsx
│ │ │ │ ├── PassportCamera.test.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ └── IDSelectorSheet.test.tsx
│ │ │ │ ├── homescreen/
│ │ │ │ │ └── UnregisteredIdCard.test.tsx
│ │ │ │ └── support/
│ │ │ │ └── SupportUuidRow.test.tsx
│ │ │ ├── config/
│ │ │ │ ├── remoteConfig.test.ts
│ │ │ │ └── sentry.test.ts
│ │ │ ├── consts/
│ │ │ │ └── links.test.ts
│ │ │ ├── hooks/
│ │ │ │ ├── useAppUpdates.test.tsx
│ │ │ │ ├── useConnectionModal.test.ts
│ │ │ │ ├── useEarnPointsFlow.test.ts
│ │ │ │ ├── useHapticNavigation.test.ts
│ │ │ │ ├── useHasRealDocument.test.ts
│ │ │ │ ├── useMnemonic.test.ts
│ │ │ │ ├── useModal.test.ts
│ │ │ │ ├── useOpenSupportForm.test.ts
│ │ │ │ ├── usePendingKycRecovery.test.ts
│ │ │ │ ├── useProofDisclosureStalenessCheck.test.ts
│ │ │ │ ├── useRecoveryPrompts.test.ts
│ │ │ │ ├── useReferralConfirmation.test.ts
│ │ │ │ ├── useReferralMessage.test.ts
│ │ │ │ ├── useReferralRegistration.test.ts
│ │ │ │ └── useRegisterReferral.test.ts
│ │ │ ├── integrations/
│ │ │ │ └── nfc/
│ │ │ │ ├── nfcScanner.test.ts
│ │ │ │ └── passportReader.test.ts
│ │ │ ├── navigation/
│ │ │ │ └── deeplinks.test.ts
│ │ │ ├── navigation.test.tsx
│ │ │ ├── providers/
│ │ │ │ ├── loggerProvider.test.tsx
│ │ │ │ ├── notificationTrackingProvider.test.tsx
│ │ │ │ ├── passportDataProvider.test.tsx
│ │ │ │ ├── remoteConfigProvider.test.tsx
│ │ │ │ └── selfClientProvider.test.tsx
│ │ │ ├── proving/
│ │ │ │ ├── loadingScreenStateText.test.ts
│ │ │ │ ├── provingUtils.test.ts
│ │ │ │ └── validateDocument.test.ts
│ │ │ ├── screens/
│ │ │ │ ├── GratificationScreen.test.tsx
│ │ │ │ ├── WebViewScreen.test.tsx
│ │ │ │ ├── account/
│ │ │ │ │ ├── recovery/
│ │ │ │ │ │ └── RecoverWithPhraseScreen.test.tsx
│ │ │ │ │ └── settings/
│ │ │ │ │ ├── SupportScreen.test.tsx
│ │ │ │ │ └── settingsMenu.test.ts
│ │ │ │ ├── app/
│ │ │ │ │ └── startupRouting.test.ts
│ │ │ │ ├── dev/
│ │ │ │ │ └── useDangerZoneActions.test.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ ├── management/
│ │ │ │ │ │ └── ManageDocumentsScreen.test.tsx
│ │ │ │ │ └── scanning/
│ │ │ │ │ ├── DataConfirmationScreen-nfcFallback.test.tsx
│ │ │ │ │ └── DataConfirmationScreen.test.tsx
│ │ │ │ ├── home/
│ │ │ │ │ └── PointsInfoScreen.test.tsx
│ │ │ │ ├── kyc/
│ │ │ │ │ ├── KYCVerifiedScreen.test.tsx
│ │ │ │ │ └── KycSuccessScreen.test.tsx
│ │ │ │ └── verification/
│ │ │ │ ├── DocumentSelectorForProvingScreen.test.tsx
│ │ │ │ ├── ProofRequestStatusScreen.test.tsx
│ │ │ │ └── ProvingScreenRouter.test.tsx
│ │ │ ├── services/
│ │ │ │ ├── analytics.test.ts
│ │ │ │ ├── cloud-backup.test.ts
│ │ │ │ ├── logging/
│ │ │ │ │ └── lokiTransport.test.ts
│ │ │ │ ├── logging.test.ts
│ │ │ │ ├── notifications/
│ │ │ │ │ └── notificationService.test.ts
│ │ │ │ └── supportUuid.test.ts
│ │ │ ├── stores/
│ │ │ │ ├── database.test.ts
│ │ │ │ ├── proofHistoryStore.test.ts
│ │ │ │ └── settingStore.test.ts
│ │ │ └── utils/
│ │ │ ├── cameraPermission.test.ts
│ │ │ ├── cardBackgroundSelector.test.ts
│ │ │ ├── crypto/
│ │ │ │ └── ethers.test.ts
│ │ │ ├── diffCalculator.test.ts
│ │ │ ├── documents.test.ts
│ │ │ ├── formatUserId.test.ts
│ │ │ ├── jsonUtils.test.ts
│ │ │ ├── keychainErrors.test.ts
│ │ │ ├── modalCallbackRegistry.test.ts
│ │ │ ├── points/
│ │ │ │ ├── api.test.ts
│ │ │ │ ├── recordEvents.test.ts
│ │ │ │ └── registerEvents.test.ts
│ │ │ ├── webview.test.ts
│ │ │ └── yymmdd.test.ts
│ │ └── tsconfig.json
│ ├── tsconfig.json
│ ├── tsconfig.test.json
│ ├── version.json
│ ├── vite.config.ts
│ └── web/
│ ├── fonts/
│ │ ├── Advercase-Regular.otf
│ │ ├── DINOT-Bold.otf
│ │ ├── DINOT-Medium.otf
│ │ └── IBMPlexMono-Regular.otf
│ ├── fonts.css
│ ├── index.html
│ ├── main.tsx
│ └── reset.css
├── babel.config.js
├── circuits/
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── LICENSE
│ ├── README.md
│ ├── circuits/
│ │ ├── disclose/
│ │ │ ├── vc_and_disclose.circom
│ │ │ ├── vc_and_disclose_aadhaar.circom
│ │ │ ├── vc_and_disclose_id.circom
│ │ │ └── vc_and_disclose_kyc.circom
│ │ ├── dsc/
│ │ │ ├── dsc.circom
│ │ │ └── instances/
│ │ │ ├── dsc_sha1_ecdsa_brainpoolP256r1.circom
│ │ │ ├── dsc_sha1_ecdsa_secp256r1.circom
│ │ │ ├── dsc_sha1_rsa_65537_4096.circom
│ │ │ ├── dsc_sha256_ecdsa_brainpoolP256r1.circom
│ │ │ ├── dsc_sha256_ecdsa_brainpoolP384r1.circom
│ │ │ ├── dsc_sha256_ecdsa_secp256r1.circom
│ │ │ ├── dsc_sha256_ecdsa_secp384r1.circom
│ │ │ ├── dsc_sha256_ecdsa_secp521r1.circom
│ │ │ ├── dsc_sha256_rsa_107903_4096.circom
│ │ │ ├── dsc_sha256_rsa_122125_4096.circom
│ │ │ ├── dsc_sha256_rsa_130689_4096.circom
│ │ │ ├── dsc_sha256_rsa_56611_4096.circom
│ │ │ ├── dsc_sha256_rsa_65537_4096.circom
│ │ │ ├── dsc_sha256_rsapss_3_32_3072.circom
│ │ │ ├── dsc_sha256_rsapss_65537_32_3072.circom
│ │ │ ├── dsc_sha256_rsapss_65537_32_4096.circom
│ │ │ ├── dsc_sha384_ecdsa_brainpoolP384r1.circom
│ │ │ ├── dsc_sha384_ecdsa_brainpoolP512r1.circom
│ │ │ ├── dsc_sha384_ecdsa_secp384r1.circom
│ │ │ ├── dsc_sha384_rsapss_65537_48_3072.circom
│ │ │ ├── dsc_sha512_ecdsa_brainpoolP512r1.circom
│ │ │ ├── dsc_sha512_ecdsa_secp521r1.circom
│ │ │ ├── dsc_sha512_rsa_65537_4096.circom
│ │ │ └── dsc_sha512_rsapss_65537_64_4096.circom
│ │ ├── gcp_jwt_verifier/
│ │ │ ├── README.md
│ │ │ ├── example_jwt.txt
│ │ │ ├── example_jwt_fail.txt
│ │ │ ├── gcp_jwt_verifier.circom
│ │ │ ├── jwt_verifier.circom
│ │ │ └── prepare.ts
│ │ ├── register/
│ │ │ ├── instances/
│ │ │ │ ├── register_aadhaar.circom
│ │ │ │ ├── register_kyc.circom
│ │ │ │ ├── register_sha1_sha1_sha1_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_sha1_sha1_sha1_ecdsa_secp256r1.circom
│ │ │ │ ├── register_sha1_sha1_sha1_rsa_64321_4096.circom
│ │ │ │ ├── register_sha1_sha1_sha1_rsa_65537_4096.circom
│ │ │ │ ├── register_sha1_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_sha224_sha224_sha224_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_sha256_sha1_sha1_rsa_65537_4096.circom
│ │ │ │ ├── register_sha256_sha224_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_sha256_sha256_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_brainpoolP256r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_secp256r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_secp384r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsa_3_4096.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_3_32_2048.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_32_3072.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_32_4096.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_64_2048.circom
│ │ │ │ ├── register_sha384_sha384_sha384_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_sha384_sha384_sha384_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_sha384_sha384_sha384_ecdsa_secp384r1.circom
│ │ │ │ ├── register_sha384_sha384_sha384_rsapss_65537_48_2048.circom
│ │ │ │ ├── register_sha512_sha512_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_sha512_sha512_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_sha512_sha512_sha512_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_sha512_sha512_sha512_ecdsa_secp521r1.circom
│ │ │ │ ├── register_sha512_sha512_sha512_rsa_65537_4096.circom
│ │ │ │ └── register_sha512_sha512_sha512_rsapss_65537_64_2048.circom
│ │ │ ├── register.circom
│ │ │ ├── register_aadhaar.circom
│ │ │ └── register_kyc.circom
│ │ ├── register_id/
│ │ │ ├── instances/
│ │ │ │ ├── register_id_sha1_sha1_sha1_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_id_sha1_sha1_sha1_ecdsa_secp256r1.circom
│ │ │ │ ├── register_id_sha1_sha1_sha1_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha1_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha224_sha224_sha224_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_id_sha256_sha224_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_brainpoolP256r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_secp256r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_secp384r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsa_3_4096.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_3_32_2048.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_65537_32_3072.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_65537_64_2048.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_ecdsa_secp384r1.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_rsapss_65537_48_2048.circom
│ │ │ │ ├── register_id_sha512_sha512_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha512_sha512_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_id_sha512_sha512_sha512_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_id_sha512_sha512_sha512_ecdsa_secp521r1.circom
│ │ │ │ ├── register_id_sha512_sha512_sha512_rsa_65537_4096.circom
│ │ │ │ └── register_id_sha512_sha512_sha512_rsapss_65537_64_2048.circom
│ │ │ └── register_id.circom
│ │ ├── tests/
│ │ │ ├── ofac/
│ │ │ │ ├── ofac_name_dob_id_tester.circom
│ │ │ │ ├── ofac_name_dob_tester.circom
│ │ │ │ ├── ofac_name_yob_id_tester.circom
│ │ │ │ ├── ofac_name_yob_tester.circom
│ │ │ │ └── ofac_passport_number_tester.circom
│ │ │ └── utils/
│ │ │ ├── customHasher_tester.circom
│ │ │ ├── ecdsa/
│ │ │ │ ├── test_brainpoolP224r1.circom
│ │ │ │ ├── test_brainpoolP256r1.circom
│ │ │ │ ├── test_brainpoolP384r1.circom
│ │ │ │ ├── test_brainpoolP512r1.circom
│ │ │ │ ├── test_p256.circom
│ │ │ │ ├── test_p384.circom
│ │ │ │ └── test_p521.circom
│ │ │ ├── extractQrData_tester.circom
│ │ │ ├── isOlderThan_tester.circom
│ │ │ ├── isValid_tester.circom
│ │ │ ├── packBytesAndPoseidon_tester.circom
│ │ │ ├── proveCountryIsNotInList_tester.circom
│ │ │ ├── rsa/
│ │ │ │ ├── test_rsa_sha1_64321_4096.circom
│ │ │ │ ├── test_rsa_sha1_65537_2048.circom
│ │ │ │ ├── test_rsa_sha224_65537_2048.circom
│ │ │ │ ├── test_rsa_sha256_107903_4096.circom
│ │ │ │ ├── test_rsa_sha256_122125_4096.circom
│ │ │ │ ├── test_rsa_sha256_130689_4096.circom
│ │ │ │ ├── test_rsa_sha256_3_2048.circom
│ │ │ │ ├── test_rsa_sha256_56611_4096.circom
│ │ │ │ ├── test_rsa_sha256_65537_2048.circom
│ │ │ │ ├── test_rsa_sha256_65537_3072.circom
│ │ │ │ ├── test_rsa_sha256_65537_4096.circom
│ │ │ │ └── test_rsa_sha512_65537_4096.circom
│ │ │ ├── rsapss/
│ │ │ │ ├── test_rsapss_sha256_3_2048_32.circom
│ │ │ │ ├── test_rsapss_sha256_3_2048_64.circom
│ │ │ │ ├── test_rsapss_sha256_3_3072_32.circom
│ │ │ │ ├── test_rsapss_sha256_3_3072_64.circom
│ │ │ │ ├── test_rsapss_sha256_3_4096_32.circom
│ │ │ │ ├── test_rsapss_sha256_3_4096_64.circom
│ │ │ │ ├── test_rsapss_sha256_65537_2048_32.circom
│ │ │ │ ├── test_rsapss_sha256_65537_2048_64.circom
│ │ │ │ ├── test_rsapss_sha256_65537_3072_32.circom
│ │ │ │ ├── test_rsapss_sha256_65537_3072_64.circom
│ │ │ │ ├── test_rsapss_sha256_65537_4096_32.circom
│ │ │ │ ├── test_rsapss_sha256_65537_4096_64.circom
│ │ │ │ ├── test_rsapss_sha384_3_3072_48.circom
│ │ │ │ ├── test_rsapss_sha384_3_4096_48.circom
│ │ │ │ ├── test_rsapss_sha384_65537_3072_48.circom
│ │ │ │ ├── test_rsapss_sha384_65537_4096_48.circom
│ │ │ │ ├── test_rsapss_sha512_3_2048_64.circom
│ │ │ │ └── test_rsapss_sha512_3_4096_64.circom
│ │ │ └── wordsToBytes_tester.circom
│ │ └── utils/
│ │ ├── aadhaar/
│ │ │ ├── disclose/
│ │ │ │ ├── country_not_in_list.circom
│ │ │ │ └── verify_commitment.circom
│ │ │ ├── extractQrData.circom
│ │ │ ├── ofac/
│ │ │ │ ├── ofac_name_dob.circom
│ │ │ │ └── ofac_name_yob.circom
│ │ │ └── pack.circom
│ │ ├── crypto/
│ │ │ ├── bigInt/
│ │ │ │ ├── bigInt.circom
│ │ │ │ ├── bigIntComparators.circom
│ │ │ │ ├── bigIntFunc.circom
│ │ │ │ ├── bigIntHelpers.circom
│ │ │ │ ├── bigIntOverflow.circom
│ │ │ │ └── shouldUseKaratsuba.circom
│ │ │ ├── bitify/
│ │ │ │ ├── bytes.circom
│ │ │ │ ├── gates.circom
│ │ │ │ ├── operations.circom
│ │ │ │ └── splitWordsToBytes.circom
│ │ │ ├── ec/
│ │ │ │ ├── curve.circom
│ │ │ │ ├── get.circom
│ │ │ │ └── powers/
│ │ │ │ ├── brainpoolP224r1pows.circom
│ │ │ │ ├── brainpoolP256r1pows.circom
│ │ │ │ ├── brainpoolP384r1pows.circom
│ │ │ │ ├── brainpoolP512r1pows.circom
│ │ │ │ ├── p224pows.circom
│ │ │ │ ├── p256pows.circom
│ │ │ │ ├── p384pows.circom
│ │ │ │ └── p521pows.circom
│ │ │ ├── hasher/
│ │ │ │ ├── hash.circom
│ │ │ │ ├── sha1/
│ │ │ │ │ ├── constants.circom
│ │ │ │ │ ├── f.circom
│ │ │ │ │ ├── parity.circom
│ │ │ │ │ ├── rotate.circom
│ │ │ │ │ ├── sha1.circom
│ │ │ │ │ ├── sha1compression.circom
│ │ │ │ │ ├── t.circom
│ │ │ │ │ └── xor4.circom
│ │ │ │ ├── sha2/
│ │ │ │ │ ├── sha224/
│ │ │ │ │ │ ├── sha224HashBits.circom
│ │ │ │ │ │ ├── sha224HashChunks.circom
│ │ │ │ │ │ └── sha224InitialValue.circom
│ │ │ │ │ ├── sha256/
│ │ │ │ │ │ ├── sha256Compress.circom
│ │ │ │ │ │ ├── sha256HashBits.circom
│ │ │ │ │ │ ├── sha256HashChunks.circom
│ │ │ │ │ │ ├── sha256InitialValue.circom
│ │ │ │ │ │ ├── sha256RoundConst.circom
│ │ │ │ │ │ ├── sha256Rounds.circom
│ │ │ │ │ │ └── sha256Schedule.circom
│ │ │ │ │ ├── sha2Common.circom
│ │ │ │ │ ├── sha384/
│ │ │ │ │ │ ├── sha384HashBits.circom
│ │ │ │ │ │ ├── sha384HashChunks.circom
│ │ │ │ │ │ └── sha384InitialValue.circom
│ │ │ │ │ └── sha512/
│ │ │ │ │ ├── sha512Compress.circom
│ │ │ │ │ ├── sha512HashBits.circom
│ │ │ │ │ ├── sha512HashChunks.circom
│ │ │ │ │ ├── sha512InitialValue.circom
│ │ │ │ │ ├── sha512RoundConst.circom
│ │ │ │ │ ├── sha512Rounds.circom
│ │ │ │ │ └── sha512Schedule.circom
│ │ │ │ └── shaBytes/
│ │ │ │ ├── dynamic/
│ │ │ │ │ ├── sha1Bytes.circom
│ │ │ │ │ ├── sha224Bytes.circom
│ │ │ │ │ ├── sha384Bytes.circom
│ │ │ │ │ └── sha512Bytes.circom
│ │ │ │ └── shaBytesDynamic.circom
│ │ │ ├── int/
│ │ │ │ └── arithmetic.circom
│ │ │ ├── merkle-trees/
│ │ │ │ └── smt.circom
│ │ │ ├── signature/
│ │ │ │ ├── FpPowMod.circom
│ │ │ │ ├── ecdsa/
│ │ │ │ │ ├── ecdsa.circom
│ │ │ │ │ └── ecdsaVerifier.circom
│ │ │ │ ├── rsa/
│ │ │ │ │ ├── pkcs1v1_5Padding.circom
│ │ │ │ │ ├── verifyRsa3Pkcs1v1_5.circom
│ │ │ │ │ ├── verifyRsa65537Pkcs1v1_5.circom
│ │ │ │ │ └── verifyRsaGenericPkcs1v1_5.circom
│ │ │ │ └── rsapss/
│ │ │ │ ├── mgf1.circom
│ │ │ │ ├── rsapss3.circom
│ │ │ │ ├── rsapss65537.circom
│ │ │ │ └── validate.circom
│ │ │ └── utils/
│ │ │ └── switcher.circom
│ │ ├── gcp_jwt/
│ │ │ ├── dateIsLessSeconds.circom
│ │ │ ├── extractAndValidatePubkey.circom
│ │ │ ├── singleOccurance.circom
│ │ │ ├── validityChecker.circom
│ │ │ ├── verifyCertificateSignature.circom
│ │ │ └── verifyJSONFieldExtraction.circom
│ │ ├── kyc/
│ │ │ ├── babyEcdsa.circom
│ │ │ ├── constants.circom
│ │ │ ├── date/
│ │ │ │ ├── dateIsLess.circom
│ │ │ │ ├── isOlderThan.circom
│ │ │ │ └── isValid.circom
│ │ │ ├── disclose/
│ │ │ │ ├── disclose.circom
│ │ │ │ └── ofac/
│ │ │ │ ├── ofac_name_dob_kyc.circom
│ │ │ │ └── ofac_name_yob_kyc.circom
│ │ │ └── verifySignature.circom
│ │ └── passport/
│ │ ├── BytesToNum.circom
│ │ ├── checkPubkeyPosition.circom
│ │ ├── checkPubkeysEqual.circom
│ │ ├── constants.circom
│ │ ├── customHashers.circom
│ │ ├── date/
│ │ │ ├── dateIsLess.circom
│ │ │ ├── isOlderThan.circom
│ │ │ └── isValid.circom
│ │ ├── disclose/
│ │ │ ├── disclose.circom
│ │ │ ├── disclose_id.circom
│ │ │ ├── proveCountryIsNotInList.circom
│ │ │ └── verify_commitment.circom
│ │ ├── ofac/
│ │ │ ├── ofac_name_dob.circom
│ │ │ ├── ofac_name_dob_id.circom
│ │ │ ├── ofac_name_yob.circom
│ │ │ ├── ofac_name_yob_id.circom
│ │ │ └── ofac_passport_number.circom
│ │ ├── passportVerifier.circom
│ │ ├── signatureAlgorithm.circom
│ │ └── signatureVerifier.circom
│ ├── package.json
│ ├── scripts/
│ │ ├── server/
│ │ │ ├── download_circuits_from_AWS.sh
│ │ │ ├── download_ptau.sh
│ │ │ └── upload_to_AWS.sh
│ │ └── utils/
│ │ └── print_circom_tree.sh
│ ├── src/
│ │ ├── index.ts
│ │ └── testing/
│ │ └── index.ts
│ ├── tests/
│ │ ├── consts/
│ │ │ └── ofac/
│ │ │ ├── nameAndDobAadhaarSMT.json
│ │ │ ├── nameAndDobKycSMT.json
│ │ │ ├── nameAndDobPersonaSMT.json
│ │ │ ├── nameAndDobSMT.json
│ │ │ ├── nameAndDobSMT_ID.json
│ │ │ ├── nameAndDobSelfricaSMT.json
│ │ │ ├── nameAndYobAadhaarSMT.json
│ │ │ ├── nameAndYobKycSMT.json
│ │ │ ├── nameAndYobPersonaSMT.json
│ │ │ ├── nameAndYobSMT.json
│ │ │ ├── nameAndYobSMT_ID.json
│ │ │ ├── nameAndYobSelfricaSMT.json
│ │ │ └── passportNoAndNationalitySMT.json
│ │ ├── disclose/
│ │ │ ├── vc_and_disclose.test.ts
│ │ │ ├── vc_and_disclose_aadhaar.test.ts
│ │ │ ├── vc_and_disclose_id.test.ts
│ │ │ └── vc_and_disclose_kyc.test.ts
│ │ ├── dsc/
│ │ │ ├── dsc.test.ts
│ │ │ └── test_cases.ts
│ │ ├── ofac/
│ │ │ └── ofac.test.ts
│ │ ├── other_circuits/
│ │ │ ├── custom_hasher.test.ts
│ │ │ ├── is_older_than.test.ts
│ │ │ ├── is_valid.test.ts
│ │ │ ├── prove_country_is_not_in_list.test.ts
│ │ │ └── qrdata_extractor.test.ts
│ │ ├── register/
│ │ │ ├── pubkeys.ts
│ │ │ ├── register.test.ts
│ │ │ ├── register_aadhaar.test.ts
│ │ │ ├── register_kyc.test.ts
│ │ │ └── test_cases.ts
│ │ ├── register_id/
│ │ │ ├── register_id.test.ts
│ │ │ └── test_cases.ts
│ │ └── utils/
│ │ ├── aadhaar/
│ │ │ ├── generateTestData.ts
│ │ │ └── utils.ts
│ │ ├── ecdsa.test.ts
│ │ ├── generateMockInputsInCircuits.ts
│ │ ├── generateMockInputsRsaPss.ts
│ │ ├── kyc/
│ │ │ ├── date/
│ │ │ │ ├── date.test.ts
│ │ │ │ ├── isOlderThan.test.ts
│ │ │ │ ├── is_older_than.test.circom
│ │ │ │ └── is_valid.test.circom
│ │ │ └── ofac/
│ │ │ ├── ofac.test.ts
│ │ │ ├── ofac_name_dob_kyc.test.circom
│ │ │ └── ofac_name_yob_kyc.test.circom
│ │ ├── rsaPkcs1v1_5.test.ts
│ │ ├── rsapss.test.ts
│ │ └── testcase/
│ │ └── rsapss.ts
│ └── tsconfig.json
├── common/
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .npmignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── README.md
│ ├── index.ts
│ ├── package.json
│ ├── pubkeys/
│ │ ├── public_keys_parsed.json
│ │ ├── serialized_csca_tree.json
│ │ ├── serialized_dsc_tree.json
│ │ └── serialized_tree.json
│ ├── sanctionedCountries/
│ │ └── outputs/
│ │ └── sc_SMT.json
│ ├── scripts/
│ │ ├── certificates/
│ │ │ └── concatCertificates.ts
│ │ ├── postBuild.mjs
│ │ ├── shimConfigs.js
│ │ ├── testExports.js
│ │ └── validateExports.js
│ ├── src/
│ │ ├── constants/
│ │ │ ├── constants.ts
│ │ │ ├── countries.ts
│ │ │ ├── index.ts
│ │ │ ├── mockCertificates.ts
│ │ │ ├── sampleDataHashes.ts
│ │ │ ├── skiPem.ts
│ │ │ └── vkey.ts
│ │ ├── mock_certificates/
│ │ │ ├── README.md
│ │ │ ├── aadhaar/
│ │ │ │ └── mockAadhaarCert.ts
│ │ │ ├── openssl.cnf
│ │ │ ├── sha1_ecdsa_brainpoolP224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_ecdsa_secp256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_3_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_64321_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha224_ecdsa_brainpoolP224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha224_ecdsa_secp224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_brainpoolP224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_brainpoolP384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_secp256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_secp384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_secp521r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_107903_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_122125_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_130689_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_3_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_3_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_56611_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_65537_3072/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_3_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_3_3072/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_3_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_65537_2048/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_65537_3072/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_64_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_brainpoolP384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_brainpoolP512r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_secp384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsapss_48_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsapss_48_65537_3072/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsapss_48_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ └── mock_csca.pem
│ │ │ ├── sha512_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_ecdsa_brainpoolP384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_ecdsa_brainpoolP512r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_ecdsa_secp521r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_rsa_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_rsapss_64_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ └── sha512_rsapss_64_65537_4096/
│ │ │ ├── mock_csca.key
│ │ │ ├── mock_csca.pem
│ │ │ ├── mock_dsc.key
│ │ │ └── mock_dsc.pem
│ │ ├── polyfills/
│ │ │ └── crypto.ts
│ │ ├── scripts/
│ │ │ ├── addCertificatesInTs.py
│ │ │ ├── addSkiPemToTs.py
│ │ │ ├── extensions.cnf
│ │ │ ├── generateCertificates.sh
│ │ │ └── generateCountryOptions.ts
│ │ ├── types/
│ │ │ ├── app.ts
│ │ │ ├── certificates.ts
│ │ │ ├── circuits.ts
│ │ │ ├── index.ts
│ │ │ └── passport.ts
│ │ └── utils/
│ │ ├── aadhaar/
│ │ │ ├── assets/
│ │ │ │ ├── dataInput.ts
│ │ │ │ └── testPublicKey.pem
│ │ │ ├── build_aadhaar_ofac_smt.ts
│ │ │ ├── constants.ts
│ │ │ ├── mockData.ts
│ │ │ └── utils.ts
│ │ ├── appType.ts
│ │ ├── arrays.ts
│ │ ├── attest.ts
│ │ ├── bytes.ts
│ │ ├── certificate_parsing/
│ │ │ ├── certUtils.ts
│ │ │ ├── curveUtils.ts
│ │ │ ├── curves.ts
│ │ │ ├── dataStructure.ts
│ │ │ ├── elliptic.ts
│ │ │ ├── ellipticInit.ts
│ │ │ ├── index.ts
│ │ │ ├── oidUtils.ts
│ │ │ ├── oids.ts
│ │ │ ├── parseCertificate.ts
│ │ │ ├── parseCertificateNode.ts
│ │ │ ├── parseCertificateSimple.ts
│ │ │ ├── parseNode.ts
│ │ │ ├── parseSimple.ts
│ │ │ └── utils.ts
│ │ ├── circuits/
│ │ │ ├── circuitsName.ts
│ │ │ ├── discloseInputs.ts
│ │ │ ├── dscInputs.ts
│ │ │ ├── formatInputs.ts
│ │ │ ├── formatOutputs.ts
│ │ │ ├── generateInputs.ts
│ │ │ ├── index.ts
│ │ │ ├── ofacInputs.ts
│ │ │ ├── registerInputs.ts
│ │ │ └── uuid.ts
│ │ ├── contracts/
│ │ │ ├── forbiddenCountries.ts
│ │ │ ├── formatCallData.ts
│ │ │ └── index.ts
│ │ ├── cose.ts
│ │ ├── csca.ts
│ │ ├── date.ts
│ │ ├── hash/
│ │ │ ├── custom.ts
│ │ │ ├── poseidon.ts
│ │ │ └── sha.ts
│ │ ├── hash.test.ts
│ │ ├── hash.ts
│ │ ├── index.ts
│ │ ├── kyc/
│ │ │ ├── api.ts
│ │ │ ├── build_kyc_ofac_smt.ts
│ │ │ ├── constants.ts
│ │ │ ├── ecdsa/
│ │ │ │ ├── ecdsa.ts
│ │ │ │ └── utils.ts
│ │ │ ├── generateInputs.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ ├── ofac.test.ts
│ │ ├── ofac.ts
│ │ ├── passportData.ts
│ │ ├── passports/
│ │ │ ├── commitment.ts
│ │ │ ├── core.ts
│ │ │ ├── dg1.ts
│ │ │ ├── format.ts
│ │ │ ├── genMockIdDoc.ts
│ │ │ ├── genMockPassportData.ts
│ │ │ ├── getMockDSC.ts
│ │ │ ├── index.ts
│ │ │ ├── mock.ts
│ │ │ ├── mockDsc.ts
│ │ │ ├── mockGeneration.ts
│ │ │ ├── parsing.ts
│ │ │ ├── passport.ts
│ │ │ ├── passport_parsing/
│ │ │ │ ├── brutForceDscSignature.ts
│ │ │ │ ├── brutForcePassportSignature.ts
│ │ │ │ ├── parseDscCertificateData.ts
│ │ │ │ └── parsePassportData.ts
│ │ │ ├── signature.ts
│ │ │ ├── validate.test.ts
│ │ │ └── validate.ts
│ │ ├── proving.ts
│ │ ├── scope.ts
│ │ ├── selfAttestation.ts
│ │ ├── shaPad.ts
│ │ ├── trees.ts
│ │ └── types.ts
│ ├── tests/
│ │ ├── coseVerify.test.ts
│ │ ├── cryptoHash.test.ts
│ │ ├── cryptoHmac.test.ts
│ │ ├── genMockPassportData.test.ts
│ │ ├── proving.test.ts
│ │ ├── scope.test.ts
│ │ └── setup.ts
│ ├── tsconfig.cjs.json
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── vitest.config.ts
├── contracts/
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc.yml
│ ├── README.md
│ ├── UPGRADE_GUIDE.md
│ ├── contracts/
│ │ ├── IdentityVerificationHub.sol
│ │ ├── IdentityVerificationHubImplV1.sol
│ │ ├── IdentityVerificationHubImplV2.sol
│ │ ├── abstract/
│ │ │ ├── SelfVerificationRoot.sol
│ │ │ └── SelfVerificationRootUpgradeable.sol
│ │ ├── constants/
│ │ │ ├── AttestationId.sol
│ │ │ ├── CircuitConstants.sol
│ │ │ └── CircuitConstantsV2.sol
│ │ ├── example/
│ │ │ ├── Airdrop.sol
│ │ │ ├── HappyBirthday.sol
│ │ │ ├── SelfIdentityERC721.sol
│ │ │ └── SelfPassportERC721.sol
│ │ ├── interfaces/
│ │ │ ├── IDscCircuitVerifier.sol
│ │ │ ├── IIdentityRegistryAadhaarV1.sol
│ │ │ ├── IIdentityRegistryIdCardV1.sol
│ │ │ ├── IIdentityRegistryKycV1.sol
│ │ │ ├── IIdentityRegistryV1.sol
│ │ │ ├── IIdentityVerificationHubV1.sol
│ │ │ ├── IIdentityVerificationHubV2.sol
│ │ │ ├── IPassportAirdropRoot.sol
│ │ │ ├── IPoseidonT3.sol
│ │ │ ├── IRegisterCircuitVerifier.sol
│ │ │ ├── ISelfVerificationRoot.sol
│ │ │ └── IVcAndDiscloseCircuitVerifier.sol
│ │ ├── libraries/
│ │ │ ├── CircuitAttributeHandler.sol
│ │ │ ├── CircuitAttributeHandlerV2.sol
│ │ │ ├── CountryCode.sol
│ │ │ ├── CustomVerifier.sol
│ │ │ ├── DscProofVerifierLib.sol
│ │ │ ├── Formatter.sol
│ │ │ ├── GCPJWTHelper.sol
│ │ │ ├── GenericFormatter.sol
│ │ │ ├── IdCardAttributeHandler.sol
│ │ │ ├── OfacCheckLib.sol
│ │ │ ├── OutputFormatterLib.sol
│ │ │ ├── ProofVerifierLib.sol
│ │ │ ├── RegisterProofVerifierLib.sol
│ │ │ ├── RootCheckLib.sol
│ │ │ ├── SelfCircuitLibrary.sol
│ │ │ ├── SelfStructs.sol
│ │ │ └── SelfUtils.sol
│ │ ├── registry/
│ │ │ ├── IdentityRegistry.sol
│ │ │ ├── IdentityRegistryAadhaarImplV1.sol
│ │ │ ├── IdentityRegistryIdCardImplV1.sol
│ │ │ ├── IdentityRegistryImplV1.sol
│ │ │ └── IdentityRegistryKycImplV1.sol
│ │ ├── sdk/
│ │ │ └── VerifyAll.sol
│ │ ├── tests/
│ │ │ ├── MockGCPJWTVerifier.sol
│ │ │ ├── MockOwnableHub.sol
│ │ │ ├── MockOwnableImplRoot.sol
│ │ │ ├── MockOwnableRegistry.sol
│ │ │ ├── MockUpgradedHub.sol
│ │ │ ├── MockUpgradedRegistry.sol
│ │ │ ├── TestAirdrop.sol
│ │ │ ├── TestCountryCodes.sol
│ │ │ ├── TestCustomVerifier.sol
│ │ │ ├── TestGCPJWTHelper.sol
│ │ │ ├── TestSelfUtils.sol
│ │ │ ├── TestSelfVerificationRoot.sol
│ │ │ ├── airdropToken.sol
│ │ │ ├── testCircuitAttributeHandler.sol
│ │ │ ├── testFormatter.sol
│ │ │ ├── testGenericFormatter.sol
│ │ │ ├── testImplRoot.sol
│ │ │ ├── testUpgradedIdentityRegistryImplV1.sol
│ │ │ ├── testUpgradedIdentityVerificationHubImplV1.sol
│ │ │ └── testUpgradedIdentityVerificationHubImplV2.sol
│ │ ├── upgradeable/
│ │ │ ├── ImplRoot.sol
│ │ │ └── ProxyRoot.sol
│ │ ├── utils/
│ │ │ └── PCR0Manager.sol
│ │ └── verifiers/
│ │ ├── disclose/
│ │ │ ├── Verifier_vc_and_disclose.sol
│ │ │ ├── Verifier_vc_and_disclose_aadhaar.sol
│ │ │ ├── Verifier_vc_and_disclose_id.sol
│ │ │ └── Verifier_vc_and_disclose_kyc.sol
│ │ ├── dsc/
│ │ │ ├── Verifier_dsc_sha1_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_dsc_sha1_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_dsc_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_107903_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_122125_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_130689_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_56611_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsapss_3_32_3072.sol
│ │ │ ├── Verifier_dsc_sha256_rsapss_65537_32_3072.sol
│ │ │ ├── Verifier_dsc_sha256_rsapss_65537_32_4096.sol
│ │ │ ├── Verifier_dsc_sha384_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_dsc_sha384_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_dsc_sha384_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_dsc_sha512_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_dsc_sha512_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_dsc_sha512_rsa_65537_4096.sol
│ │ │ └── Verifier_dsc_sha512_rsapss_65537_64_4096.sol
│ │ ├── gcp/
│ │ │ └── Verifier_gcp_jwt.sol
│ │ ├── register/
│ │ │ ├── Verifier_register_sha1_sha1_sha1_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_sha1_sha1_sha1_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_sha1_sha1_sha1_rsa_64321_4096.sol
│ │ │ ├── Verifier_register_sha1_sha1_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha1_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha224_sha224_sha224_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_sha256_sha1_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha256_sha224_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsa_3_4096.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_3_32_2048.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_32_3072.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_32_4096.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_64_2048.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_rsapss_65537_48_2048.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha512_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha512_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha512_rsa_65537_4096.sol
│ │ │ └── Verifier_register_sha512_sha512_sha512_rsapss_65537_64_2048.sol
│ │ ├── register_aadhaar/
│ │ │ └── Verifier_register_aadhaar.sol
│ │ ├── register_id/
│ │ │ ├── Verifier_register_id_sha1_sha1_sha1_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_id_sha1_sha1_sha1_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_id_sha1_sha1_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha1_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha224_sha224_sha224_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha224_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsa_3_4096.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_3_32_2048.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_65537_32_3072.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_65537_64_2048.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_rsapss_65537_48_2048.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha512_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha512_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha512_rsa_65537_4096.sol
│ │ │ └── Verifier_register_id_sha512_sha512_sha512_rsapss_65537_64_2048.sol
│ │ └── register_kyc/
│ │ └── Verifier_register_kyc.sol
│ ├── deployments/
│ │ └── registry.json
│ ├── error-selectors.json
│ ├── foundry.toml
│ ├── hardhat.config.ts
│ ├── ignition/
│ │ ├── deployments/
│ │ │ ├── chain-11142220/
│ │ │ │ └── deployed_addresses.json
│ │ │ ├── chain-42220/
│ │ │ │ └── deployed_addresses.json
│ │ │ ├── prod/
│ │ │ │ └── deployed_addresses.json
│ │ │ └── staging/
│ │ │ └── deployed_addresses.json
│ │ ├── modules/
│ │ │ ├── deployTestSelfVerificationRoot.ts
│ │ │ ├── hub/
│ │ │ │ ├── deployHub.ts
│ │ │ │ ├── deployHubV2.ts
│ │ │ │ ├── updateRegistries.ts
│ │ │ │ └── updateVerifiers.ts
│ │ │ ├── registry/
│ │ │ │ ├── deployAadhaarRegistry.ts
│ │ │ │ ├── deployIdCardRegistry.ts
│ │ │ │ ├── deployKycRegistry.ts
│ │ │ │ ├── deployRegistry.ts
│ │ │ │ └── updateRegistries.ts
│ │ │ ├── scripts/
│ │ │ │ ├── updatePCR0.ts
│ │ │ │ ├── updateRegistryCscaRoot.ts
│ │ │ │ ├── updateRegistryHub.ts
│ │ │ │ ├── updateRegistryHubV2.ts
│ │ │ │ └── updateVerifyAllAddresses.ts
│ │ │ ├── upgrade/
│ │ │ │ ├── deployNewHubAndUpgrade.ts
│ │ │ │ ├── deployNewRegistryAndUpgrade.ts
│ │ │ │ ├── upgradeAadhaarRegistry.ts
│ │ │ │ ├── upgradeIdCardRegistry.ts
│ │ │ │ ├── upgradeKycRegistry.ts
│ │ │ │ └── upgradeRegistry.ts
│ │ │ ├── utils/
│ │ │ │ └── deployPCR0.ts
│ │ │ ├── verifiers/
│ │ │ │ ├── deployAllVerifiers.ts
│ │ │ │ └── deployIdCardVerifier.ts
│ │ │ └── verifyAll/
│ │ │ └── deployVerifyAll.ts
│ │ └── readme.md
│ ├── package.json
│ ├── remappings.txt
│ ├── script/
│ │ └── MigratePCR0Manager.s.sol
│ ├── scripts/
│ │ ├── README.md
│ │ ├── constants.ts
│ │ ├── deleteDscKeyCommitment.mts
│ │ ├── deleteDscKeyCommitment.ts
│ │ ├── dev.sh
│ │ ├── findErrorSelectors.ts
│ │ ├── findErrorSignature.mts
│ │ ├── prod.sh
│ │ ├── setDscKeyCommitment.ts
│ │ ├── setHubV2.ts
│ │ ├── setRegistry.ts
│ │ ├── setRegistryId.ts
│ │ ├── setVerifiers.ts
│ │ ├── setVerifiersV2.ts
│ │ ├── showRegistryAddresses.ts
│ │ ├── staging.sh
│ │ ├── test.sh
│ │ ├── updateRegistryOfacRoot.ts
│ │ └── update_contract_name.sh
│ ├── tasks/
│ │ └── upgrade/
│ │ ├── README.md
│ │ ├── history.ts
│ │ ├── index.ts
│ │ ├── prepare.ts
│ │ ├── propose.ts
│ │ ├── status.ts
│ │ ├── types.ts
│ │ ├── upgrade.ts
│ │ └── utils.ts
│ ├── test/
│ │ ├── foundry/
│ │ │ ├── MigratePCR0Manager.t.sol
│ │ │ └── UpgradeToAccessControl.t.sol
│ │ ├── unit/
│ │ │ ├── CircuitAttributeHandler.test.ts
│ │ │ ├── CountryCodes.test.ts
│ │ │ ├── CustomVerifier.test.ts
│ │ │ ├── GCPJWTHelper.test.ts
│ │ │ ├── GenericFormatter.test.ts
│ │ │ ├── IdentityRegistry.test.ts
│ │ │ ├── IdentityVerificationHub.test.ts
│ │ │ ├── ImplRoot.test.ts
│ │ │ ├── PCR0Manager.test.ts
│ │ │ ├── SelfUtils.test.ts
│ │ │ ├── formatter.test.ts
│ │ │ └── scopeGeneration.test.ts
│ │ ├── utils/
│ │ │ ├── constants.ts
│ │ │ ├── contractUtils.ts
│ │ │ ├── deploymentV2.ts
│ │ │ ├── example/
│ │ │ │ ├── balance-tree.ts
│ │ │ │ └── merkle-tree.ts
│ │ │ ├── formatter.ts
│ │ │ ├── generateProof.ts
│ │ │ ├── smt.json
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ └── v2/
│ │ ├── discloseAadhaar.test.ts
│ │ ├── discloseId.test.ts
│ │ ├── discloseKyc.test.ts
│ │ ├── disclosePassport.test.ts
│ │ ├── hubOther.test.ts
│ │ ├── ofacProofUpdate.test.ts
│ │ ├── ofacRollingWindow.test.ts
│ │ ├── ofacUpgradePath.test.ts
│ │ ├── registerAadhaar.test.ts
│ │ ├── registerId.test.ts
│ │ ├── registerKyc.test.ts
│ │ └── registerPassport.test.ts
│ └── tsconfig.json
├── contribute.md
├── docs/
│ ├── claude-statusline-setup.md
│ ├── coverage/
│ │ ├── app.json
│ │ └── sdk.json
│ ├── development-patterns.md
│ ├── maintenance/
│ │ ├── tech-debt-baseline.json
│ │ └── tech-debt-baseline.md
│ ├── refactor-restructure-utils.md
│ ├── reviews/
│ │ ├── 2026-03-23-euclid-settings-tunnel-audit.md
│ │ ├── PR-1901-review-findings.md
│ │ └── PR-1924-review-findings.md
│ ├── superpowers/
│ │ └── plans/
│ │ ├── 2026-03-22-settings-handover.md
│ │ ├── 2026-03-22-settings-screen-integration.md
│ │ └── 2026-04-21-passport-ocr-camera-permission.md
│ ├── templates/
│ │ └── pr-action-items-template.md
│ └── testing-guide.md
├── error-selectors.json
├── gitleaks-override.toml
├── knip.config.ts
├── new-common/
│ ├── .prettierrc
│ ├── package.json
│ ├── plans/
│ │ └── PLAN.md
│ ├── src/
│ │ ├── app/
│ │ │ ├── builder.ts
│ │ │ └── index.ts
│ │ ├── attestation/
│ │ │ ├── gcp.ts
│ │ │ └── index.ts
│ │ ├── blockchain/
│ │ │ ├── forbiddenCountries.ts
│ │ │ ├── formatCallData.ts
│ │ │ ├── index.ts
│ │ │ ├── ofac.ts
│ │ │ └── proving.ts
│ │ ├── certificates/
│ │ │ ├── csca.ts
│ │ │ ├── factory.ts
│ │ │ ├── index.ts
│ │ │ ├── parsing/
│ │ │ │ ├── bruteForceSignature.ts
│ │ │ │ ├── curves.ts
│ │ │ │ ├── elliptic.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── oids.ts
│ │ │ │ ├── parseCertificateSimple.ts
│ │ │ │ ├── parseDscCertificateData.ts
│ │ │ │ └── utils.ts
│ │ │ ├── pubkey.ts
│ │ │ ├── signature.ts
│ │ │ └── types.ts
│ │ ├── circuits/
│ │ │ ├── circuitName.ts
│ │ │ ├── generator.ts
│ │ │ ├── index.ts
│ │ │ ├── inputs/
│ │ │ │ ├── disclose-aadhaar.ts
│ │ │ │ ├── disclose-kyc.ts
│ │ │ │ ├── disclose.ts
│ │ │ │ ├── dsc.ts
│ │ │ │ ├── format.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── ofac.ts
│ │ │ │ ├── register-aadhaar.ts
│ │ │ │ ├── register-kyc.ts
│ │ │ │ └── register.ts
│ │ │ ├── outputs/
│ │ │ │ ├── format.ts
│ │ │ │ └── index.ts
│ │ │ ├── types.ts
│ │ │ └── userId.ts
│ │ ├── crypto/
│ │ │ ├── eddsa.ts
│ │ │ ├── encryption.ts
│ │ │ ├── hash/
│ │ │ │ ├── index.ts
│ │ │ │ ├── poseidon.ts
│ │ │ │ └── sha.ts
│ │ │ ├── identity.ts
│ │ │ ├── index.ts
│ │ │ ├── scope.ts
│ │ │ └── sha-pad.ts
│ │ ├── data/
│ │ │ ├── countries.ts
│ │ │ ├── error-selector-map.json
│ │ │ ├── index.ts
│ │ │ ├── mockCertificates.ts
│ │ │ ├── sampleDataHashes.ts
│ │ │ ├── serialized_csca_tree.json
│ │ │ ├── serialized_dsc_tree.json
│ │ │ └── skiPem.ts
│ │ ├── documents/
│ │ │ ├── aadhaar/
│ │ │ │ ├── adapter.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── qr.ts
│ │ │ │ └── utils.ts
│ │ │ ├── factory.ts
│ │ │ ├── index.ts
│ │ │ ├── interface.ts
│ │ │ ├── kyc/
│ │ │ │ ├── adapter.ts
│ │ │ │ ├── api.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ └── passport/
│ │ │ ├── adapter.ts
│ │ │ ├── bruteForcePassportSignature.ts
│ │ │ ├── commitment.ts
│ │ │ ├── core.ts
│ │ │ ├── format.ts
│ │ │ ├── index.ts
│ │ │ └── parsing.ts
│ │ ├── foundation/
│ │ │ ├── arrays.ts
│ │ │ ├── bytes.ts
│ │ │ ├── constants/
│ │ │ │ ├── circuit.ts
│ │ │ │ ├── countries.ts
│ │ │ │ ├── crypto.ts
│ │ │ │ ├── disclosure.ts
│ │ │ │ ├── identity.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── network.ts
│ │ │ ├── date.ts
│ │ │ ├── index.ts
│ │ │ └── types/
│ │ │ ├── app.ts
│ │ │ ├── attestation.ts
│ │ │ ├── certificate.ts
│ │ │ ├── circuit.ts
│ │ │ ├── document.ts
│ │ │ ├── environment.ts
│ │ │ └── index.ts
│ │ ├── index.ts
│ │ ├── testing/
│ │ │ ├── dg1.ts
│ │ │ ├── genMockAadhaarData.ts
│ │ │ ├── genMockIdDoc.ts
│ │ │ ├── genMockKycData.ts
│ │ │ ├── genMockPassportData.ts
│ │ │ ├── getMockDSC.ts
│ │ │ ├── index.ts
│ │ │ └── mockAadhaarCert.ts
│ │ └── trees/
│ │ ├── aadhaarLeafBuilder.ts
│ │ ├── certificate.ts
│ │ ├── index.ts
│ │ ├── kycLeafBuilder.ts
│ │ ├── leafBuilder.ts
│ │ ├── ofac.ts
│ │ ├── passportLeafBuilder.ts
│ │ └── proof.ts
│ ├── tsconfig.json
│ └── tsup.config.ts
├── noir/
│ ├── AGENTS.md
│ ├── Nargo.toml
│ ├── README.md
│ └── crates/
│ ├── dg1/
│ │ ├── Nargo.toml
│ │ ├── Prover.toml
│ │ ├── rsa-inputs.json
│ │ └── src/
│ │ ├── constants.nr
│ │ ├── dg1/
│ │ │ ├── dg1.nr
│ │ │ └── mod.nr
│ │ ├── disclose/
│ │ │ ├── country_not_in_list.nr
│ │ │ ├── disclose.nr
│ │ │ └── mod.nr
│ │ ├── eContent/
│ │ │ ├── hasher.nr
│ │ │ ├── mod.nr
│ │ │ └── utils.nr
│ │ ├── main.nr
│ │ ├── ofac/
│ │ │ ├── mod.nr
│ │ │ ├── ofac_name.nr
│ │ │ ├── ofac_name_dob.nr
│ │ │ └── ofac_passport_number.nr
│ │ ├── types.nr
│ │ └── utils/
│ │ ├── array.nr
│ │ ├── date/
│ │ │ ├── is_older_than.nr
│ │ │ └── mod.nr
│ │ ├── mod.nr
│ │ └── other/
│ │ ├── binary_merkle_tree.nr
│ │ ├── mod.nr
│ │ └── smt.nr
│ └── econtent/
│ ├── Nargo.toml
│ └── src/
│ └── main.nr
├── package.json
├── packages/
│ ├── kmp-minipay-sample/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ ├── composeApp/
│ │ │ ├── build.gradle.kts
│ │ │ └── src/
│ │ │ ├── androidMain/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin/
│ │ │ │ │ └── xyz/
│ │ │ │ │ └── self/
│ │ │ │ │ └── minipay/
│ │ │ │ │ ├── AppStorage.android.kt
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ ├── PlatformLaunch.android.kt
│ │ │ │ │ └── webview/
│ │ │ │ │ └── PlatformWebViewBridge.android.kt
│ │ │ │ └── res/
│ │ │ │ └── xml/
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ ├── commonMain/
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── minipay/
│ │ │ │ ├── App.kt
│ │ │ │ ├── AppStorage.kt
│ │ │ │ ├── MainViewModel.kt
│ │ │ │ ├── PlatformLaunch.kt
│ │ │ │ ├── screens/
│ │ │ │ │ ├── HomeScreen.kt
│ │ │ │ │ ├── ResultScreen.kt
│ │ │ │ │ └── WebViewBridgeScreen.kt
│ │ │ │ ├── theme/
│ │ │ │ │ └── Theme.kt
│ │ │ │ └── webview/
│ │ │ │ └── EthereumBridge.kt
│ │ │ └── iosMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── minipay/
│ │ │ ├── AppStorage.ios.kt
│ │ │ ├── MainViewController.kt
│ │ │ ├── PlatformLaunch.ios.kt
│ │ │ └── webview/
│ │ │ └── PlatformWebViewBridge.ios.kt
│ │ ├── gradle/
│ │ │ ├── libs.versions.toml
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── iosApp/
│ │ │ ├── iosApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ContentView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── iOSApp.swift
│ │ │ │ └── iosApp.entitlements
│ │ │ └── iosApp.xcodeproj/
│ │ │ └── project.pbxproj
│ │ └── settings.gradle.kts
│ ├── kmp-sdk/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── build.gradle.kts
│ │ ├── gradle/
│ │ │ ├── libs.versions.toml
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── package.json
│ │ ├── settings.gradle.kts
│ │ └── shared/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── androidMain/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ └── SelfSdk.android.kt
│ │ │ ├── bridge/
│ │ │ │ └── PlatformActuals.android.kt
│ │ │ ├── handlers/
│ │ │ │ ├── BiometricBridgeHandler.kt
│ │ │ │ ├── CameraMrzBridgeHandler.kt
│ │ │ │ ├── LifecycleBridgeHandler.kt
│ │ │ │ └── NfcBridgeHandler.kt
│ │ │ ├── providers/
│ │ │ │ ├── AndroidKeystoreCryptoProvider.kt
│ │ │ │ └── EncryptedSharedPreferencesProvider.kt
│ │ │ └── webview/
│ │ │ ├── AndroidWebViewHost.kt
│ │ │ └── SelfVerificationActivity.kt
│ │ ├── androidUnitTest/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ └── webview/
│ │ │ └── AndroidWebViewHostSecurityTest.kt
│ │ ├── commonMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ ├── QueryParamsBuilder.kt
│ │ │ │ ├── SdkConstants.kt
│ │ │ │ ├── SelfSdk.kt
│ │ │ │ ├── SelfSdkCallback.kt
│ │ │ │ ├── SelfSdkConfig.kt
│ │ │ │ ├── VerificationRequest.kt
│ │ │ │ └── VerificationResultJson.kt
│ │ │ ├── bridge/
│ │ │ │ ├── BridgeHandler.kt
│ │ │ │ ├── BridgeMessage.kt
│ │ │ │ └── MessageRouter.kt
│ │ │ ├── handlers/
│ │ │ │ ├── CryptoBridgeHandler.kt
│ │ │ │ ├── LifecycleSetResultOutcome.kt
│ │ │ │ ├── NfcApduPolicy.kt
│ │ │ │ └── SecureStorageBridgeHandler.kt
│ │ │ ├── models/
│ │ │ │ ├── MrzDetectionState.kt
│ │ │ │ ├── MrzKeyUtils.kt
│ │ │ │ ├── MrzParser.kt
│ │ │ │ ├── NfcScanParams.kt
│ │ │ │ ├── NfcScanProgress.kt
│ │ │ │ ├── NfcScanState.kt
│ │ │ │ └── PassportScanResult.kt
│ │ │ └── providers/
│ │ │ ├── CryptoProvider.kt
│ │ │ ├── SdkProviderRegistry.kt
│ │ │ └── SecureStorageProvider.kt
│ │ ├── commonTest/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ ├── QueryParamsBuilderTest.kt
│ │ │ │ └── VerificationResultJsonTest.kt
│ │ │ ├── bridge/
│ │ │ │ ├── BridgeMessageTest.kt
│ │ │ │ └── MessageRouterTest.kt
│ │ │ ├── handlers/
│ │ │ │ ├── LifecycleBridgeHandlerTest.kt
│ │ │ │ └── NfcApduPolicyTest.kt
│ │ │ ├── models/
│ │ │ │ ├── ModelSerializationTest.kt
│ │ │ │ ├── MrzKeyUtilsTest.kt
│ │ │ │ ├── MrzParserTest.kt
│ │ │ │ └── NfcScanStateTest.kt
│ │ │ └── testutil/
│ │ │ ├── FakeBridgeHandler.kt
│ │ │ └── TestData.kt
│ │ ├── iosMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ └── SelfSdk.ios.kt
│ │ │ ├── bridge/
│ │ │ │ └── PlatformActuals.ios.kt
│ │ │ ├── handlers/
│ │ │ │ ├── AnalyticsBridgeHandler.kt
│ │ │ │ ├── BiometricBridgeHandler.kt
│ │ │ │ ├── CameraMrzBridgeHandler.kt
│ │ │ │ ├── DocumentsBridgeHandler.kt
│ │ │ │ ├── HapticBridgeHandler.kt
│ │ │ │ ├── LifecycleBridgeHandler.kt
│ │ │ │ └── NfcBridgeHandler.kt
│ │ │ ├── providers/
│ │ │ │ ├── BiometricProvider.kt
│ │ │ │ ├── CameraMrzProvider.kt
│ │ │ │ ├── DocumentsProvider.kt
│ │ │ │ ├── HapticProvider.kt
│ │ │ │ ├── IosProviderRegistry.kt
│ │ │ │ ├── NfcProvider.kt
│ │ │ │ └── WebViewProvider.kt
│ │ │ └── webview/
│ │ │ └── IosWebViewHost.kt
│ │ ├── jvmMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ └── SelfSdk.jvm.kt
│ │ │ └── bridge/
│ │ │ └── PlatformActuals.jvm.kt
│ │ └── nativeInterop/
│ │ └── cinterop/
│ │ ├── CoreNFC.def
│ │ ├── LocalAuthentication.def
│ │ ├── Security.def
│ │ ├── UIKit.def
│ │ └── Vision.def
│ ├── kmp-sdk-test-app/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .swiftlint.yml
│ │ ├── README.md
│ │ ├── build.gradle.kts
│ │ ├── composeApp/
│ │ │ ├── build.gradle.kts
│ │ │ └── src/
│ │ │ ├── androidMain/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── testapp/
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── SelfTestApplication.kt
│ │ │ │ ├── components/
│ │ │ │ │ └── CameraPreviewComposable.kt
│ │ │ │ ├── screens/
│ │ │ │ │ ├── DevServerUrl.android.kt
│ │ │ │ │ ├── MrzScanScreen.android.kt
│ │ │ │ │ ├── NfcScanScreen.android.kt
│ │ │ │ │ └── PassportDetailsScreen.android.kt
│ │ │ │ ├── storage/
│ │ │ │ │ └── PassportDataStore.kt
│ │ │ │ └── utils/
│ │ │ │ └── Logger.android.kt
│ │ │ ├── commonMain/
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── testapp/
│ │ │ │ ├── App.kt
│ │ │ │ ├── components/
│ │ │ │ │ ├── MrzViewfinder.kt
│ │ │ │ │ └── NfcProgressIndicator.kt
│ │ │ │ ├── models/
│ │ │ │ │ ├── PassportData.kt
│ │ │ │ │ └── VerificationFlowState.kt
│ │ │ │ ├── screens/
│ │ │ │ │ ├── DomainSmokeScreen.kt
│ │ │ │ │ ├── MrzConfirmationScreen.kt
│ │ │ │ │ ├── PassportDetailsScreen.kt
│ │ │ │ │ ├── ResultScreen.kt
│ │ │ │ │ └── SdkLaunchScreen.kt
│ │ │ │ ├── theme/
│ │ │ │ │ └── Theme.kt
│ │ │ │ ├── utils/
│ │ │ │ │ └── Logger.kt
│ │ │ │ └── viewmodels/
│ │ │ │ └── VerificationViewModel.kt
│ │ │ ├── commonTest/
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── testapp/
│ │ │ │ ├── models/
│ │ │ │ │ ├── PassportDataTest.kt
│ │ │ │ │ └── VerificationFlowStateTest.kt
│ │ │ │ ├── testutil/
│ │ │ │ │ └── TestData.kt
│ │ │ │ └── viewmodels/
│ │ │ │ └── VerificationViewModelTest.kt
│ │ │ ├── debug/
│ │ │ │ └── AndroidManifest.xml
│ │ │ └── iosMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── testapp/
│ │ │ ├── MainViewController.kt
│ │ │ ├── screens/
│ │ │ │ ├── DevServerUrl.ios.kt
│ │ │ │ ├── MrzScanScreen.ios.kt
│ │ │ │ ├── NfcScanScreen.ios.kt
│ │ │ │ └── PassportDetailsScreen.ios.kt
│ │ │ └── utils/
│ │ │ ├── ExceptionHandler.ios.kt
│ │ │ └── Logger.ios.kt
│ │ ├── gradle/
│ │ │ ├── libs.versions.toml
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── iosApp/
│ │ │ ├── .swiftlint.yml
│ │ │ ├── Podfile
│ │ │ ├── iosApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ContentView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── iOSApp.swift
│ │ │ │ └── iosApp.entitlements
│ │ │ ├── iosApp.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── iosApp.xcscheme
│ │ │ └── iosApp.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── run-android.sh
│ │ │ └── run-ios.sh
│ │ └── settings.gradle.kts
│ ├── mobile-sdk-alpha/
│ │ ├── .eslintignore
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── AGENTS.md
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── build.gradle
│ │ │ ├── build.gradle.source
│ │ │ ├── gradle.properties
│ │ │ ├── mobile-sdk-alpha-bom.gradle
│ │ │ └── proguard-rules.pro
│ │ ├── assets/
│ │ │ └── fonts/
│ │ │ ├── Advercase-Regular.otf
│ │ │ ├── DINOT-Bold.otf
│ │ │ ├── DINOT-Medium.otf
│ │ │ └── IBMPlexMono-Regular.otf
│ │ ├── docs/
│ │ │ └── DOCSTRING_STYLE_GUIDE.md
│ │ ├── ios/
│ │ │ ├── Frameworks/
│ │ │ │ ├── NFCPassportReader.xcframework/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ios-arm64/
│ │ │ │ │ └── NFCPassportReader.framework/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── NFCPassportReader.swiftmodule/
│ │ │ │ │ │ ├── arm64-apple-ios.abi.json
│ │ │ │ │ │ ├── arm64-apple-ios.private.swiftinterface
│ │ │ │ │ │ ├── arm64-apple-ios.swiftdoc
│ │ │ │ │ │ └── arm64-apple-ios.swiftinterface
│ │ │ │ │ ├── NFCPassportReader
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── OpenSSL.xcframework/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── _CodeSignature/
│ │ │ │ │ ├── CodeDirectory
│ │ │ │ │ ├── CodeRequirements
│ │ │ │ │ ├── CodeRequirements-1
│ │ │ │ │ ├── CodeResources
│ │ │ │ │ └── CodeSignature
│ │ │ │ ├── ios-arm64/
│ │ │ │ │ └── OpenSSL.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ ├── ios-arm64_x86_64-maccatalyst/
│ │ │ │ │ └── OpenSSL.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ └── Versions/
│ │ │ │ │ ├── A/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ │ ├── Modules/
│ │ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ │ ├── OpenSSL
│ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ │ └── CodeResources
│ │ │ │ │ └── Current/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ ├── ios-arm64_x86_64-simulator/
│ │ │ │ │ └── OpenSSL.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── macos-arm64_x86_64/
│ │ │ │ └── OpenSSL.framework/
│ │ │ │ ├── Headers/
│ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ ├── aes.h
│ │ │ │ │ ├── asn1.h
│ │ │ │ │ ├── asn1err.h
│ │ │ │ │ ├── asn1t.h
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ ├── bio.h
│ │ │ │ │ ├── bioerr.h
│ │ │ │ │ ├── blowfish.h
│ │ │ │ │ ├── bn.h
│ │ │ │ │ ├── bnerr.h
│ │ │ │ │ ├── buffer.h
│ │ │ │ │ ├── buffererr.h
│ │ │ │ │ ├── camellia.h
│ │ │ │ │ ├── cast.h
│ │ │ │ │ ├── cmac.h
│ │ │ │ │ ├── cms.h
│ │ │ │ │ ├── cmserr.h
│ │ │ │ │ ├── comp.h
│ │ │ │ │ ├── comperr.h
│ │ │ │ │ ├── conf.h
│ │ │ │ │ ├── conf_api.h
│ │ │ │ │ ├── conferr.h
│ │ │ │ │ ├── crypto.h
│ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ ├── ct.h
│ │ │ │ │ ├── cterr.h
│ │ │ │ │ ├── des.h
│ │ │ │ │ ├── dh.h
│ │ │ │ │ ├── dherr.h
│ │ │ │ │ ├── dsa.h
│ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ ├── dtls1.h
│ │ │ │ │ ├── e_os2.h
│ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ ├── ec.h
│ │ │ │ │ ├── ecdh.h
│ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ ├── ecerr.h
│ │ │ │ │ ├── engine.h
│ │ │ │ │ ├── engineerr.h
│ │ │ │ │ ├── err.h
│ │ │ │ │ ├── evp.h
│ │ │ │ │ ├── evperr.h
│ │ │ │ │ ├── hmac.h
│ │ │ │ │ ├── idea.h
│ │ │ │ │ ├── kdf.h
│ │ │ │ │ ├── kdferr.h
│ │ │ │ │ ├── lhash.h
│ │ │ │ │ ├── md2.h
│ │ │ │ │ ├── md4.h
│ │ │ │ │ ├── md5.h
│ │ │ │ │ ├── mdc2.h
│ │ │ │ │ ├── modes.h
│ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ ├── objects.h
│ │ │ │ │ ├── objectserr.h
│ │ │ │ │ ├── ocsp.h
│ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ ├── opensslv.h
│ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ ├── pem.h
│ │ │ │ │ ├── pem2.h
│ │ │ │ │ ├── pemerr.h
│ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ ├── rand.h
│ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ ├── randerr.h
│ │ │ │ │ ├── rc2.h
│ │ │ │ │ ├── rc4.h
│ │ │ │ │ ├── rc5.h
│ │ │ │ │ ├── ripemd.h
│ │ │ │ │ ├── rsa.h
│ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ ├── safestack.h
│ │ │ │ │ ├── seed.h
│ │ │ │ │ ├── sha.h
│ │ │ │ │ ├── shim.h
│ │ │ │ │ ├── srp.h
│ │ │ │ │ ├── srtp.h
│ │ │ │ │ ├── ssl.h
│ │ │ │ │ ├── ssl2.h
│ │ │ │ │ ├── ssl3.h
│ │ │ │ │ ├── sslerr.h
│ │ │ │ │ ├── stack.h
│ │ │ │ │ ├── store.h
│ │ │ │ │ ├── storeerr.h
│ │ │ │ │ ├── symhacks.h
│ │ │ │ │ ├── tls1.h
│ │ │ │ │ ├── ts.h
│ │ │ │ │ ├── tserr.h
│ │ │ │ │ ├── txt_db.h
│ │ │ │ │ ├── ui.h
│ │ │ │ │ ├── uierr.h
│ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ ├── x509.h
│ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ ├── x509err.h
│ │ │ │ │ ├── x509v3.h
│ │ │ │ │ └── x509v3err.h
│ │ │ │ ├── Modules/
│ │ │ │ │ └── module.modulemap
│ │ │ │ ├── OpenSSL
│ │ │ │ ├── Resources/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ └── Versions/
│ │ │ │ ├── A/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── Current/
│ │ │ │ ├── Headers/
│ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ ├── aes.h
│ │ │ │ │ ├── asn1.h
│ │ │ │ │ ├── asn1err.h
│ │ │ │ │ ├── asn1t.h
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ ├── bio.h
│ │ │ │ │ ├── bioerr.h
│ │ │ │ │ ├── blowfish.h
│ │ │ │ │ ├── bn.h
│ │ │ │ │ ├── bnerr.h
│ │ │ │ │ ├── buffer.h
│ │ │ │ │ ├── buffererr.h
│ │ │ │ │ ├── camellia.h
│ │ │ │ │ ├── cast.h
│ │ │ │ │ ├── cmac.h
│ │ │ │ │ ├── cms.h
│ │ │ │ │ ├── cmserr.h
│ │ │ │ │ ├── comp.h
│ │ │ │ │ ├── comperr.h
│ │ │ │ │ ├── conf.h
│ │ │ │ │ ├── conf_api.h
│ │ │ │ │ ├── conferr.h
│ │ │ │ │ ├── crypto.h
│ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ ├── ct.h
│ │ │ │ │ ├── cterr.h
│ │ │ │ │ ├── des.h
│ │ │ │ │ ├── dh.h
│ │ │ │ │ ├── dherr.h
│ │ │ │ │ ├── dsa.h
│ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ ├── dtls1.h
│ │ │ │ │ ├── e_os2.h
│ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ ├── ec.h
│ │ │ │ │ ├── ecdh.h
│ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ ├── ecerr.h
│ │ │ │ │ ├── engine.h
│ │ │ │ │ ├── engineerr.h
│ │ │ │ │ ├── err.h
│ │ │ │ │ ├── evp.h
│ │ │ │ │ ├── evperr.h
│ │ │ │ │ ├── hmac.h
│ │ │ │ │ ├── idea.h
│ │ │ │ │ ├── kdf.h
│ │ │ │ │ ├── kdferr.h
│ │ │ │ │ ├── lhash.h
│ │ │ │ │ ├── md2.h
│ │ │ │ │ ├── md4.h
│ │ │ │ │ ├── md5.h
│ │ │ │ │ ├── mdc2.h
│ │ │ │ │ ├── modes.h
│ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ ├── objects.h
│ │ │ │ │ ├── objectserr.h
│ │ │ │ │ ├── ocsp.h
│ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ ├── opensslv.h
│ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ ├── pem.h
│ │ │ │ │ ├── pem2.h
│ │ │ │ │ ├── pemerr.h
│ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ ├── rand.h
│ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ ├── randerr.h
│ │ │ │ │ ├── rc2.h
│ │ │ │ │ ├── rc4.h
│ │ │ │ │ ├── rc5.h
│ │ │ │ │ ├── ripemd.h
│ │ │ │ │ ├── rsa.h
│ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ ├── safestack.h
│ │ │ │ │ ├── seed.h
│ │ │ │ │ ├── sha.h
│ │ │ │ │ ├── shim.h
│ │ │ │ │ ├── srp.h
│ │ │ │ │ ├── srtp.h
│ │ │ │ │ ├── ssl.h
│ │ │ │ │ ├── ssl2.h
│ │ │ │ │ ├── ssl3.h
│ │ │ │ │ ├── sslerr.h
│ │ │ │ │ ├── stack.h
│ │ │ │ │ ├── store.h
│ │ │ │ │ ├── storeerr.h
│ │ │ │ │ ├── symhacks.h
│ │ │ │ │ ├── tls1.h
│ │ │ │ │ ├── ts.h
│ │ │ │ │ ├── tserr.h
│ │ │ │ │ ├── txt_db.h
│ │ │ │ │ ├── ui.h
│ │ │ │ │ ├── uierr.h
│ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ ├── x509.h
│ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ ├── x509err.h
│ │ │ │ │ ├── x509v3.h
│ │ │ │ │ └── x509v3err.h
│ │ │ │ ├── Modules/
│ │ │ │ │ └── module.modulemap
│ │ │ │ ├── OpenSSL
│ │ │ │ ├── Resources/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ └── _CodeSignature/
│ │ │ │ └── CodeResources
│ │ │ └── SelfSDK/
│ │ │ ├── MrzOcrCorrection.swift
│ │ │ ├── MrzResultMapper.swift
│ │ │ ├── MrzScanEngine.swift
│ │ │ ├── NFCPassportReader 2.xcframework/
│ │ │ │ ├── Info.plist
│ │ │ │ └── ios-arm64/
│ │ │ │ └── NFCPassportReader.framework/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Modules/
│ │ │ │ │ └── NFCPassportReader.swiftmodule/
│ │ │ │ │ ├── arm64-apple-ios.abi.json
│ │ │ │ │ ├── arm64-apple-ios.private.swiftinterface
│ │ │ │ │ ├── arm64-apple-ios.swiftdoc
│ │ │ │ │ └── arm64-apple-ios.swiftinterface
│ │ │ │ ├── NFCPassportReader
│ │ │ │ └── _CodeSignature/
│ │ │ │ └── CodeResources
│ │ │ ├── PassportReader.m
│ │ │ ├── PassportReader.swift
│ │ │ ├── PassportReaderCore.swift
│ │ │ ├── SelfCameraView.swift
│ │ │ ├── SelfLiveMRZScannerView.swift
│ │ │ ├── SelfMRZScannerModule.m
│ │ │ ├── SelfMRZScannerModule.swift
│ │ │ ├── SelfMRZScannerViewManager.m
│ │ │ ├── SelfMRZScannerViewManager.swift
│ │ │ ├── SelfSDK/
│ │ │ │ ├── SelfSDK.docc/
│ │ │ │ │ └── SelfSDK.md
│ │ │ │ ├── SelfSDK.m
│ │ │ │ └── SelfSDK.swift
│ │ │ └── SelfSDK.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── mobile-sdk-alpha.podspec
│ │ ├── package.json
│ │ ├── react-native.config.cjs
│ │ ├── scripts/
│ │ │ ├── build-android.sh
│ │ │ ├── build-ios.sh
│ │ │ ├── copy-assets.mjs
│ │ │ ├── postBuild.mjs
│ │ │ ├── report-exports.mjs
│ │ │ ├── setup-native-source.cjs
│ │ │ ├── shimConfigs.js
│ │ │ ├── validate-exports.mjs
│ │ │ └── verify-conditions.mjs
│ │ ├── src/
│ │ │ ├── adapters/
│ │ │ │ ├── browser/
│ │ │ │ │ ├── analytics.ts
│ │ │ │ │ ├── crypto.ts
│ │ │ │ │ ├── documents.ts
│ │ │ │ │ ├── haptic.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── network.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── react-native/
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── crypto.ts
│ │ │ │ │ ├── documents.ts
│ │ │ │ │ ├── factory.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── network.ts
│ │ │ │ │ └── nfc-scanner.ts
│ │ │ │ └── web/
│ │ │ │ └── shims.ts
│ │ │ ├── analytics/
│ │ │ │ └── onboardingFunnel.ts
│ │ │ ├── animations/
│ │ │ │ ├── loading/
│ │ │ │ │ ├── fail.json
│ │ │ │ │ ├── misc.json
│ │ │ │ │ ├── prove.json
│ │ │ │ │ ├── success.json
│ │ │ │ │ └── youWin.json
│ │ │ │ ├── passport_scan.json
│ │ │ │ └── passport_verify.json
│ │ │ ├── bridge/
│ │ │ │ ├── nativeEvents.native.ts
│ │ │ │ └── nativeEvents.ts
│ │ │ ├── browser.ts
│ │ │ ├── client.ts
│ │ │ ├── components/
│ │ │ │ ├── ButtonsContainer.tsx
│ │ │ │ ├── DelayedLottieView.tsx
│ │ │ │ ├── DelayedLottieView.web.tsx
│ │ │ │ ├── MRZScannerView.tsx
│ │ │ │ ├── RCTFragment.tsx
│ │ │ │ ├── TextsContainer.tsx
│ │ │ │ ├── buttons/
│ │ │ │ │ ├── AbstractButton.tsx
│ │ │ │ │ ├── HeldPrimaryButtonProveScreen.tsx
│ │ │ │ │ ├── PrimaryButton.tsx
│ │ │ │ │ ├── PrimaryButtonLongHold.shared.ts
│ │ │ │ │ ├── PrimaryButtonLongHold.tsx
│ │ │ │ │ ├── PrimaryButtonLongHold.web.tsx
│ │ │ │ │ ├── SecondaryButton.tsx
│ │ │ │ │ └── pressedStyle.tsx
│ │ │ │ ├── flag/
│ │ │ │ │ └── RoundFlag.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── layout/
│ │ │ │ │ ├── Button.tsx
│ │ │ │ │ ├── Text.tsx
│ │ │ │ │ ├── View.tsx
│ │ │ │ │ ├── XStack.tsx
│ │ │ │ │ └── YStack.tsx
│ │ │ │ ├── screens/
│ │ │ │ │ ├── NFCScannerScreen.tsx
│ │ │ │ │ ├── PassportCameraScreen.tsx
│ │ │ │ │ └── QRCodeScreen.tsx
│ │ │ │ └── typography/
│ │ │ │ ├── Additional.tsx
│ │ │ │ ├── BodyText.tsx
│ │ │ │ ├── Caption.tsx
│ │ │ │ ├── Caution.tsx
│ │ │ │ ├── Description.tsx
│ │ │ │ ├── DescriptionTitle.tsx
│ │ │ │ ├── SubHeader.tsx
│ │ │ │ ├── Title.tsx
│ │ │ │ └── styles.ts
│ │ │ ├── config/
│ │ │ │ ├── defaults.ts
│ │ │ │ ├── features.ts
│ │ │ │ └── merge.ts
│ │ │ ├── constants/
│ │ │ │ ├── analytics.ts
│ │ │ │ ├── colors.ts
│ │ │ │ ├── fonts.ts
│ │ │ │ ├── images.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── layout.ts
│ │ │ ├── context.tsx
│ │ │ ├── data/
│ │ │ │ └── country-document-types.json
│ │ │ ├── documents/
│ │ │ │ ├── useCountries.tsx
│ │ │ │ ├── utils.ts
│ │ │ │ └── validation.ts
│ │ │ ├── errors/
│ │ │ │ ├── InitError.ts
│ │ │ │ ├── LivenessError.ts
│ │ │ │ ├── MrzParseError.ts
│ │ │ │ ├── NfcParseError.ts
│ │ │ │ ├── SdkError.ts
│ │ │ │ └── index.ts
│ │ │ ├── flows/
│ │ │ │ ├── about.md
│ │ │ │ ├── disclosing/
│ │ │ │ │ ├── await-verification.ts
│ │ │ │ │ ├── confirm-selection.ts
│ │ │ │ │ └── scan-qr-code.ts
│ │ │ │ └── onboarding/
│ │ │ │ ├── confirm-identification.tsx
│ │ │ │ ├── country-picker-screen.tsx
│ │ │ │ ├── document-camera-screen.tsx
│ │ │ │ ├── document-nfc-screen.tsx
│ │ │ │ ├── id-selection-screen.tsx
│ │ │ │ ├── import-aadhaar.ts
│ │ │ │ ├── logo-confirmation-screen.tsx
│ │ │ │ └── read-mrz.ts
│ │ │ ├── haptic/
│ │ │ │ ├── index.ts
│ │ │ │ ├── shared.ts
│ │ │ │ ├── trigger.ts
│ │ │ │ └── trigger.web.ts
│ │ │ ├── hooks/
│ │ │ │ ├── index.ts
│ │ │ │ └── useSafeBottomPadding.ts
│ │ │ ├── index.ts
│ │ │ ├── layouts/
│ │ │ │ └── ExpandableBottomLayout.tsx
│ │ │ ├── mock/
│ │ │ │ └── generator.ts
│ │ │ ├── mrz/
│ │ │ │ └── index.ts
│ │ │ ├── nfc/
│ │ │ │ └── index.ts
│ │ │ ├── processing/
│ │ │ │ ├── mrz.ts
│ │ │ │ └── nfc.ts
│ │ │ ├── proving/
│ │ │ │ ├── internal/
│ │ │ │ │ ├── logging.ts
│ │ │ │ │ └── statusHandlers.ts
│ │ │ │ ├── provingMachine.ts
│ │ │ │ └── recoveryValidation.ts
│ │ │ ├── stores/
│ │ │ │ ├── index.ts
│ │ │ │ ├── mrzStore.tsx
│ │ │ │ ├── protocolStore.ts
│ │ │ │ └── selfAppStore.tsx
│ │ │ ├── types/
│ │ │ │ ├── base.ts
│ │ │ │ ├── events.ts
│ │ │ │ ├── png.d.ts
│ │ │ │ ├── public.ts
│ │ │ │ ├── svg.d.ts
│ │ │ │ └── ui.ts
│ │ │ ├── utils/
│ │ │ │ ├── styleUtils.ts
│ │ │ │ └── utils.ts
│ │ │ └── validation/
│ │ │ └── document.ts
│ │ ├── tests/
│ │ │ ├── adapters/
│ │ │ │ ├── browser/
│ │ │ │ │ ├── analytics.test.ts
│ │ │ │ │ ├── crypto.test.ts
│ │ │ │ │ ├── documents.test.ts
│ │ │ │ │ └── haptic.test.ts
│ │ │ │ └── reactNative/
│ │ │ │ └── nfcScanner.test.ts
│ │ │ ├── analytics/
│ │ │ │ └── onboardingFunnel.test.ts
│ │ │ ├── bridge/
│ │ │ │ └── nativeEvents.test.ts
│ │ │ ├── client.test.ts
│ │ │ ├── clientMrz.test.ts
│ │ │ ├── components/
│ │ │ │ └── buttons/
│ │ │ │ └── AbstractButton.test.tsx
│ │ │ ├── config.test.ts
│ │ │ ├── data/
│ │ │ │ └── country-data-sync.integration.test.ts
│ │ │ ├── documents/
│ │ │ │ ├── utils.test.ts
│ │ │ │ └── validation.test.ts
│ │ │ ├── errors.test.ts
│ │ │ ├── flows/
│ │ │ │ └── onboarding/
│ │ │ │ └── read-mrz.test.ts
│ │ │ ├── mock/
│ │ │ │ └── generator.test.ts
│ │ │ ├── processing/
│ │ │ │ ├── mrz.test.ts
│ │ │ │ └── nfc.test.ts
│ │ │ ├── provider.test.tsx
│ │ │ ├── proving/
│ │ │ │ ├── actorMock.ts
│ │ │ │ ├── internal/
│ │ │ │ │ ├── payloadGenerator.test.ts
│ │ │ │ │ ├── statusHandlers.test.ts
│ │ │ │ │ ├── statusListener.test.ts
│ │ │ │ │ ├── websocketHandlers.test.ts
│ │ │ │ │ └── websocketUrlResolver.test.ts
│ │ │ │ ├── provingMachine.disclose.stateless.test.ts
│ │ │ │ ├── provingMachine.documentProcessor.test.ts
│ │ │ │ ├── provingMachine.generatePayload.test.ts
│ │ │ │ ├── provingMachine.integration.test.ts
│ │ │ │ ├── provingMachine.startFetchingData.test.ts
│ │ │ │ ├── provingMachine.test.ts
│ │ │ │ └── recoveryValidation.test.ts
│ │ │ ├── setup.ts
│ │ │ ├── stores/
│ │ │ │ └── protocolStore.test.ts
│ │ │ ├── utils/
│ │ │ │ ├── sanitizeErrorMessage.test.ts
│ │ │ │ └── testHelpers.ts
│ │ │ ├── validation/
│ │ │ │ └── document.test.ts
│ │ │ └── webShim.test.ts
│ │ ├── tsconfig.cjs.json
│ │ ├── tsconfig.eslint.json
│ │ ├── tsconfig.json
│ │ ├── tsup.config.ts
│ │ └── vitest.config.ts
│ ├── mobile-sdk-demo/
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── App.tsx
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── build.gradle
│ │ │ │ ├── debug.keystore
│ │ │ │ ├── proguard-rules.pro
│ │ │ │ └── src/
│ │ │ │ ├── debug/
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── selfxyz/
│ │ │ │ │ └── demoapp/
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ └── MainApplication.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── rn_edit_text_material.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ ├── libs.versions.toml
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ └── settings.gradle
│ │ ├── app.json
│ │ ├── babel.config.cjs
│ │ ├── index.js
│ │ ├── ios/
│ │ │ ├── .xcode.env
│ │ │ ├── Podfile
│ │ │ ├── SelfDemoApp/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info-Debug.plist
│ │ │ │ ├── Info.plist
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ └── SelfDemoApp.entitlements
│ │ │ ├── SelfDemoApp.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── SelfDemoApp.xcscheme
│ │ │ │ └── TempProject.xcscheme
│ │ │ ├── SelfDemoApp.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── scripts/
│ │ │ └── pod-install-with-cache-fix.sh
│ │ ├── metro.config.cjs
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── bundle-analyze-ci.cjs
│ │ │ └── e2e-android-ci.sh
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── AlgorithmCountryFields.tsx
│ │ │ │ ├── DocumentScanResultCard.tsx
│ │ │ │ ├── LogsPanel.tsx
│ │ │ │ ├── MenuButton.tsx
│ │ │ │ ├── PickerField.tsx
│ │ │ │ ├── PlaceholderScreen.tsx
│ │ │ │ ├── SafeAreaScrollView.tsx
│ │ │ │ ├── ScreenLayout.tsx
│ │ │ │ ├── SimplePicker.tsx
│ │ │ │ └── StandardHeader.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useDocuments.ts
│ │ │ │ └── useRegistration.ts
│ │ │ ├── lib/
│ │ │ │ └── catalog.ts
│ │ │ ├── navigation/
│ │ │ │ └── NavigationProvider.tsx
│ │ │ ├── polyfills/
│ │ │ │ └── cryptoPolyfill.js
│ │ │ ├── providers/
│ │ │ │ └── SelfClientProvider.tsx
│ │ │ ├── screens/
│ │ │ │ ├── CountrySelection.tsx
│ │ │ │ ├── DocumentCamera.tsx
│ │ │ │ ├── DocumentNFCScan.tsx
│ │ │ │ ├── DocumentScanSuccess.tsx
│ │ │ │ ├── DocumentsList.tsx
│ │ │ │ ├── GenerateMock.tsx
│ │ │ │ ├── HomeScreen.tsx
│ │ │ │ ├── IDSelection.tsx
│ │ │ │ ├── ProofHistory.tsx
│ │ │ │ ├── QRCodeViewFinder.tsx
│ │ │ │ ├── RegisterDocument.tsx
│ │ │ │ └── index.ts
│ │ │ └── utils/
│ │ │ ├── camera.ts
│ │ │ ├── document.ts
│ │ │ ├── documentStore.ts
│ │ │ ├── ethers.ts
│ │ │ └── secureStorage.ts
│ │ ├── tests/
│ │ │ ├── App.test.tsx
│ │ │ ├── __mocks__/
│ │ │ │ └── @selfxyz/
│ │ │ │ └── mobile-sdk-alpha/
│ │ │ │ └── index.ts
│ │ │ ├── components/
│ │ │ │ ├── MenuButton.test.tsx
│ │ │ │ └── ScreenLayout.test.tsx
│ │ │ ├── cryptoPolyfills.test.ts
│ │ │ ├── documentStore.test.ts
│ │ │ ├── e2e/
│ │ │ │ ├── launch.android.flow.yaml
│ │ │ │ └── launch.ios.flow.yaml
│ │ │ ├── lib/
│ │ │ │ └── catalog.test.ts
│ │ │ ├── mocks/
│ │ │ │ ├── mobile-sdk-alpha.ts
│ │ │ │ ├── react-native.ts
│ │ │ │ └── sdk.ts
│ │ │ ├── screens/
│ │ │ │ ├── DocumentCamera.test.tsx
│ │ │ │ ├── DocumentsList.test.tsx
│ │ │ │ ├── GenerateMock.test.tsx
│ │ │ │ ├── HomeScreen.test.tsx
│ │ │ │ ├── ProofHistory.test.tsx
│ │ │ │ ├── QRCodeViewFinder.test.tsx
│ │ │ │ ├── RegisterDocument.test.tsx
│ │ │ │ ├── documentCamera.test.ts
│ │ │ │ └── index.test.ts
│ │ │ ├── secureStorage.test.ts
│ │ │ ├── setup.ts
│ │ │ └── utils/
│ │ │ └── document.test.ts
│ │ ├── tsconfig.json
│ │ ├── types/
│ │ │ ├── reactNativePickerPicker.d.ts
│ │ │ └── svg.d.ts
│ │ └── vitest.config.ts
│ ├── native-shell-android/
│ │ ├── build.gradle.kts
│ │ ├── consumer-rules.pro
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── proguard-rules.pro
│ │ ├── settings.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ ├── SecureStorageProvider.kt
│ │ │ │ ├── SelfSdk.kt
│ │ │ │ ├── SelfSdkConfig.kt
│ │ │ │ └── SelfSdkLaunchConfig.kt
│ │ │ ├── bridge/
│ │ │ │ ├── BridgeHandler.kt
│ │ │ │ ├── BridgeModels.kt
│ │ │ │ └── MessageRouter.kt
│ │ │ ├── handlers/
│ │ │ │ ├── CryptoHandler.kt
│ │ │ │ ├── LifecycleHandler.kt
│ │ │ │ └── SecureStorageHandler.kt
│ │ │ └── webview/
│ │ │ ├── AndroidWebViewHost.kt
│ │ │ ├── RemoteNavigationPolicy.kt
│ │ │ └── SelfVerificationActivity.kt
│ │ └── test/
│ │ └── kotlin/
│ │ └── xyz/
│ │ └── self/
│ │ └── sdk/
│ │ ├── api/
│ │ │ ├── SelfSdkConfigTest.kt
│ │ │ ├── SelfSdkHandleResultTest.kt
│ │ │ └── SelfSdkLaunchTest.kt
│ │ ├── bridge/
│ │ │ ├── BridgeModelsTest.kt
│ │ │ ├── MessageRouterEscapeTest.kt
│ │ │ └── MessageRouterTest.kt
│ │ ├── handlers/
│ │ │ ├── CryptoHandlerTest.kt
│ │ │ ├── LifecycleHandlerTest.kt
│ │ │ ├── LifecycleResultEnvelopeTest.kt
│ │ │ ├── LifecycleResultGateTest.kt
│ │ │ └── SecureStorageHandlerTest.kt
│ │ └── webview/
│ │ ├── AndroidWebViewHostSecurityTest.kt
│ │ └── RemoteNavigationPolicyTest.kt
│ ├── native-shell-ios/
│ │ ├── .swiftlint.yml
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── SelfNativeShell/
│ │ │ ├── API/
│ │ │ │ ├── SecureStorageProvider.swift
│ │ │ │ ├── SelfSdk.swift
│ │ │ │ └── SelfSdkConfig.swift
│ │ │ ├── Bridge/
│ │ │ │ ├── BridgeHandler.swift
│ │ │ │ ├── BridgeModels.swift
│ │ │ │ └── MessageRouter.swift
│ │ │ ├── Handlers/
│ │ │ │ ├── CryptoHandler.swift
│ │ │ │ ├── LifecycleHandler.swift
│ │ │ │ └── SecureStorageHandler.swift
│ │ │ └── WebView/
│ │ │ ├── RemoteNavigationPolicy.swift
│ │ │ └── SelfWebViewHost.swift
│ │ └── Tests/
│ │ └── SelfNativeShellTests/
│ │ ├── BridgeModelsTests.swift
│ │ ├── CryptoHandlerTests.swift
│ │ ├── LifecycleHandlerRaceTests.swift
│ │ ├── LifecycleHandlerTests.swift
│ │ ├── LifecycleResultEnvelopeTests.swift
│ │ ├── MessageRouterEscapeTests.swift
│ │ ├── MessageRouterTests.swift
│ │ ├── RemoteNavigationPolicyTests.swift
│ │ ├── SecureStorageHandlerTests.swift
│ │ ├── SelfSdkConfigTests.swift
│ │ └── SelfWebViewHostTests.swift
│ ├── rn-sdk/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── HANDOFF.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── SelfVerification.tsx
│ │ │ ├── __tests__/
│ │ │ │ ├── BiometricHandler.test.ts
│ │ │ │ ├── CameraHandler.test.ts
│ │ │ │ ├── KeychainHandler.test.ts
│ │ │ │ ├── LifecycleHandler.test.ts
│ │ │ │ ├── MessageRouter.test.ts
│ │ │ │ ├── NfcHandler.test.ts
│ │ │ │ ├── assetBundling.test.ts
│ │ │ │ └── createHandlers.test.ts
│ │ │ ├── bridge/
│ │ │ │ ├── MessageRouter.ts
│ │ │ │ └── types.ts
│ │ │ ├── handlers/
│ │ │ │ ├── BiometricHandler.ts
│ │ │ │ ├── CameraHandler.ts
│ │ │ │ ├── KeychainHandler.ts
│ │ │ │ ├── LifecycleHandler.ts
│ │ │ │ ├── NfcHandler.ts
│ │ │ │ └── index.ts
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ ├── tsup.config.ts
│ │ └── vitest.config.ts
│ ├── rn-sdk-test-app/
│ │ ├── .gitignore
│ │ ├── App.tsx
│ │ ├── Gemfile
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── mrzBridgeContract.test.ts
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── build.gradle
│ │ │ │ ├── debug.keystore
│ │ │ │ ├── proguard-rules.pro
│ │ │ │ └── src/
│ │ │ │ ├── debug/
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── selfxyz/
│ │ │ │ │ └── demoapp/
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ ├── SelfMRZScannerModule.kt
│ │ │ │ │ ├── SelfMRZScannerPackage.kt
│ │ │ │ │ └── SelfMrzScannerActivity.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── rn_edit_text_material.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ ├── libs.versions.toml
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ └── settings.gradle
│ │ ├── app.json
│ │ ├── babel.config.cjs
│ │ ├── index.js
│ │ ├── ios/
│ │ │ ├── .xcode.env
│ │ │ ├── Podfile
│ │ │ ├── SelfRNTestApp/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info-Debug.plist
│ │ │ │ ├── Info.plist
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ ├── SelfMRZScannerModule.m
│ │ │ │ ├── SelfMRZScannerModule.swift
│ │ │ │ └── SelfRNTestApp.entitlements
│ │ │ ├── SelfRNTestApp.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── SelfRNTestApp.xcscheme
│ │ │ ├── SelfRNTestApp.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── scripts/
│ │ │ └── pod-install-with-cache-fix.sh
│ │ ├── metro.config.cjs
│ │ ├── package.json
│ │ ├── react-native.config.cjs
│ │ ├── scripts/
│ │ │ └── postinstall.cjs
│ │ └── tsconfig.json
│ ├── sdk-test-app/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── build.gradle.kts
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin/
│ │ │ │ │ └── xyz/
│ │ │ │ │ └── self/
│ │ │ │ │ └── testapp/
│ │ │ │ │ ├── EncryptedPrefsStorageProvider.kt
│ │ │ │ │ └── MainActivity.kt
│ │ │ │ └── res/
│ │ │ │ ├── values/
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── themes.xml
│ │ │ │ └── xml/
│ │ │ │ └── network_security_config.xml
│ │ │ ├── build.gradle.kts
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ └── settings.gradle.kts
│ │ ├── ios/
│ │ │ ├── SelfTestApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AccentColor.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ContentView.swift
│ │ │ │ ├── KeychainStorageProvider.swift
│ │ │ │ └── SelfTestAppApp.swift
│ │ │ └── project.yml
│ │ └── package.json
│ ├── self-sdk-swift/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── SelfSdkSwift/
│ │ │ ├── Constants/
│ │ │ │ └── SdkConstants.swift
│ │ │ ├── Helpers/
│ │ │ │ ├── MrzCameraHelper.swift
│ │ │ │ └── NfcPassportHelper.swift
│ │ │ ├── Providers/
│ │ │ │ ├── BiometricProviderImpl.swift
│ │ │ │ ├── CameraMrzProviderImpl.swift
│ │ │ │ ├── CryptoProviderImpl.swift
│ │ │ │ ├── DocumentsProviderImpl.swift
│ │ │ │ ├── HapticProviderImpl.swift
│ │ │ │ ├── NfcProviderImpl.swift
│ │ │ │ ├── SecureStorageProviderImpl.swift
│ │ │ │ └── WebViewProviderImpl.swift
│ │ │ └── SelfSdkSwift.swift
│ │ └── Tests/
│ │ └── SelfSdkSwiftTests/
│ │ └── WebViewProviderImplTests.swift
│ ├── webview-app/
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── AGENTS.md
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── animations/
│ │ │ │ ├── app-tour-generate.json
│ │ │ │ ├── app-tour-get-started.json
│ │ │ │ ├── app-tour-proof.json
│ │ │ │ ├── app-tour-welcome.json
│ │ │ │ ├── cloud-backup.json
│ │ │ │ ├── proof-progress.json
│ │ │ │ ├── proof-success-check.json
│ │ │ │ ├── proof-success.json
│ │ │ │ ├── push-notification-prompt.json
│ │ │ │ └── scan-bar.json
│ │ │ └── fonts/
│ │ │ ├── Advercase-Regular.otf
│ │ │ ├── DINOT-Bold.otf
│ │ │ ├── DINOT-Medium.otf
│ │ │ └── IBMPlexMono-Regular.otf
│ │ ├── src/
│ │ │ ├── App.tsx
│ │ │ ├── components/
│ │ │ │ ├── DevRouteMenu.tsx
│ │ │ │ ├── MockRegistrationFailureButton.tsx
│ │ │ │ └── PasswordGate.tsx
│ │ │ ├── data/
│ │ │ │ └── country-document-types.json
│ │ │ ├── fonts.css
│ │ │ ├── main.tsx
│ │ │ ├── providers/
│ │ │ │ ├── BridgeProvider.tsx
│ │ │ │ ├── SelfClientProvider.tsx
│ │ │ │ └── VerificationRequestProvider.tsx
│ │ │ ├── recovery.css
│ │ │ ├── reset.css
│ │ │ ├── screens/
│ │ │ │ ├── ComingSoonScreen.tsx
│ │ │ │ ├── account/
│ │ │ │ │ ├── DevModeScreen.tsx
│ │ │ │ │ ├── NotificationPreferencesScreen.tsx
│ │ │ │ │ ├── SecurityScreen.tsx
│ │ │ │ │ └── SettingsScreen.tsx
│ │ │ │ ├── debug/
│ │ │ │ │ └── KeychainDebugScreen.tsx
│ │ │ │ ├── home/
│ │ │ │ │ ├── HomeScreen.tsx
│ │ │ │ │ ├── IDDataScreen.tsx
│ │ │ │ │ └── ManageDocumentsScreen.tsx
│ │ │ │ ├── onboarding/
│ │ │ │ │ ├── ConfirmIdentificationScreen.tsx
│ │ │ │ │ ├── ConflictDetectedScreen.tsx
│ │ │ │ │ ├── CountryPickerScreen.tsx
│ │ │ │ │ ├── IDSelectionScreen.tsx
│ │ │ │ │ ├── KycFailureScreen.tsx
│ │ │ │ │ ├── ProviderLaunchScreen.tsx
│ │ │ │ │ ├── ProviderResultScreen.tsx
│ │ │ │ │ ├── PushNotificationPromptScreen.tsx
│ │ │ │ │ ├── RegistrationFailureScreen.tsx
│ │ │ │ │ ├── ScanSuccessScreen.tsx
│ │ │ │ │ ├── SocialSignOnMethodPickerScreen.tsx
│ │ │ │ │ ├── SocialSignOnPickerScreen.tsx
│ │ │ │ │ └── TourScreen.tsx
│ │ │ │ ├── proving/
│ │ │ │ │ ├── DialogueWithCtaScreen.tsx
│ │ │ │ │ ├── DiscloseResultScreen.tsx
│ │ │ │ │ ├── KycPendingScreen.tsx
│ │ │ │ │ ├── KycSuccessScreen.tsx
│ │ │ │ │ ├── ProofGenerationDialogueScreen.tsx
│ │ │ │ │ ├── ProofGenerationRouteScreen.tsx
│ │ │ │ │ ├── ProofGenerationSuccessScreen.tsx
│ │ │ │ │ ├── ProofHistoryScreen.tsx
│ │ │ │ │ ├── ProofRequestReceiptScreen.tsx
│ │ │ │ │ ├── ProofSuccessBackupScreen.tsx
│ │ │ │ │ ├── ProvingScreen.tsx
│ │ │ │ │ ├── SimpleDialogueScreen.tsx
│ │ │ │ │ └── VerificationResultScreen.tsx
│ │ │ │ ├── recovery/
│ │ │ │ │ ├── BackupMethodPickerScreen.tsx
│ │ │ │ │ ├── LaunchRecoveryScreen.tsx
│ │ │ │ │ ├── RecoveryFailureScreen.tsx
│ │ │ │ │ ├── RecoveryPhraseScreen.tsx
│ │ │ │ │ ├── RecoverySuccessScreen.tsx
│ │ │ │ │ └── SecretPhraseInputScreen.tsx
│ │ │ │ └── tunnel/
│ │ │ │ ├── TourScreen.tsx
│ │ │ │ ├── TunnelCountryPickerScreen.tsx
│ │ │ │ ├── TunnelDiscloseScreen.tsx
│ │ │ │ ├── TunnelIDTypeScreen.tsx
│ │ │ │ ├── TunnelKycFailureScreen.tsx
│ │ │ │ ├── TunnelKycPendingScreen.tsx
│ │ │ │ ├── TunnelKycSuccessScreen.tsx
│ │ │ │ ├── TunnelKycWrapper.tsx
│ │ │ │ ├── TunnelProofReceiptScreen.tsx
│ │ │ │ ├── TunnelProvingScreen.tsx
│ │ │ │ ├── TunnelRecoveryRequiredScreen.tsx
│ │ │ │ └── TunnelResultScreen.tsx
│ │ │ ├── test/
│ │ │ │ └── sri.test.ts
│ │ │ ├── types/
│ │ │ │ └── kycProvider.ts
│ │ │ └── utils/
│ │ │ ├── buildKycDocument.ts
│ │ │ ├── countryFlags.tsx
│ │ │ ├── insets.ts
│ │ │ ├── kycAttestation.ts
│ │ │ ├── kycProvider.ts
│ │ │ ├── mockDocumentStore.ts
│ │ │ ├── mockOnboardingFlow.ts
│ │ │ ├── provingUtils.test.ts
│ │ │ ├── provingUtils.ts
│ │ │ ├── secretManager.ts
│ │ │ ├── selfAppContext.ts
│ │ │ ├── verificationRequest.test.ts
│ │ │ └── verificationRequest.ts
│ │ ├── tests/
│ │ │ ├── components/
│ │ │ │ └── PasswordGate.test.tsx
│ │ │ ├── screens/
│ │ │ │ ├── ComingSoonScreen.test.tsx
│ │ │ │ ├── account/
│ │ │ │ │ └── settingsScreens.test.tsx
│ │ │ │ ├── home/
│ │ │ │ │ └── homeSupportScreens.test.tsx
│ │ │ │ ├── onboarding/
│ │ │ │ │ └── registrationPrompts.test.tsx
│ │ │ │ ├── proving/
│ │ │ │ │ └── provingSupportScreens.test.tsx
│ │ │ │ ├── recovery/
│ │ │ │ │ ├── recoveryPhraseScreen.test.tsx
│ │ │ │ │ ├── recoverySupportScreens.test.tsx
│ │ │ │ │ └── secretPhraseInputScreen.test.tsx
│ │ │ │ └── tunnel/
│ │ │ │ └── tunnelFlowScreens.test.tsx
│ │ │ └── utils/
│ │ │ └── secretManager.test.ts
│ │ ├── tsconfig.json
│ │ ├── vercel.json
│ │ ├── vite-env.d.ts
│ │ └── vite.config.ts
│ └── webview-bridge/
│ ├── .eslintrc.cjs
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── package.json
│ ├── src/
│ │ ├── __tests__/
│ │ │ ├── adapters.test.ts
│ │ │ ├── analytics-web.test.ts
│ │ │ ├── bridge.test.ts
│ │ │ ├── documents-web.test.ts
│ │ │ ├── helpers/
│ │ │ │ └── mockWindow.ts
│ │ │ └── schema.test.ts
│ │ ├── adapters/
│ │ │ ├── analytics.ts
│ │ │ ├── auth.ts
│ │ │ ├── biometrics.ts
│ │ │ ├── camera.ts
│ │ │ ├── crypto.ts
│ │ │ ├── documents.ts
│ │ │ ├── haptic.ts
│ │ │ ├── index.ts
│ │ │ ├── keychain-documents.ts
│ │ │ ├── lifecycle.ts
│ │ │ ├── navigation.ts
│ │ │ ├── nfc-scanner.ts
│ │ │ ├── sdk-adapter-map.ts
│ │ │ └── storage.ts
│ │ ├── bridge.ts
│ │ ├── index.ts
│ │ ├── mock.ts
│ │ ├── schema.ts
│ │ └── types.ts
│ ├── tsconfig.json
│ └── tsup.config.ts
├── patches/
│ ├── @turnkey+core+1.7.0.patch
│ ├── react-native-gesture-handler+2.22.1.patch
│ ├── react-native-keychain+10.0.0.patch
│ ├── react-native-passport-reader+1.0.3.patch
│ └── react-native-svg+15.14.0.patch
├── purple/
│ ├── business/
│ │ ├── core-value-prop.md
│ │ ├── general-description.md
│ │ └── pricing-model.md
│ ├── crypto/
│ │ ├── sdk-architecture.md
│ │ ├── smart-contracts.md
│ │ └── zk-circuits.md
│ ├── frontend/
│ │ ├── components.md
│ │ ├── responsiveness.md
│ │ └── styling.md
│ ├── global/
│ │ ├── authentication.md
│ │ ├── code-style.md
│ │ ├── database.md
│ │ ├── external-services.md
│ │ ├── how-agents-document.md
│ │ ├── tech-stack.md
│ │ └── testing.md
│ ├── mobile/
│ │ ├── native-platforms.md
│ │ ├── nfc-biometrics.md
│ │ └── security-storage.md
│ └── temp/
│ └── codebase-analysis.md
├── scripts/
│ ├── audit/
│ │ └── tech-debt-baseline.mjs
│ ├── build-webview-bundle.sh
│ ├── check-duplicate-headers.cjs
│ ├── check-license-headers.mjs
│ ├── check-package-versions.mjs
│ ├── docstring-report.ts
│ ├── kmp-start.sh
│ ├── lint-headers.cjs
│ ├── migrate-license-headers.mjs
│ ├── reinstall-app.sh
│ ├── run-patch-package.cjs
│ └── tests/
│ ├── .gitignore
│ ├── checkLicenseHeaders.test.mjs
│ ├── checkPackageVersions.test.mjs
│ └── package.json
├── sdk/
│ ├── core/
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── README.md
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ └── copyAbi.sh
│ │ ├── src/
│ │ │ ├── SelfBackendVerifier.ts
│ │ │ ├── abi/
│ │ │ │ ├── AadhaarVerifier.json
│ │ │ │ ├── IdentityVerificationHubImpl.json
│ │ │ │ ├── KycVerifier.json
│ │ │ │ ├── Registry.json
│ │ │ │ └── Verifier.json
│ │ │ ├── errors/
│ │ │ │ ├── ProofError.ts
│ │ │ │ ├── RegistryContractError.ts
│ │ │ │ ├── VerifierContractError.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── store/
│ │ │ │ ├── DefaultConfigStore.ts
│ │ │ │ ├── InMemoryConfigStore.ts
│ │ │ │ └── interface.ts
│ │ │ ├── types/
│ │ │ │ └── types.ts
│ │ │ └── utils/
│ │ │ ├── constants.ts
│ │ │ ├── hash.ts
│ │ │ ├── id.ts
│ │ │ ├── proof.ts
│ │ │ └── utils.ts
│ │ ├── tests/
│ │ │ ├── proof.test.ts
│ │ │ └── verifierErrors.test.ts
│ │ └── tsconfig.json
│ ├── qrcode/
│ │ ├── .eslintrc.cjs
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── .size-limit.json
│ │ ├── README.md
│ │ ├── animations/
│ │ │ ├── index.ts
│ │ │ ├── status-connecting.json
│ │ │ ├── status-error.json
│ │ │ ├── status-failed.json
│ │ │ └── status-success.json
│ │ ├── components/
│ │ │ ├── QRCode.tsx
│ │ │ ├── SelfQRcode.tsx
│ │ │ └── StatusBanner.tsx
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── postBuild.mjs
│ │ │ └── shimConfigs.js
│ │ ├── tsconfig.cjs.json
│ │ ├── tsconfig.json
│ │ ├── tsconfig.react.json
│ │ ├── tsup.config.ts
│ │ ├── types/
│ │ │ └── svg.d.ts
│ │ └── utils/
│ │ ├── styles.ts
│ │ ├── utils.ts
│ │ └── websocket.ts
│ ├── qrcode-angular/
│ │ ├── .eslintrc.json
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── README.md
│ │ ├── angular.json
│ │ ├── karma.conf.js
│ │ ├── ng-package.json
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── lib/
│ │ │ │ ├── common.ts
│ │ │ │ ├── components/
│ │ │ │ │ ├── animations/
│ │ │ │ │ │ ├── check_animation.json
│ │ │ │ │ │ └── x_animation.json
│ │ │ │ │ ├── led/
│ │ │ │ │ │ └── led.component.ts
│ │ │ │ │ └── self-qrcode/
│ │ │ │ │ ├── self-qrcode.component.css
│ │ │ │ │ ├── self-qrcode.component.html
│ │ │ │ │ └── self-qrcode.component.ts
│ │ │ │ ├── providers.ts
│ │ │ │ ├── services/
│ │ │ │ │ └── websocket.service.ts
│ │ │ │ └── utils/
│ │ │ │ ├── styles.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── websocket.ts
│ │ │ ├── public-api.ts
│ │ │ └── styles.css
│ │ ├── tsconfig.json
│ │ ├── tsconfig.lib.json
│ │ ├── tsconfig.lib.prod.json
│ │ ├── tsconfig.spec.json
│ │ └── validate-build.cjs
│ ├── sdk-common/
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── tsconfig.cjs.json
│ │ └── tsconfig.json
│ └── sdk-go/
│ ├── InMemoryConfigStore.go
│ ├── LICENSE
│ ├── README.md
│ ├── common/
│ │ ├── constants.go
│ │ ├── customHash.go
│ │ └── utils.go
│ ├── config.go
│ ├── contracts/
│ │ ├── abi/
│ │ │ ├── AadhaarVerifier.abi
│ │ │ ├── IdentityVerificationHubImpl.abi
│ │ │ ├── Registry.abi
│ │ │ └── Verifier.abi
│ │ └── bindings/
│ │ ├── AadhaarVerifier.go
│ │ ├── IdentityVerificationHubImpl.go
│ │ ├── Registry.go
│ │ └── Verifier.go
│ ├── go.mod
│ ├── go.sum
│ ├── sdk.go
│ ├── test/
│ │ └── selfBackendVerifier_test.go
│ ├── types.go
│ ├── utils.go
│ └── verifier.go
└── specs/
├── ARCHIVE.md
├── README.md
├── archive/
│ ├── CI-COVERAGE-GAPS.md
│ ├── EUCLID-WEB-CONSOLIDATION.md
│ ├── IOS-CRASH-FIX.md
│ ├── LOTTIE-DOTLOTTIE-REVIEW.md
│ ├── PROJECT-RULES.md
│ ├── SECURITY-HARDENING.md
│ ├── SPEC-GUIDE.md
│ ├── SPECS-REORG-PLAN.md
│ ├── kmp/
│ │ ├── ARCHITECTURE.md
│ │ ├── INDEX.md
│ │ ├── INITIATIVE.md
│ │ └── REORG-PLAN.md
│ └── sdk/
│ ├── SPEC-AGENT-OPTIMIZATION.md
│ ├── SPEC-MRZ-CONSOLIDATION.md
│ └── SPEC-TEST-APP-CAMERA.md
├── framework/
│ ├── PRODUCT-SPEC-ENHANCEMENT-PROMPT.md
│ ├── SPEC-EXECUTION-MODEL.md
│ └── TEMPLATES.md
└── projects/
└── sdk/
├── INDEX.md
├── OVERVIEW.md
├── paused/
│ ├── INDEX.md
│ ├── integrations/
│ │ ├── SPEC.md
│ │ └── plans/
│ │ ├── IN-01-sample-polish-and-error-handling.md
│ │ └── IN-02-sample-physical-device-validation.md
│ ├── native-consolidation/
│ │ ├── CONTRACTS.md
│ │ ├── PLAN.md
│ │ ├── SPEC.md
│ │ └── plans/
│ │ ├── NC-01-phase-0-safety-rails.md
│ │ ├── NC-02-phase-1-mrz-unification.md
│ │ ├── NC-03-phase-2-passport-reader-parity.md
│ │ ├── NC-04-phase-3-shim-cleanup.md
│ │ ├── NC-05-phase-4-deletions-and-guardrails.md
│ │ └── NC-06-external-mrz-nfc-inventory.md
│ ├── native-shells/
│ │ ├── SPEC.md
│ │ └── plans/
│ │ ├── NS-01-physical-device-validation.md
│ │ ├── NS-03-publishing-readiness.md
│ │ ├── NS-04-apdu-allowlist.md
│ │ ├── NS-05-lifecycle-handler-semantics.md
│ │ ├── NS-06-kmp-callback-contract-alignment.md
│ │ ├── NS-08-ship-artifacts-to-minipay.md
│ │ └── NS-09-nfcpassportreader-distribution.md
│ └── rn-sdk/
│ ├── SPEC.md
│ └── plans/
│ ├── RN-01-self-wallet-integration-validation.md
│ ├── RN-02-npm-publishing-readiness.md
│ └── RN-03-nfc-hardening.md
└── workstreams/
├── analytics/
│ ├── SPEC.md
│ └── plans/
│ └── ANA-01-canonical-onboarding-funnel.md
├── build-pipeline/
│ ├── SPEC.md
│ └── plans/
│ └── BP-01-build-script.md
├── kmp-revival/
│ ├── SPEC.md
│ └── plans/
│ ├── KR-01-android-parity.md
│ ├── KR-02-ios-parity.md
│ └── KR-03-validate-and-publish.md
├── native-hardware-handlers/
│ └── SPEC.md
├── native-shells-lite/
│ ├── SPEC.md
│ └── plans/
│ ├── NSL-01-android-shell.md
│ ├── NSL-02-ios-shell.md
│ ├── NSL-03-test-apps.md
│ └── NSL-04-delegate-keychain.md
├── sdk-core/
│ ├── SPEC.md
│ └── plans/
│ ├── SC-01-fallback-adapter-dedup.md
│ ├── SC-02-crypto-bridge-surface.md
│ └── SC-03-selfclient-adapter-assembly.md
├── sdk-distribution/
│ ├── SPEC.md
│ └── plans/
│ ├── SD-01-android-hosted-url.md
│ ├── SD-02-ios-hosted-url.md
│ ├── SD-03-hosting-setup.md
│ ├── SD-04-android-maven-publishing.md
│ ├── SD-05-ios-spm-publishing.md
│ └── SD-06-kmp-remote-publishing.md
└── webview/
├── INDEX.md
├── SCREEN-INVENTORY.md
├── SPEC.md
├── TICKET-PLAN.md
└── plans/
├── SELF-2504-onboarding-recovery-phrase.md
├── WV-01-dynamic-proof-request-items.md
├── WV-02-kyc-provider-contract.md
├── WV-03-remove-native-scan-assumptions.md
├── WV-04-host-callback-contract.md
├── WV-05-kyc-provider-sdk.md
├── WV-06-kyc-result-flow.md
├── WV-07-selfclient-proving-assembly.md
├── WV-08-tunnel-proving-flow.md
├── WV-09-registration-core.md
├── WV-10-eu-id-helper-flow.md
├── WV-11-disclose-core.md
├── WV-12-registration-prompts.md
└── WV-17-recovery-phrase-restore-flow.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .actrc
================================================
--container-architecture linux/amd64
--platform macos-latest=catthehacker/ubuntu:runner-latest
--secret-file ./app/fastlane/.env.secrets
================================================
FILE: .coderabbit.yaml
================================================
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
language: "en-US"
tone_instructions: "Only report bugs, security vulnerabilities, data loss, or production incidents. No nitpicks, style suggestions, missing comments, optional improvements, or test mock wiring. When unsure, do not post."
reviews:
profile: "chill"
request_changes_workflow: false
high_level_summary: true
poem: false
sequence_diagrams: false
related_issues: false
related_prs: false
suggested_labels: false
suggested_reviewers: false
enable_prompt_for_ai_agents: false
review_status: true
auto_review:
enabled: false
drafts: false
base_branches: ["main", "dev", "staging"]
tools:
github-checks:
timeout_ms: 300000
path_instructions:
- path: "contracts/**/*.sol"
instructions: |
Focus exclusively on security vulnerabilities (reentrancy, overflow, access control)
and correctness bugs. Ignore style, gas optimization suggestions, and missing NatSpec.
- path: "circuits/**/*.circom"
instructions: |
Focus on circuit correctness, constraint soundness, and input validation bugs only.
- path: "noir/**/*.nr"
instructions: |
Focus on constraint correctness, soundness bugs, and public/private input misuse only.
- path: "app/ios/**/*"
instructions: |
Focus on security issues (keychain misuse, insecure storage) and crash-causing bugs only.
- path: "app/android/**/*"
instructions: |
Focus on security issues and crash-causing bugs only.
chat:
auto_reply: true
================================================
FILE: .cursor/mcp.json
================================================
{
"mcpServers": {},
"settings": {}
}
================================================
FILE: .cursor/rules/compliance-verification.mdc
================================================
---
description: Critical compliance verification requirements for OFAC checks, age verification, and forbidden country validation
version: 1.0.0
status: active
owners:
- team: compliance-platform
- team: mobile-identity
lastUpdated: 2025-01-12
specId: compliance-verification
importanceScore: 95
importanceJustification: Direct implementation of critical regulatory compliance requirements with multiple verification layers and sophisticated identity validation.
contextUsageNote: If this file is used to add in-context notes, include a single italicized line stating what specific information was used from this file in sentence case.
---
# Compliance Verification Requirements
## 1. OFAC Compliance Checks
### Three-Tier Verification System
- **Passport Number Check**: Direct passport number validation against OFAC lists
- **Name + DOB Check**: Full name with exact date of birth verification
- **Name + Year Check**: Name with year of birth verification (defaults to Jan-01)
### Data Normalization Requirements
- **Names**: Case-folding, Unicode NFKC normalization, diacritics removal
- **Fuzzy Matching**: Jaro–Winkler algorithm with ≥0.92 threshold
- **Passport Numbers**: Whitespace/punctuation removal, country-specific format validation
- **Dates**: ISO 8601 format (YYYY-MM-DD) required
### Privacy Protection
- **No Raw PII**: All PII committed via domain-separated hashes (Poseidon("ofac-v1" || value))
- **Per-Issuer Salt**: Unique salt per issuing country for additional privacy
- **On-Chain Privacy**: Only nullifiers/commitments published, no linkable identity data
## 2. Age Verification
### Implementation Requirements
- **Granularity**: Day-level precision for age verification
- **Format**: "olderThan" checks with ISO 8601 date inputs
- **Privacy**: Age verification without revealing actual date of birth
- **Zero-Knowledge**: Proof of age without disclosing DOB
### Circuit Implementation
- **Location**: `circuits/circuits/disclose/disclose.circom`
- **Input**: Date of birth (private), minimum age (public)
- **Output**: Boolean proof of age requirement satisfaction
- **Validation**: Day-level comparison with proper date arithmetic
## 3. Forbidden Country Validation
### Data Structure
- **Implementation**: Bloom filter with ≤1e-6 false positive rate
- **Distribution**: JWS/JWT protected with key rotation and KID
- **Update Cadence**: Weekly updates with 24-hour cache TTL
- **Versioning**: Filter seed versioning for updates
### Validation Process
- **Country Code**: ISO 3166-1 alpha-3 format validation
- **Zero-Knowledge**: Proof of non-inclusion without revealing country
- **Circuit Integration**: Integrated into disclosure proof circuit
- **Fallback**: Graceful degradation when filter unavailable
## 4. Time and Replay Control
### Timestamp Requirements
- **Time Source**: UTC timestamps only
- **Clock Drift**: ±5 minutes tolerance allowed
- **Window**: 24-hour verification window with drift adjustment
- **Binding**: Timestamp bound into proof signature to prevent replay
### Mobile Client Considerations
- **Trusted Time**: Server-signed time tokens or chain block timestamps
- **Device Clock**: Do not trust device wall-clock alone
- **Time Anchor**: Include trusted time anchor in proof generation
- **Validation**: Verify time anchor authenticity before proof generation
## 5. Implementation Constraints
### Performance Requirements
- **Proof Generation**: <60s on mid-tier mobile devices
- **Memory Usage**: <300MB peak memory
- **Network Calls**: Idempotent with exponential backoff
- **Offline Support**: Cached data with ETag/versioning
### Error Handling
- **Graceful Degradation**: Fallback when external services unavailable
- **Error Codes**: Deterministic error codes without sensitive data
- **Retry Logic**: Exponential backoff with jitter
- **User Feedback**: Clear error messages without PII exposure
### Security Requirements
- **Cryptographic Standards**: Approved algorithms and key sizes
- **Key Management**: Proper rotation and secure storage
- **Randomness**: CSPRNG with entropy validation
- **Audit Trails**: Privacy-preserving audit logs
This specification focuses on the critical compliance requirements with specific implementation details and constraints.
$END$
================================================
FILE: .cursor/rules/test-memory-optimization.mdc
================================================
---
description: Critical rules for avoiding out-of-memory issues in tests, specifically preventing nested require() calls that cause pipeline failures
version: 1.0.0
status: active
owners:
- team: mobile-identity
- team: platform-infrastructure
lastUpdated: 2025-01-12
specId: test-memory-optimization
importanceScore: 100
importanceJustification: Prevents catastrophic pipeline failures due to out-of-memory errors caused by nested require() calls, especially with react-native modules in test environments.
contextUsageNote: If this file is used to add in-context notes, include a single italicized line stating what specific information was used from this file in sentence case.
---
# Test Memory Optimization Rules
## Critical: Never Nest require() Calls
### The Problem
Nested `require('react-native')` calls within tests cause **out-of-memory (OOM) errors** in CI/CD pipelines. This happens because:
1. **Module Resolution Loops**: Each nested require can trigger additional module resolution and initialization
2. **Memory Accumulation**: React Native modules are large and complex; nested requires multiply memory usage
3. **Test Environment Overhead**: Jest/Vitest test runners already load modules; nested requires create duplicate module instances
4. **Hermes Parser Issues**: Nested requires can trigger WASM memory issues with hermes-parser
### The Rule
**NEVER create nested `require('react-native')` calls within test files or test setup files.**
### Examples of FORBIDDEN Patterns
#### ❌ FORBIDDEN: Nested require in test files
```typescript
// BAD - This will cause OOM issues
describe('MyComponent', () => {
beforeEach(() => {
const RN = require('react-native');
const Component = require('./MyComponent');
// Component internally does: require('react-native') again
// This creates nested requires = OOM
});
});
```
#### ❌ FORBIDDEN: require() inside module that's required in tests
```typescript
// BAD - If this module is required in tests, it creates nested requires
// app/src/utils/myUtil.ts
export function myFunction() {
const RN = require('react-native'); // Nested if called from test
return RN.Platform.OS;
}
```
#### ❌ FORBIDDEN: Dynamic requires in test hooks
```typescript
// BAD - Dynamic requires in beforeEach/afterEach create nested requires
beforeEach(() => {
jest.resetModules();
const RN = require('react-native'); // First require
const service = require('@/utils/service'); // May internally require RN again
});
```
### Examples of CORRECT Patterns
#### ✅ CORRECT: Use ES6 imports at top level
```typescript
// GOOD - Single import at top level
import { Platform } from 'react-native';
describe('MyComponent', () => {
it('should work', () => {
expect(Platform.OS).toBe('ios');
});
});
```
**Key Rule**: Use `import` statements, not `require()`. React Native is already mocked in setup files (`jest.setup.js` for Jest, `tests/setup.ts` for Vitest), so imports work correctly.
## React Native Module Handling in Tests
### Jest Setup Pattern (app/jest.setup.js)
The project uses a custom require override in `jest.setup.js` to handle React Native mocks:
```javascript
// This is OK - it's in setup file, runs once
const Module = require('module');
const originalRequire = Module.prototype.require;
Module.prototype.require = function (id) {
if (id === 'react-native') {
const RN = originalRequire.apply(this, arguments);
// Add mocks if needed
return RN;
}
return originalRequire.apply(this, arguments);
};
```
**Key Point**: This override runs ONCE during test setup. Tests should NOT create additional require() calls that would trigger this override multiple times.
### Vitest Setup Pattern (packages/mobile-sdk-alpha/tests/setup.ts)
Vitest uses `vi.mock()` to mock React Native:
```typescript
// This is OK - runs once during setup
vi.mock('react-native', () => ({
Platform: { OS: 'web' },
// ... other mocks
}));
```
**Key Point**: Tests should use `import` statements, not `require()`, after mocks are set up.
## Best Practices
1. **Always use ES6 `import` statements** - Never use `require('react')` or `require('react-native')` in test files
2. **Put all imports at the top of the file** - No dynamic imports in hooks
3. **Avoid `jest.resetModules()`** - Only use when absolutely necessary for module initialization tests
4. **Use setup file mocks** - React Native is already mocked in `jest.setup.js` (Jest) or `tests/setup.ts` (Vitest)
## Automated Enforcement
The project has multiple layers of protection against nested require() patterns:
### 1. ESLint Rule (app/.eslintrc.cjs)
ESLint will fail on `require('react')` and `require('react-native')` in test files:
```javascript
'no-restricted-syntax': [
'error',
{
selector: "CallExpression[callee.name='require'][arguments.0.value='react']",
message: "Do not use require('react') in tests..."
},
{
selector: "CallExpression[callee.name='require'][arguments.0.value='react-native']",
message: "Do not use require('react-native') in tests..."
}
]
```
Run `yarn lint` to check for violations.
### 2. Validation Script (app/scripts/check-test-requires.cjs)
Automated script to detect nested require patterns:
```bash
node scripts/check-test-requires.cjs
```
This script:
- Scans all test files for `require('react')` and `require('react-native')`
- Reports exact file locations and line numbers
- Exits with error code 1 if issues found
### 3. CI Fast-Fail Check
GitHub Actions runs the validation script before tests:
```yaml
- name: Check for nested require() in tests
run: node scripts/check-test-requires.cjs
working-directory: ./app
```
This prevents wasting CI time on tests that will OOM.
## Quick Checklist
Before committing test changes:
- [ ] No `require('react')` calls in test files (use `import React from 'react'` instead)
- [ ] No `require('react-native')` calls in test files (use `import { ... } from 'react-native'` instead)
- [ ] All imports at top of file (not in hooks or jest.mock() factories)
- [ ] Run validation: `node scripts/check-test-requires.cjs`
- [ ] Run lint: `yarn lint`
## Detection
**Signs of nested require issues**: CI OOM errors, test timeouts, memory spikes, "Call stack size exceeded" errors, tests hiding actual failures
**Fix**:
1. Search for `require('react')` and `require('react-native')` in tests
2. Replace with `import` statements at the top of the file
3. Run `node scripts/check-test-requires.cjs` to verify
## Related Files
- `app/.eslintrc.cjs` - ESLint rules blocking nested requires
- `app/scripts/check-test-requires.cjs` - Validation script
- `.github/workflows/mobile-ci.yml` - CI enforcement
- `app/jest.setup.js` - Jest setup with React Native mocks
- `packages/mobile-sdk-alpha/tests/setup.ts` - Vitest setup with React Native mocks
- `app/jest.config.cjs` - Jest configuration
- `packages/mobile-sdk-alpha/vitest.config.ts` - Vitest configuration
$END$
================================================
FILE: .cursorignore
================================================
# .cursorignore - Cursor AI editor ignore file
# This file prevents Cursor from accessing sensitive files and improves performance
# Note: .gitignore files are automatically included
# ========================================
# Security & Sensitive Files
# ========================================
# Environment and secrets
**/.env
**/.env.*
**/env.sample
**/*secrets*
**/*credentials*
**/*private*
**/google-services.json
**/GoogleService-Info.plist
# Keys and certificates
**/*.key
**/*.pem
**/*.p12
**/*.jks
**/*.keystore
**/*.cer
**/*.crt
**/*.cert
**/mock_*.key
**/mock_*.pem
**/debug.keystore
**/dev-keystore
# Mobile app sensitive files
app/android/app/google-services.json
app/ios/GoogleService-Info.plist
app/android/app/debug.keystore
app/android/dev-keystore
# Deployment scripts and CI/CD
circuits/scripts/server/*.sh
!node_modules/**/*.sh
# Test wallets and mock data
app/ios/passport.json
app/ios/OpenPassport/passport.json
# Environment sample files
app/env.sample
sdk/.env
# ========================================
# Build Outputs & Generated Files
# ========================================
# General build outputs
**/dist/
**/build/
**/out/
**/.next/
**/*.tsbuildinfo
# Mobile build outputs
app/android/app/build/
app/android/build/
app/ios/build/
app/ios/Pods/
app/ios/DerivedData/
# Circuit build outputs
circuits/build/
circuits/**/*.r1cs
circuits/**/*.sym
circuits/**/*.json
circuits/**/*.wasm
circuits/**/*.zkey
circuits/**/*.vkey
circuits/**/*.wtns
circuits/ptau/
# Contract artifacts
contracts/artifacts/
contracts/cache/
contracts/typechain-types/
contracts/ignition/deployments/
# ========================================
# Dependencies & Package Management
# ========================================
# Node modules - everywhere
**/node_modules/
**/pnpm-lock.yaml
**/yarn.lock
**/package-lock.json
**/.yarn/
**/.pnp.*
# Mobile specific
app/android/link-assets-manifest.json
app/ios/link-assets-manifest.json
# ========================================
# Large Data Files
# ========================================
# Circuit deployment artifacts (large JSON files)
app/deployments/artifacts/
# Public keys and trees (large JSON files)
common/pubkeys/public_keys_parsed.json
common/pubkeys/serialized_*.json
common/pubkeys/serialized_csca_tree.json
common/pubkeys/serialized_dsc_tree.json
common/pubkeys/serialized_tree.json
# OFAC and sanctions data
common/ofacdata/
common/sanctionedCountries/
common/ofacdata/original/*.csv
common/ofacdata/scripts/cleaned_sdn.csv
common/sanctionedCountries/outputs/sc_SMT.json
# Mock certificates (numerous files)
common/src/mock_certificates/
# Large SMT (Sparse Merkle Tree) files
contracts/test/utils/smt.json
# Circuit power files
circuits/circuits/utils/crypto/ec/powers/
# Test data files
app/android/android-passport-nfc-reader/app/src/main/assets/tessdata/
# ========================================
# Development & Testing
# ========================================
# Test coverage (but allow docs/coverage for docstring reports)
**/coverage/
!docs/coverage/
**/.nyc_output/
# Test files (optional - you might want AI to see tests)
# **/*.test.ts
# **/*.test.tsx
# **/*.spec.ts
# **/*.spec.tsx
# Temporary files
**/.tmp/
**/tmp/
**/.cache/
**/*.log
**/*.tmp
# ========================================
# IDE & Editor Files
# ========================================
.idea/
*.swp
*.swo
.DS_Store
.cursor/cache/
.cursor/logs/
.cursor/temp/
# ========================================
# Documentation Build
# ========================================
# Documentation builds (if any)
docs/build/
docs/.docusaurus/
documentation/build/
documentation/.docusaurus/
# Development documentation
app/fastlane/DEV.md
common/ofacdata/original/dataspec.txt
# Generated constants from certificates
common/src/constants/skiPem.ts
# Circuit test cases (large)
circuits/tests/**/test_cases.ts
# ========================================
# Platform Specific
# ========================================
# iOS
*.xcworkspace/
app/ios/App Thinning Size Report.txt
# Android
*.iml
.gradle/
local.properties
app/android/android-passport-nfc-reader/examples/
# ========================================
# Miscellaneous
# ========================================
# License files (AI doesn't need these)
LICENSE
NOTICE
# Large media files
**/*.mp4
**/*.mov
**/*.avi
**/*.zip
**/*.tar.gz
# ========================================
# Project Specific Patterns
# ========================================
# Deployment addresses (might contain sensitive info)
contracts/deployed_addresses.json
contracts/ignition/deployments/staging/deployed_addresses.json
contracts/ignition/deployments/*/artifacts/
contracts/deployments/*/
!contracts/deployments/prod/
# Error selectors (generated)
contracts/error-selectors.json
# Hardhat network fork data
contracts/.hardhat_fork_cache/
# Lottie animation files (large JSON)
app/src/assets/animations/*.json
# Font files
app/src/assets/fonts/
# Yarn configuration
**/.yarn/
# Certificate generation config
common/src/scripts/extensions.cnf
# Powers of Tau files
circuits/ptau/
# ========================================
# Allow Important Files
# ========================================
# Ensure important config files are accessible
!tsconfig.json
!**/tsconfig.json
!package.json
!**/package.json
!hardhat.config.ts
!jest.config.*
!babel.config.*
!metro.config.*
!tamagui.config.ts
# Allow docstring coverage reports (tracked in git for coverage tracking)
!docs/coverage/*.json
# Ensure source code is accessible
!**/*.ts
!**/*.tsx
!**/*.js
!**/*.jsx
!**/*.sol
!**/*.circom
# Exception for specific private module setup script
!app/scripts/setup-private-modules.cjs
# But exclude generated TypeScript declaration files
**/*.d.ts
!**/types/*.d.ts
!**/src/types/*.d.ts
!**/global.d.ts
================================================
FILE: .cursorrules
================================================
# main-overview
## Development Guidelines
- Only modify code directly relevant to the specific request. Avoid changing unrelated functionality.
- Never replace code with placeholders like `# ... rest of the processing ...`. Always include complete code.
- Break problems into smaller steps. Think through each step separately before implementing.
- Always provide a complete PLAN with REASONING based on evidence from code and logs before making changes.
- Explain your OBSERVATIONS clearly, then provide REASONING to identify the exact issue. Add console logs when needed to gather more information.
- **NEVER log sensitive data** including PII (names, DOB, passport numbers, addresses), credentials, tokens, API keys, private keys, or session identifiers.
- **ALWAYS redact/mask sensitive fields** in logs using consistent patterns (e.g., `***-***-1234` for passport numbers, `J*** D***` for names).
- **Use secure centralized logging** with access controls, encryption in transit/at rest, and audit trails for log access.
- **Debug-level secrets require tokenized environment flags** (e.g., `DEBUG_SECRETS_TOKEN=abc123`) with approval workflow and limited lifetime (max 24 hours).
- **Implement periodic log review and retention policies** with automated cleanup of sensitive data and compliance with data protection regulations.
# Identity Verification System Architecture
## Core Components
1. Identity Verification Hub
- Manages multi-step verification process for passports, EU ID cards, Aadhaar, and Selfrica ID cards
- Handles document attestation through zero-knowledge proofs
- Implements verification paths: E-PASSPORT, EU_ID_CARD, AADHAAR, and SELFRICA_ID_CARD
- File: contracts/contracts/IdentityVerificationHubImplV2.sol
2. Document Verification Processing
- Validates international travel documents using ICAO standards
- Processes Document Signer Certificate (DSC) verification
- Handles multiple cryptographic signature algorithms
- Location: noir/crates/dg1/src/dg1/dg1.nr
3. OFAC Compliance System
- Three-tier verification approach:
* Name-based sanctions screening
* Name + DOB verification
* Passport number validation
- Merkle tree-based sanctions list verification
- Files: noir/crates/dg1/src/ofac/*.nr
4. Identity Registry Management
- Maintains separate registries for passports, EU ID cards, Aadhaar, and Selfrica
- Handles DSC key commitment registration
- Implements nullifier tracking for duplicate prevention
- Files: contracts/contracts/registry/IdentityRegistryImplV1.sol, IdentityRegistryIdCardImplV1.sol, IdentityRegistryAadhaarImplV1.sol, IdentityRegistrySelfricaImplV1.sol
## Core Workflows
1. Document Verification Flow
- Zero-knowledge proof generation for privacy
- Multi-stage attestation verification
- Cross-chain verification support
2. Compliance Verification
- OFAC screening integration
- Age verification without revealing DOB
- Country restriction validation
- Forbidden country checking
3. Attribute Disclosure Control
- Selective revelation of identity attributes
- Privacy-preserving age verification
- Granular document field disclosure
- Merkle-based attribute verification
## Business Rules
1. Document Validation
- Multiple proof types required (Register, DSC, VC)
- Time-based verification with day granularity
- Double-spend prevention through nullifiers
2. Compliance Requirements
- OFAC validation with multiple check levels
- Age threshold verification
- Country-based restrictions
- Document expiration validation
3. Privacy Controls
- Minimum necessary attribute disclosure
- Zero-knowledge proof requirements
- Selective attribute revelation
- Identity commitment privacy
$END$
# Self App Development Rules
## Project Overview
This is a React Native identity verification app with NFC passport reading, zero-knowledge proofs, and smart contracts. The app handles passport/ID verification, OFAC compliance, and privacy-preserving identity attestations.
## Development Patterns
### React Native Architecture
- Uses `@react-navigation/native` with `createStaticNavigation` for type-safe navigation
- Platform-specific handling: `Platform.OS === 'ios' ? 'iOS' : 'Android'`
- Native module initialization with `initializeNativeModules()` before any native operations
- Lazy loading for screens using `React.lazy()`
### Navigation Patterns
- Screens organized by feature modules (passport, home, settings, etc.)
- Custom modal system with `useModal` hook and callback registry
- Haptic feedback integration with `useHapticNavigation`
- Platform-specific initial routes: web uses 'Home', mobile uses 'Splash'
### State Management
- Zustand for global state management
- Custom hooks for complex state (`useModal`, `useHapticNavigation`)
- AsyncStorage for simple data, SQLite for complex data, Keychain for sensitive data
## Testing Conventions
### Jest Setup
- Comprehensive mocks in `jest.setup.js` for all native modules
- Module mapping: `@/` → `src/`, `@tests/` → `tests/src/`
- Mock patterns for Firebase, Keychain, NFC, Analytics, and third-party modules
### Testing Patterns
- Use `renderHook` for custom hook testing
- Mock console.error to avoid test output clutter
- Test error boundaries and recovery mechanisms
- E2E testing with Maestro for platform-specific flows
### Database Testing
- SQLite operations mocked with `executeSql` method
- Test utilities in `tests/__setup__/databaseMocks.ts`
- Mock database instance for testing
## Code Organization
### File Structure
- Feature-based organization in `src/`
- Shared utilities in `@/utils`
- Type definitions in `@/types`
- Platform-specific code in `native/` directories
- Tests mirror source structure in `tests/src/`
### Import Patterns
- Use `@/` alias for src imports
- Use `@tests/` alias for test imports
- Platform-specific imports with conditional rendering
## Build & Deployment
### Scripts
- `yarn ios` / `yarn android` for platform-specific builds
- `yarn test` for Jest testing
- `yarn test:e2e:ios` / `yarn test:e2e:android` for E2E
- Fastlane for deployment automation
### Dependencies
- Yarn workspaces for monorepo management
- Platform-specific native modules
- Tamagui for UI components
- React Navigation for routing
## Security & Privacy
### Data Protection
- Sensitive data not logged in production
- Secure storage with Keychain
- Proper cleanup of sensitive data
- Certificate validation for passport data
### Privacy Features
- Zero-knowledge proof generation
- Selective attribute revelation
- Privacy-preserving age verification
- Identity commitment privacy
## Common Patterns
### Error Handling
- Always use try-catch for async operations
- Graceful degradation when native modules fail
- User-friendly error messages
- Comprehensive error boundaries
### Performance
- Lazy load screens and components
- Bundle size optimization with tree shaking
- Memory leak prevention in native modules
- Proper cleanup in useEffect and component unmount
### Platform Differences
- Always check Platform.OS before platform-specific code
- Different implementations for iOS/Android when needed
- Platform-specific testing strategies
- Conditional rendering for platform differences
================================================
FILE: .editorconfig
================================================
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.{js,json,yml}]
charset = utf-8
indent_style = space
indent_size = 2
================================================
FILE: .eslintignore
================================================
node_modules
dist
build
coverage
ios/build
android/build
android/app/build
app/vendor
circuits/build
contracts/artifacts
contracts/cache
contracts/typechain-types
**/*.js
**/*.cjs
**/*.mjs
================================================
FILE: .gitattributes
================================================
/.yarn/** linguist-vendored
/.yarn/releases/* binary
/.yarn/plugins/**/* binary
/.pnp.* binary linguist-generated
================================================
FILE: .gitguardian.yml
================================================
# GitGuardian configuration for ggshield
# This file configures which files and secrets to ignore during scanning
# Ignore specific file patterns
paths_ignore:
# Gitleaks configuration file (contains example secrets/patterns for detection)
- ".gitleaks.toml"
# Mock certificates for testing (these are intentionally committed test data)
- "**/mock_certificates/**/*.key"
- "**/mock_certificates/**/*.crt"
- "**/mock_certificates/**/*.pem"
- "**/constants/mockCertificates.ts"
- "common/src/mock_certificates/**"
- "common/src/mock_certificates/aadhaar/mockAadhaarCert.ts"
- "common/src/utils/passports/genMockIdDoc.ts"
# Test files with mock credentials
- "**/rn-sdk/src/__tests__/**"
# Test data files
- "**/test/**/*.key"
- "**/test/**/*.crt"
- "**/test/**/*.pem"
- "**/tests/**/*.key"
- "**/tests/**/*.crt"
- "**/tests/**/*.pem"
# Mock data files
- "**/mock/**/*.key"
- "**/mock/**/*.crt"
- "**/mock/**/*.pem"
# Demo app test data
- "**/demo-app/**/mock/**"
- "**/demo-app/**/test-data/**"
- "**/test-data/**"
- "**/mock-data/**"
# Generated test files
- "**/generated/**/*.key"
- "**/generated/**/*.crt"
- "**/generated/**/*.pem"
# iOS frameworks and build artifacts
- "**/*.xcframework"
- "**/*.xcframework/**"
- "**/*.swiftinterface"
- "**/NFCPassportReader.xcframework/**"
- "**/OpenSSL.xcframework/**"
- "**/SelfSDK.xcframework/**"
- "**/packages/mobile-sdk-alpha/ios/Frameworks/**"
- "**/packages/mobile-sdk-alpha/ios/SelfSDK/**"
# Ignore specific secret types for mock files
secrets_ignore:
- "Generic Private Key" # For mock certificate keys
- "Generic Certificate" # For mock certificates
- "RSA Private Key" # For mock RSA keys
- "EC Private Key" # For mock EC keys
secret:
ignored_matches:
- match: 2036b4e50ad3042969b290e354d9864465107a14de6f5a36d49f81ea8290def8
name: prebuilt-ios-arm64-apple-ios.private.swiftinterface
ignored_paths:
- ".gitleaks.toml"
- "**/*.swiftinterface"
- "**/*.xcframework/**"
- "**/packages/mobile-sdk-alpha/ios/Frameworks/**"
- "**/OpenSSL.xcframework/**"
- "**/demo-app/**/mock/**"
- common/src/mock_certificates/aadhaar/mockAadhaarCert.ts
- "**/NFCPassportReader.xcframework/**"
- common/src/utils/passports/genMockIdDoc.ts
- "**/tests/**/*.crt"
- "**/mock_certificates/**/*.crt"
- "**/mock_certificates/**/*.key"
- "**/demo-app/**/test-data/**"
- "**/generated/**/*.key"
- "**/SelfSDK.xcframework/**"
- "**/mock/**/*.crt"
- "**/generated/**/*.crt"
- "**/test/**/*.key"
- "**/mock/**/*.key"
- "**/test/**/*.crt"
- "**/test/**/*.pem"
- "**/constants/mockCertificates.ts"
- "**/mock/**/*.pem"
- "**/mock_certificates/**/*.pem"
- "**/mock-data/**"
- "**/packages/mobile-sdk-alpha/ios/SelfSDK/**"
- "**/tests/**/*.key"
- "**/generated/**/*.pem"
- "**/tests/**/*.pem"
- "**/test-data/**"
- common/src/mock_certificates/**
- "**/*.xcframework"
version: 2
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug Report
about: Report a bug or unexpected behavior
title: '[Bug] '
labels: bug
assignees: ''
---
> **⚠️ Security Issues**: If you've discovered a security vulnerability, **do not** open a public issue. Please report it responsibly by emailing **team@self.xyz** instead.
## Description
_A clear and concise description of what the bug is._
## Steps to Reproduce
1.
2.
3.
## Expected Behavior
_What you expected to happen._
## Actual Behavior
_What actually happened._
## Environment (optional)
- Workspace: _e.g., app, circuits, contracts, sdk/core, etc._
- Platform: _e.g., iOS, Android, Web_
- Version: _if applicable_
## Additional Context
_Any other context, logs, or screenshots that might help._
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature Request / Contribution
about: Suggest a new feature or propose a contribution
title: '[Feature] '
labels: enhancement
assignees: ''
---
> **💡 For Complex Features**: If your contribution targets core components or introduces complex features, please open an issue first to discuss your implementation plan before starting development. See [contribute.md](https://github.com/selfxyz/self/blob/dev/contribute.md) for guidelines.
## Description
_A clear description of what you want to build or contribute._
## Motivation
_Why is this feature useful? What problem does it solve?_
## Proposed Solution (optional)
_If you have ideas on how to implement this, describe them here._
## Workspace (optional)
_Which workspace(s) would this affect? (e.g., app, circuits, contracts, sdk/core, etc.)_
## Additional Context
_Any other context, mockups, or examples._
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Summary
<!-- Brief description of changes -->
## Test plan
<!-- How was this tested? -->
---
### Native Consolidation Checklist
<!-- Check items that apply to this PR. Delete section if not touching native code. -->
- [ ] CONTRACTS.md reviewed - no unintended contract changes
- [ ] Layer 1 bridge contract tests pass (`cd app && yarn jest:run` / `yarn workspace @selfxyz/rn-sdk-test-app test`)
- [ ] Layer 3 builds pass (app iOS, RN test app iOS, RN test app Android)
- [ ] Layer 4 manual smoke test signed off (if consolidation PR)
- [ ] No new native business logic added (logic belongs in TypeScript)
================================================
FILE: .github/actionlint.yaml
================================================
# Actionlint configuration to register custom runner labels
# This prevents actionlint warnings about unrecognized runner labels
# Custom runner labels used in this repository
labels:
# Namespace-managed Apple Silicon runners
- namespace-profile-apple-silicon-6cpu
# High-memory runners for circuit compilation
- "128ram"
================================================
FILE: .github/actions/cache-built-deps/action.yml
================================================
name: cache-built-deps
description: Cache built JS artifacts (common + mobile-sdk-alpha)
inputs:
cache-version:
description: Cache version string for cache key
required: true
outputs:
cache-hit:
description: Whether cache was hit during restore
value: ${{ steps.restore.outputs.cache-hit }}
runs:
using: composite
steps:
- id: restore
name: Restore Built Dependencies
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ inputs.cache-version }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Save Built Dependencies
if: steps.restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ inputs.cache-version }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
================================================
FILE: .github/actions/cache-bundler/action.yml
================================================
name: Cache Bundler
description: Cache Ruby gems installed via Bundler.
inputs:
path:
description: Paths to cache
required: false
default: vendor/bundle
lock-file:
description: Path to Gemfile.lock
required: false
default: Gemfile.lock
cache-version:
description: Additional cache version segment
required: false
default: v1
outputs:
cache-hit:
description: Whether an exact match was found for the cache key
value: ${{ steps.cache.outputs.cache-hit }}
runs:
using: "composite"
steps:
- id: get-hash
name: Hash lock file
shell: bash
run: |
if [ -f "${{ inputs.lock-file }}" ]; then
echo "hash=$(shasum -a 256 "${{ inputs.lock-file }}" | awk '{ print $1 }')" >> $GITHUB_OUTPUT
else
echo "::warning::Lock file '${{ inputs.lock-file }}' not found."
echo "hash=no-lock-file" >> $GITHUB_OUTPUT
fi
- id: cache
name: Cache Ruby gems
uses: actions/cache@v4
with:
path: ${{ inputs.path }}
key: ${{ runner.os }}-gems-${{ inputs.cache-version }}-${{ steps.get-hash.outputs.hash }}
restore-keys: |
${{ runner.os }}-gems-${{ inputs.cache-version }}-
${{ runner.os }}-gems-
================================================
FILE: .github/actions/cache-core-sdk-build/action.yml
================================================
name: Cache Core SDK Build
description: Cache core SDK build artifacts (common, sdk/core)
inputs:
mode:
description: "save or restore"
required: true
cache-version:
description: Cache version string
required: false
default: v1
fail-on-cache-miss:
description: Fail if cache not found (restore mode only)
required: false
default: "false"
outputs:
cache-hit:
description: Whether cache was hit
value: ${{ steps.restore.outputs.cache-hit }}
runs:
using: composite
steps:
- id: restore
if: inputs.mode == 'restore'
uses: actions/cache/restore@v4
with:
path: |
common/dist
sdk/core/dist
node_modules
sdk/core/node_modules
common/node_modules
key: core-sdk-build-${{ inputs.cache-version }}-${{ github.sha }}
fail-on-cache-miss: ${{ inputs.fail-on-cache-miss }}
- id: save
if: inputs.mode == 'save'
uses: actions/cache/save@v4
with:
path: |
common/dist
sdk/core/dist
node_modules
sdk/core/node_modules
common/node_modules
key: core-sdk-build-${{ inputs.cache-version }}-${{ github.sha }}
================================================
FILE: .github/actions/cache-gradle/action.yml
================================================
name: Cache Gradle
description: Cache Gradle wrappers and dependencies.
inputs:
path:
description: Paths to cache
required: false
default: |
~/.gradle/caches/modules-*
~/.gradle/caches/jars-*
~/.gradle/caches/build-cache-*
~/.gradle/wrapper
cache-version:
description: Additional cache version segment
required: false
default: v1
outputs:
cache-hit:
description: Whether an exact match was found for the cache key
value: ${{ steps.cache.outputs.cache-hit }}
runs:
using: "composite"
steps:
- id: cache
name: Cache Gradle
uses: actions/cache@v4
with:
path: ${{ inputs.path }}
key: ${{ runner.os }}-gradle-${{ inputs.cache-version }}-${{ hashFiles('**/build.gradle', '**/settings.gradle', '**/gradle-wrapper.properties', '**/gradle.properties') }}
restore-keys: |
${{ runner.os }}-gradle-${{ inputs.cache-version }}-
${{ runner.os }}-gradle-
================================================
FILE: .github/actions/cache-mobile-sdk-build/action.yml
================================================
name: Cache Mobile SDK Build
description: Cache mobile SDK build artifacts (common, mobile-sdk-alpha)
inputs:
mode:
description: "save or restore"
required: true
cache-version:
description: Cache version string
required: false
default: v1
fail-on-cache-miss:
description: Fail if cache not found (restore mode only)
required: false
default: "false"
outputs:
cache-hit:
description: Whether cache was hit
value: ${{ steps.restore.outputs.cache-hit }}
runs:
using: composite
steps:
- id: restore
if: inputs.mode == 'restore'
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
node_modules
packages/mobile-sdk-alpha/node_modules
common/node_modules
key: mobile-sdk-alpha-build-${{ inputs.cache-version }}-${{ github.sha }}
fail-on-cache-miss: ${{ inputs.fail-on-cache-miss }}
- id: save
if: inputs.mode == 'save'
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
node_modules
packages/mobile-sdk-alpha/node_modules
common/node_modules
key: mobile-sdk-alpha-build-${{ inputs.cache-version }}-${{ github.sha }}
================================================
FILE: .github/actions/cache-pods/action.yml
================================================
name: Cache Pods
description: Cache CocoaPods dependencies.
inputs:
path:
description: Paths to cache
required: false
default: |
ios/Pods
~/Library/Caches/CocoaPods
lockfile:
description: Path to Podfile.lock
required: false
default: ios/Podfile.lock
cache-version:
description: Additional cache version segment
required: false
default: v1
outputs:
cache-hit:
description: Whether an exact match was found for the cache key
value: ${{ steps.cache.outputs.cache-hit }}
runs:
using: "composite"
steps:
- id: cache
name: Cache Pods
uses: actions/cache@v4
with:
path: ${{ inputs.path }}
key: ${{ runner.os }}-pods-${{ inputs.cache-version }}-${{ hashFiles(inputs.lockfile) }}
restore-keys: |
${{ runner.os }}-pods-${{ inputs.cache-version }}-
${{ runner.os }}-pods-
================================================
FILE: .github/actions/cache-sdk-build/action.yml
================================================
name: Cache SDK Build
description: Cache SDK build artifacts (common, sdk-common, qrcode)
inputs:
mode:
description: "save or restore"
required: true
cache-version:
description: Cache version string
required: false
default: v1
fail-on-cache-miss:
description: Fail if cache not found (restore mode only)
required: false
default: "false"
outputs:
cache-hit:
description: Whether cache was hit
value: ${{ steps.restore.outputs.cache-hit }}
runs:
using: composite
steps:
- id: restore
if: inputs.mode == 'restore'
uses: actions/cache/restore@v4
with:
path: |
common/dist
sdk/sdk-common/dist
sdk/qrcode/dist
key: qrcode-sdk-build-${{ inputs.cache-version }}-${{ github.sha }}
fail-on-cache-miss: ${{ inputs.fail-on-cache-miss }}
- id: save
if: inputs.mode == 'save'
uses: actions/cache/save@v4
with:
path: |
common/dist
sdk/sdk-common/dist
sdk/qrcode/dist
key: qrcode-sdk-build-${{ inputs.cache-version }}-${{ github.sha }}
================================================
FILE: .github/actions/cache-yarn/action.yml
================================================
name: Cache Yarn
description: Cache Yarn dependencies with consistent keys and paths.
inputs:
path:
description: Paths to cache
required: false
default: |
.yarn/cache
lock-file:
description: Path to yarn.lock
required: false
default: yarn.lock
cache-version:
description: Additional cache version segment
required: false
default: v1
outputs:
cache-hit:
description: Whether an exact match was found for the cache key
value: ${{ steps.cache.outputs.cache-hit }}
runs:
using: "composite"
steps:
- id: get-hash
name: Hash lock file
shell: bash
run: |
if [ -f "${{ inputs.lock-file }}" ]; then
echo "hash=$(shasum -a 256 "${{ inputs.lock-file }}" | awk '{ print $1 }')" >> $GITHUB_OUTPUT
else
echo "::warning::Lock file '${{ inputs.lock-file }}' not found."
echo "hash=no-lock-file" >> $GITHUB_OUTPUT
fi
- id: cache
name: Cache Yarn dependencies
uses: actions/cache@v4
with:
path: ${{ inputs.path }}
key: ${{ runner.os }}-yarn-${{ inputs.cache-version }}-${{ steps.get-hash.outputs.hash }}
restore-keys: |
${{ runner.os }}-yarn-${{ inputs.cache-version }}-
${{ runner.os }}-yarn-
================================================
FILE: .github/actions/cleanup-gradle-artifacts/action.yml
================================================
name: Clean Up Gradle Artifacts
description: Clean up unnecessary Gradle build artifacts to save disk space and reduce cache size.
runs:
using: "composite"
steps:
- name: Clean up Gradle build artifacts
shell: bash
run: |
echo "Cleaning up unnecessary build artifacts to save disk space..."
# Remove build outputs (APK/AAB already tested, no need to cache them)
# Find all Android build directories and clean up intermediates and tmp
find . -type d -path "*/android/app/build/intermediates" -exec rm -rf {} + 2>/dev/null || true
find . -type d -path "*/android/app/build/tmp" -exec rm -rf {} + 2>/dev/null || true
# Clean up Gradle daemon logs and lock files
rm -rf ~/.gradle/daemon
rm -rf ~/.gradle/*.lock
# Remove large cache files that aren't needed for subsequent builds
find ~/.gradle/caches -name "*.lock" -delete 2>/dev/null || true
find ~/.gradle/caches -type f -name "gc.properties" -delete 2>/dev/null || true
echo "Disk usage after cleanup:"
df -h
================================================
FILE: .github/actions/clone-android-passport-nfc-reader/action.yml
================================================
name: Clone android-passport-nfc-reader
description: "Clones the android-passport-nfc-reader repository if it does not exist"
inputs:
working_directory:
description: "Working directory path (where android/ subdirectory is located)"
required: false
default: "."
selfxyz_internal_pat:
description: "SELFXYZ internal repository PAT for private repository access"
required: false
runs:
using: "composite"
steps:
- name: Clone android-passport-nfc-reader
shell: bash
run: |
set -euo pipefail
# Check if PAT is available for private module cloning
if [ -z "${{ inputs.selfxyz_internal_pat }}" ]; then
echo "🔒 Skipping private module cloning (no PAT provided)"
echo "ℹ️ This is expected for forked PRs - build will continue without private modules"
exit 0
fi
cd "${{ inputs.working_directory }}"
if [ ! -d "android/android-passport-nfc-reader" ]; then
echo "📦 Cloning android-passport-nfc-reader for build..."
cd android
# Clone using PAT (embed temporarily, then scrub)
if git clone --depth 1 --quiet "https://${{ inputs.selfxyz_internal_pat }}@github.com/selfxyz/android-passport-nfc-reader.git"; then
echo "✅ android-passport-nfc-reader cloned successfully"
# Immediately scrub the credential from remote URL for security
git -C android-passport-nfc-reader remote set-url origin https://github.com/selfxyz/android-passport-nfc-reader.git || true
else
echo "❌ Failed to clone android-passport-nfc-reader"
echo "Please ensure a valid SELFXYZ internal PAT is provided to this action"
exit 1
fi
elif [ "$CI" = "true" ]; then
echo "⚠️ android-passport-nfc-reader exists in CI - this is unexpected"
echo "📁 Directory contents:"
ls -la android/android-passport-nfc-reader/ || true
else
echo "📁 android-passport-nfc-reader already exists - preserving existing directory"
echo "ℹ️ Local development environment detected - your changes are safe"
fi
================================================
FILE: .github/actions/create-version-bump-pr/action.yml
================================================
name: Create Version Bump PR
description: Creates a PR from staging changes onto dev branch
inputs:
platform:
description: Platform name (ios or android)
required: true
version:
description: Current version string
required: true
file_paths:
description: File paths to include in the PR (newline separated)
required: true
github_token:
description: GitHub token for creating PR
required: true
runs:
using: composite
steps:
- name: Create version bump PR
shell: bash
run: |
BRANCH_NAME="ci/bump-${{ inputs.platform }}-build-${{ github.run_id }}"
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Ensure we're on staging branch, not detached HEAD
git fetch origin staging dev
git checkout staging
# Check if staging has commits not in dev (version bumps + any build changes)
COMMITS_AHEAD=$(git rev-list --count origin/dev..staging)
if [ "$COMMITS_AHEAD" -eq 0 ]; then
echo "ℹ️ No new commits on staging compared to dev. Skipping PR creation."
exit 0
fi
echo "📊 Staging is $COMMITS_AHEAD commit(s) ahead of dev"
# Create new branch from current staging (which has all version changes)
git checkout -b ${BRANCH_NAME}
# Push the branch
git push --set-upstream origin ${BRANCH_NAME}
# Determine PR title based on platform
if [ "${{ inputs.platform }}" = "mobile" ]; then
PR_TITLE="chore: bump mobile app version to ${{ inputs.version }}"
else
PR_TITLE="chore: bump ${{ inputs.platform }} build for ${{ inputs.version }}"
fi
gh pr create \
--base dev \
--head ${BRANCH_NAME} \
--title "$PR_TITLE" \
--body "Automated version bump by CI" \
--label "automated"
env:
GH_TOKEN: ${{ inputs.github_token }}
================================================
FILE: .github/actions/find-ios-simulator/action.yml
================================================
name: Find iOS Simulator
description: >-
Finds an iPhone simulator to use for an iOS build. If a workspace and scheme
are provided, uses `xcodebuild -showdestinations` so only simulators the
scheme can actually build for are eligible. Falls back to `simctl list`
when no scheme is supplied.
inputs:
preferred-device:
description: Preferred iPhone device name (substring match allowed).
required: false
default: iPhone SE (3rd generation)
preferred-runtime:
description: >-
Preferred iOS runtime version (for example 18.4). Soft preference —
used as a tiebreaker, not a hard filter, so runner image bumps don't
break the pipeline.
required: false
default: ""
workspace:
description: >-
Path to the .xcworkspace. When set together with `scheme`, eligible
simulators are restricted to destinations the scheme supports.
required: false
default: ""
scheme:
description: Scheme to query via xcodebuild -showdestinations.
required: false
default: ""
outputs:
id:
description: UUID of the selected iPhone simulator
value: ${{ steps.find.outputs.id }}
name:
description: Name of the selected iPhone simulator
value: ${{ steps.find.outputs.name }}
runtime:
description: Runtime identifier (or OS version) of the selected simulator
value: ${{ steps.find.outputs.runtime }}
runs:
using: composite
steps:
- id: find
shell: bash
run: |
set -u
PREFERRED_DEVICE="${{ inputs.preferred-device }}"
PREFERRED_RUNTIME="${{ inputs.preferred-runtime }}"
WORKSPACE="${{ inputs.workspace }}"
SCHEME="${{ inputs.scheme }}"
SOURCE=""
PAYLOAD=""
if [ -n "$WORKSPACE" ] && [ -n "$SCHEME" ]; then
echo "Querying xcodebuild -showdestinations for $WORKSPACE / $SCHEME"
# -showdestinations writes destinations to stdout; also prints build
# settings chatter we don't care about. Capture everything; the
# parser filters by `platform:iOS Simulator`.
if PAYLOAD=$(xcodebuild -showdestinations -workspace "$WORKSPACE" -scheme "$SCHEME" 2>&1); then
SOURCE="xcodebuild"
else
echo "xcodebuild -showdestinations failed; falling back to simctl" >&2
fi
fi
if [ -z "$SOURCE" ]; then
echo "Listing simulators via simctl"
PAYLOAD=$(xcrun simctl list devices available -j)
SOURCE="simctl"
fi
SIM_SELECTION=$(
SOURCE="$SOURCE" \
PAYLOAD="$PAYLOAD" \
PREFERRED_DEVICE="$PREFERRED_DEVICE" \
PREFERRED_RUNTIME="$PREFERRED_RUNTIME" \
python3 - <<'PY'
import json
import os
import re
import sys
source = os.environ["SOURCE"]
payload = os.environ["PAYLOAD"]
preferred_device = os.environ.get("PREFERRED_DEVICE", "").strip().lower()
preferred_runtime = os.environ.get("PREFERRED_RUNTIME", "").strip()
# Tolerate full runtime identifiers like
# "com.apple.CoreSimulator.SimRuntime.iOS-18-4" — reduce to "18.4".
rt_match = re.search(r"(\d+(?:[-.]\d+)+)", preferred_runtime)
preferred_runtime = rt_match.group(1).replace("-", ".") if rt_match else ""
candidates = []
if source == "xcodebuild":
# Lines look like:
# { platform:iOS Simulator, arch:arm64, id:UDID, OS:18.6, name:iPhone 16 }
pattern = re.compile(
r"platform:iOS Simulator[^}]*?id:([0-9A-Fa-f-]+)[^}]*?OS:([0-9.]+)[^}]*?name:([^,}]+?)\s*(?:,|})"
)
for match in pattern.finditer(payload):
udid, os_version, name = match.groups()
name = name.strip()
if "iPhone" not in name:
continue
candidates.append(
{
"id": udid,
"name": name,
"runtime": os_version,
"runtime_version": os_version,
}
)
else:
data = json.loads(payload)
for runtime, devices in data["devices"].items():
if "iOS" not in runtime:
continue
version_match = re.search(r"iOS[- ](\d+(?:[-.]\d+)*)", runtime)
runtime_version = (
version_match.group(1).replace("-", ".") if version_match else ""
)
for device in devices:
if not device.get("isAvailable"):
continue
if "iPhone" not in device.get("name", ""):
continue
candidates.append(
{
"id": device["udid"],
"name": device["name"],
"runtime": runtime,
"runtime_version": runtime_version,
}
)
if not candidates:
sys.exit(1)
def version_tuple(candidate):
version = candidate["runtime_version"]
if not version:
return ()
return tuple(int(part) for part in version.split("."))
def score(candidate):
name_lower = candidate["name"].lower()
exact_name = bool(preferred_device) and name_lower == preferred_device
partial_name = bool(preferred_device) and preferred_device in name_lower
runtime_match = (
bool(preferred_runtime)
and candidate["runtime_version"] == preferred_runtime
)
# Higher tuple wins. Name match dominates so we never pick a random
# iPhone over the preferred one; runtime match is a soft tiebreaker;
# newest OS breaks remaining ties.
return (
int(exact_name),
int(partial_name),
int(runtime_match),
version_tuple(candidate),
)
best = max(candidates, key=score)
print(f'{best["id"]}\t{best["name"]}\t{best["runtime"]}')
PY
)
if [ -z "$SIM_SELECTION" ]; then
echo "No eligible iPhone simulators found (source=$SOURCE)"
exit 1
fi
SIM_ID=$(printf '%s' "$SIM_SELECTION" | cut -f1)
SIM_NAME=$(printf '%s' "$SIM_SELECTION" | cut -f2)
SIM_RUNTIME=$(printf '%s' "$SIM_SELECTION" | cut -f3)
echo "Selected simulator: $SIM_NAME ($SIM_ID) [$SIM_RUNTIME] via $SOURCE"
echo "id=$SIM_ID" >> "$GITHUB_OUTPUT"
echo "name=$SIM_NAME" >> "$GITHUB_OUTPUT"
echo "runtime=$SIM_RUNTIME" >> "$GITHUB_OUTPUT"
================================================
FILE: .github/actions/free-disk-space/action.yml
================================================
name: Free Disk Space
description: Free up disk space on GitHub Actions runners by removing unnecessary pre-installed tools.
runs:
using: "composite"
steps:
- name: Free up disk space
shell: bash
run: |
echo "Disk usage before cleanup:"
df -h
# Remove unnecessary pre-installed tools to free up space
# These are commonly available on GitHub runners but not needed for most builds
# DO NOT remove $AGENT_TOOLSDIRECTORY as it contains active tools like Node.js
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/share/boost
# Remove unused languages from hostedtoolcache to save space
# but preserve the directory structure and Node.js
sudo rm -rf /opt/hostedtoolcache/CodeQL 2>/dev/null || true
sudo rm -rf /opt/hostedtoolcache/PyPy 2>/dev/null || true
sudo rm -rf /opt/hostedtoolcache/go 2>/dev/null || true
sudo rm -rf /opt/hostedtoolcache/Ruby 2>/dev/null || true
echo "Disk usage after cleanup:"
df -h
================================================
FILE: .github/actions/generate-github-token/action.yml
================================================
name: "Generate GitHub App Token"
description: "Generates a GitHub App token for accessing repositories in the selfxyz organization"
inputs:
app-id:
description: "The GitHub App ID"
required: true
private-key:
description: "The GitHub App private key"
required: true
configure-netrc:
description: "If true, writes a ~/.netrc entry for github.com using the generated token (useful for CocoaPods / git HTTPS fetches)"
required: false
default: "false"
netrc-machine:
description: "The machine hostname to write into ~/.netrc (default: github.com)"
required: false
default: "github.com"
owner:
description: "The owner (organization) of the repositories"
required: false
default: "selfxyz"
repositories:
description: "Comma-separated list of repository names to grant access to"
required: false
default: "NFCPassportReader,android-passport-nfc-reader,react-native-passport-reader,mobile-sdk-native"
outputs:
token:
description: "The generated GitHub App installation token"
value: ${{ steps.app-token.outputs.token }}
runs:
using: "composite"
steps:
- name: Generate GitHub App Token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2
id: app-token
with:
app-id: ${{ inputs.app-id }}
private-key: ${{ inputs.private-key }}
owner: ${{ inputs.owner }}
repositories: ${{ inputs.repositories }}
- name: Configure Git auth via ~/.netrc (optional)
if: ${{ inputs.configure-netrc == 'true' }}
shell: bash
run: |
set -euo pipefail
TOKEN="${{ steps.app-token.outputs.token }}"
MACHINE="${{ inputs.netrc-machine }}"
# Mask the token in logs defensively (it shouldn't print, but this protects against future edits).
echo "::add-mask::${TOKEN}"
printf "machine %s\n login x-access-token\n password %s\n" "${MACHINE}" "${TOKEN}" > "${HOME}/.netrc"
chmod 600 "${HOME}/.netrc"
================================================
FILE: .github/actions/get-version/action.yml
================================================
name: Get Version from package.json
description: "Gets the version from package.json and sets it as an environment variable"
inputs:
app_path:
description: "Path to the app directory"
required: true
outputs:
version:
description: "Extracted app version from package.json"
value: ${{ steps.get-version.outputs.version }}
runs:
using: "composite"
steps:
- name: Get version from package.json
id: get-version
shell: bash
run: |
VERSION=$(node -p "require('${{ inputs.app_path }}/package.json').version")
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "VERSION=$VERSION" >> $GITHUB_ENV
================================================
FILE: .github/actions/mobile-setup/action.yml
================================================
name: Setup Mobile Environment
description: "Sets up the environment for mobile app builds"
inputs:
app_path:
description: "Path to the app directory"
required: true
node_version:
description: "Node version"
required: true
ruby_version:
description: "Ruby version"
required: true
workspace:
description: "Workspace directory path"
required: true
runs:
using: "composite"
steps:
- name: Install locales and dialog for local development
if: ${{ env.ACT }}
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y locales dialog unzip
# for fastlane
- name: Install locales and dialog
if: runner.os != 'macOS'
shell: bash
run: |
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8
- name: Setup Ruby environment
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ inputs.ruby_version }}
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node_version }}
- name: Configure bundler
shell: bash
run: |
cd ${{ inputs.app_path }}
bundle config set --local path 'vendor/bundle'
bundle config set --local deployment 'true'
echo "✅ Bundler configured for strict mode (deployment=true)"
- name: Install app dependencies
shell: bash
run: |
cd ${{ inputs.app_path }}
# Configure Yarn
corepack enable
yarn set version 4.12.0
echo "📦 Installing JavaScript dependencies with strict lock file..."
if ! yarn install --immutable --inline-builds; then
echo ""
echo "❌ ERROR: yarn.lock is out of date!"
echo ""
echo "This happens when package.json was modified but yarn.lock wasn't updated."
echo ""
echo "To fix this:"
echo " 1. Run 'yarn install' locally in the app directory"
echo " 2. Commit the updated yarn.lock file"
echo " 3. Push your changes"
echo ""
echo "This ensures everyone has the exact same dependency versions."
exit 1
fi
# Run mobile-specific installation
yarn install-app:mobile-deploy
- name: Install Ruby dependencies
shell: bash
run: |
cd ${{ inputs.app_path }}
# Install Ruby gems with bundler (respecting cache)
echo "📦 Installing Ruby gems with strict lock file..."
if ! bundle install --jobs 4 --retry 3; then
echo ""
echo "❌ ERROR: Gemfile.lock is out of date!"
echo ""
echo "This happens when Gemfile was modified but Gemfile.lock wasn't updated."
echo ""
echo "To fix this:"
echo " 1. Run 'bundle install' locally in the app directory"
echo " 2. Commit the updated Gemfile.lock file"
echo " 3. Push your changes"
echo ""
echo "This ensures everyone has the exact same gem versions."
exit 1
fi
================================================
FILE: .github/actions/push-changes/action.yml
================================================
name: Push Build Version Changes
description: "Commits and pushes build version changes for mobile platforms"
inputs:
commit_message:
description: "Commit message"
required: true
commit_paths:
description: "Space-separated list of paths to check for changes (e.g. 'ios/file.txt android/another/file.xml')"
required: true
runs:
using: "composite"
steps:
- name: Configure Git
shell: bash
run: |
set -e
git config --global user.email "action@github.com"
git config --global user.name "Self GitHub Actions"
- name: Commit Changes
shell: bash
run: |
set -e
set -x
# Restore the logic for checking specific paths existence
commit_paths_input="${{ inputs.commit_paths }}"
paths_to_commit=""
for path in $commit_paths_input; do
if [ ! -e "$path" ]; then
echo "Error: Path $path does not exist"
exit 1
fi
paths_to_commit="$paths_to_commit $path"
done
if [ -z "$paths_to_commit" ]; then
echo "No valid paths provided."
exit 1
fi
# Remove leading space if present
paths_to_commit=$(echo "$paths_to_commit" | sed 's/^ *//')
# Stage ONLY the specified paths
git add $paths_to_commit
# Check if there are staged changes ONLY in the specified paths
if git diff --staged --quiet -- $paths_to_commit; then
echo "No changes to commit in the specified paths: $paths_to_commit"
else
echo "Changes to be committed in paths: $paths_to_commit"
# Show the staged diff for the specified paths
git diff --cached -- $paths_to_commit
git commit -m "chore: ${{ inputs.commit_message }} [github action]"
fi
- name: Push Changes
shell: bash
run: |
set -e
set -x
if git rev-parse --verify HEAD >/dev/null 2>&1; then
if [[ ${{ github.ref }} == refs/pull/* ]]; then
CURRENT_BRANCH=${{ github.head_ref }}
else
CURRENT_BRANCH=$(echo ${{ github.ref }} | sed 's|refs/heads/||')
fi
echo "Pushing changes to branch: $CURRENT_BRANCH"
# Add --autostash to handle potential unstaged changes gracefully
git pull --rebase --autostash origin $CURRENT_BRANCH || {
echo "Failed to pull from $CURRENT_BRANCH"
exit 1
}
git push origin HEAD:$CURRENT_BRANCH || {
echo "Failed to push to $CURRENT_BRANCH"
exit 1
}
else
echo "No new commits to push"
fi
================================================
FILE: .github/actions/yarn-install/action.yml
================================================
name: Yarn Install
description: Install Yarn v4 and run yarn install.
inputs:
working_directory:
description: The directory to install dependencies in.
required: false
default: "."
runs:
using: "composite"
steps:
- name: Install Yarn v4
shell: bash
run: |
corepack enable
corepack prepare yarn@4.12.0 --activate
# Ensure we're using the correct version
yarn --version
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: "yarn"
cache-dependency-path: |
yarn.lock
.yarnrc.yml
- name: Install dependencies
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 3
retry_wait_seconds: 5
command: yarn install --immutable
================================================
FILE: .github/actions/yarnrc-hash/action.yml
================================================
name: Compute .yarnrc.yml hash
description: Compute a stable hash for .yarnrc.yml to use in cache keys.
outputs:
hash:
description: Hash of .yarnrc.yml (or "no-yarnrc" if the file is missing)
value: ${{ steps.compute-yarnrc-hash.outputs.hash }}
runs:
using: composite
steps:
- name: Compute .yarnrc.yml hash
id: compute-yarnrc-hash
shell: bash
run: |
if [ -f .yarnrc.yml ]; then
if command -v shasum >/dev/null 2>&1; then
echo "hash=$(shasum -a 256 .yarnrc.yml | awk '{ print $1 }')" >> "$GITHUB_OUTPUT"
else
echo "hash=$(sha256sum .yarnrc.yml | awk '{ print $1 }')" >> "$GITHUB_OUTPUT"
fi
else
echo "hash=no-yarnrc" >> "$GITHUB_OUTPUT"
fi
================================================
FILE: .github/workflows/block-non-dev-to-main.yml
================================================
name: Block non-staging PRs to main
on:
pull_request:
branches: [main]
jobs:
check-source:
runs-on: ubuntu-latest
steps:
- name: Block PRs not from staging
run: |
if [[ "${{ github.head_ref }}" != "staging" ]]; then
echo "You can only merge from staging to main."
exit 1
fi
================================================
FILE: .github/workflows/circuits-build.yml
================================================
name: Circuits Build
on:
pull_request:
branches:
- dev
- staging
- main
paths:
- "circuits/circuits/**"
- ".github/workflows/artifacts.yml"
workflow_dispatch:
inputs:
circuit-type:
description: "Circuits to build (comma-separated: register, register_id, register_aadhaar, disclose, dsc). Leave empty to build all."
required: false
type: string
default: ""
circuit-name:
description: "Circuit names to build (comma-separated: register_sha256_sha224_sha224_ecdsa_secp224r1, dsc_sha256_rsa_65537_4096). Cannot be used with circuit-type."
required: false
type: string
default: ""
run-id:
description: "Run ID to download artifacts ."
required: false
type: string
default: ""
concurrency:
group: circuits-build-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on:
- "32ram"
- "self-hosted"
- "selfxyz-org"
# GitHub-hosted runners cap at 360 min (6h); 720 applies if using self-hosted
timeout-minutes: 720
permissions:
contents: read
actions: read
env:
CIRCOM_VERSION: "2.1.9"
CIRCOM_SHA256: "e5575829252d763b7818049df9de2ef9304df834697de77fa63ce7babc23c967"
steps:
- name: Checkout Repository
uses: actions/checkout@v6
- name: Install cpp dependencies
run: |
sudo apt-get update
sudo apt-get install --yes \
build-essential \
libgmp-dev \
libsodium-dev \
nasm \
nlohmann-json3-dev \
wget
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Restore Circom binary
id: circom-cache
uses: actions/cache/restore@v4
with:
path: ~/.cache/circom
key: circom-v2.1.9
- name: Download Circom Binary v2.1.9
if: steps.circom-cache.outputs.cache-hit != 'true'
run: |
mkdir -p ~/.cache/circom
# Download with curl (more reliable than wget in CI environments)
# Use exponential backoff retry logic
for attempt in 1 2 3; do
echo "Download attempt $attempt/3..."
if curl -L --connect-timeout 30 --max-time 300 \
--retry 3 --retry-delay 2 --retry-max-time 600 \
-o ~/.cache/circom/circom \
"https://github.com/iden3/circom/releases/download/v${{ env.CIRCOM_VERSION }}/circom-linux-amd64"; then
echo "✅ Download successful!"
break
else
echo "❌ Download failed on attempt $attempt"
if [ $attempt -eq 3 ]; then
echo "💥 All download attempts failed"
exit 1
fi
# Exponential backoff: 5s, 10s, 20s
sleep_time=$((5 * attempt))
echo "⏳ Waiting ${sleep_time}s before retry..."
sleep $sleep_time
fi
done
# Verify file exists and has content
if [ ! -f ~/.cache/circom/circom ]; then
echo "💥 Error: circom binary file is missing"
exit 1
fi
if [ ! -s ~/.cache/circom/circom ]; then
echo "💥 Error: circom binary file is empty"
exit 1
fi
echo "📁 File size: $(ls -lh ~/.cache/circom/circom | awk '{print $5}')"
chmod +x ~/.cache/circom/circom
# Verify checksum
echo "🔍 Verifying checksum..."
echo "${{ env.CIRCOM_SHA256 }} $HOME/.cache/circom/circom" | sha256sum -c -
- name: Save Circom cache
if: steps.circom-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: ~/.cache/circom
key: circom-v2.1.9
- name: Verify Circom checksum (cache hit)
if: steps.circom-cache.outputs.cache-hit == 'true'
run: |
echo "${{ env.CIRCOM_SHA256 }} $HOME/.cache/circom/circom" | sha256sum -c -
- name: Add Circom to PATH
run: echo "$HOME/.cache/circom" >> "$GITHUB_PATH"
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Install Yarn
run: npm i -g yarn
- name: Install dependencies
uses: ./.github/actions/yarn-install
with:
working_directory: circuits
- name: Print Circom version
run: circom --version
- name: Download previous artifacts
if: github.event_name == 'workflow_dispatch' && inputs.run-id != ''
uses: dawidd6/action-download-artifact@v6
with:
name: circuits
path: output/
run_id: ${{ inputs.run-id }}
- name: Prepare build scripts
run: |
chmod +x circuits/scripts/build/build_cpp.sh
chmod +x circuits/scripts/build/build_single_circuit.sh
# Validate inputs - only one should be provided
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [[ "${{ inputs.circuit-type }}" != "" && "${{ inputs.circuit-name }}" != "" ]]; then
echo "Error: Cannot provide both circuit-type and circuit-name. Use only one."
exit 1
fi
fi
- name: Build cpp circuits (workflow_dispatch by name/type)
if: github.event_name == 'workflow_dispatch' && (inputs.circuit-name != '' || inputs.circuit-type != '')
run: |
if [[ "${{ inputs.circuit-name }}" != "" ]]; then
INPUT_CIRCUITS="${{ inputs.circuit-name }}"
INPUT_CIRCUITS=$(echo "$INPUT_CIRCUITS" | tr -d ' ')
IFS=',' read -ra CIRCUITS_ARRAY <<< "$INPUT_CIRCUITS"
echo "Building selected circuits by name: ${{ inputs.circuit-name }}"
for circuit_name in "${CIRCUITS_ARRAY[@]}"; do
echo "Building circuit: $circuit_name"
./circuits/scripts/build/build_single_circuit.sh "$circuit_name"
done
else
INPUT_CIRCUITS="${{ inputs.circuit-type }}"
INPUT_CIRCUITS=$(echo "$INPUT_CIRCUITS" | tr -d ' ')
IFS=',' read -ra CIRCUITS_ARRAY <<< "$INPUT_CIRCUITS"
echo "Building selected circuits by type: ${{ inputs.circuit-type }}"
for circuit in "${CIRCUITS_ARRAY[@]}"; do
echo "Building circuit: $circuit"
./circuits/scripts/build/build_cpp.sh "$circuit"
done
fi
- name: Build cpp circuits - register
if: github.event_name != 'workflow_dispatch' || (inputs.circuit-name == '' && inputs.circuit-type == '')
run: ./circuits/scripts/build/build_cpp.sh register
- name: Build cpp circuits - register_id
if: github.event_name != 'workflow_dispatch' || (inputs.circuit-name == '' && inputs.circuit-type == '')
run: ./circuits/scripts/build/build_cpp.sh register_id
- name: Build cpp circuits - register_aadhaar
if: github.event_name != 'workflow_dispatch' || (inputs.circuit-name == '' && inputs.circuit-type == '')
run: ./circuits/scripts/build/build_cpp.sh register_aadhaar
- name: Build cpp circuits - register_kyc
if: github.event_name != 'workflow_dispatch' || (inputs.circuit-name == '' && inputs.circuit-type == '')
run: ./circuits/scripts/build/build_cpp.sh register_kyc
- name: Build cpp circuits - disclose
if: github.event_name != 'workflow_dispatch' || (inputs.circuit-name == '' && inputs.circuit-type == '')
run: ./circuits/scripts/build/build_cpp.sh disclose
- name: Build cpp circuits - dsc
if: github.event_name != 'workflow_dispatch' || (inputs.circuit-name == '' && inputs.circuit-type == '')
run: ./circuits/scripts/build/build_cpp.sh dsc
- name: Upload Artifact
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
with:
name: circuits
path: output/
================================================
FILE: .github/workflows/circuits.yml
================================================
name: Circuits CI
on:
pull_request:
branches:
- dev
- staging
- main
jobs:
check_changes:
runs-on: ubuntu-slim
outputs:
should_run: ${{ steps.filter.outputs.should_run }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check if should run
id: filter
run: |
set -e
if [[ "${{ github.base_ref }}" == "main" ]] || [[ "${{ github.base_ref }}" == "staging" ]]; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Running for ${{ github.base_ref }} - no path filter"
else
# For dev branch, check if circuits files changed
# Fetch the base branch to ensure it's available for comparison
git fetch origin ${{ github.base_ref }} --depth=1
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) || {
echo "Error: Failed to diff against base branch"
exit 1
}
if echo "$CHANGED_FILES" | grep -qE "^circuits/"; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Running for dev - circuits files changed"
else
echo "should_run=false" >> $GITHUB_OUTPUT
echo "Skipping for dev - no circuits files changed"
fi
fi
run_circuit_tests:
needs: check_changes
if: github.event.pull_request.draft == false && needs.check_changes.outputs.should_run == 'true'
runs-on:
- "self-hosted"
- "selfxyz-org"
- "ubuntu-24-04"
environment: development
permissions:
contents: read
env:
CIRCOM_VERSION: "2.1.9"
CIRCOM_SHA256: "e5575829252d763b7818049df9de2ef9304df834697de77fa63ce7babc23c967"
steps:
- uses: actions/checkout@v6
# Circom installation from https://github.com/erhant/circomkit/blob/main/.github/workflows/tests.yml
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install --yes \
build-essential \
libgmp-dev \
libsodium-dev \
nasm \
nlohmann-json3-dev
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Restore Circom binary
id: circom-cache
uses: actions/cache/restore@v4
with:
path: ~/.cache/circom
key: circom-v2.1.9
- name: Download Circom Binary v2.1.9
if: steps.circom-cache.outputs.cache-hit != 'true'
run: |
mkdir -p ~/.cache/circom
# Download with curl (more reliable than wget in CI environments)
# Use exponential backoff retry logic
for attempt in 1 2 3; do
echo "Download attempt $attempt/3..."
if curl -L --connect-timeout 30 --max-time 300 \
--retry 3 --retry-delay 2 --retry-max-time 600 \
-o ~/.cache/circom/circom \
"https://github.com/iden3/circom/releases/download/v${{ env.CIRCOM_VERSION }}/circom-linux-amd64"; then
echo "✅ Download successful!"
break
else
echo "❌ Download failed on attempt $attempt"
if [ $attempt -eq 3 ]; then
echo "💥 All download attempts failed"
exit 1
fi
# Exponential backoff: 5s, 10s, 20s
sleep_time=$((5 * attempt))
echo "⏳ Waiting ${sleep_time}s before retry..."
sleep $sleep_time
fi
done
# Verify file exists and has content
if [ ! -f ~/.cache/circom/circom ]; then
echo "💥 Error: circom binary file is missing"
exit 1
fi
if [ ! -s ~/.cache/circom/circom ]; then
echo "💥 Error: circom binary file is empty"
exit 1
fi
echo "📁 File size: $(ls -lh ~/.cache/circom/circom | awk '{print $5}')"
chmod +x ~/.cache/circom/circom
# Verify checksum
echo "🔍 Verifying checksum..."
echo "${{ env.CIRCOM_SHA256 }} $HOME/.cache/circom/circom" | sha256sum -c -
- name: Save Circom cache
if: steps.circom-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: ~/.cache/circom
key: circom-v2.1.9
- name: Verify Circom checksum (cache hit)
if: steps.circom-cache.outputs.cache-hit == 'true'
run: |
echo "${{ env.CIRCOM_SHA256 }} $HOME/.cache/circom/circom" | sha256sum -c -
- name: Add Circom to PATH
run: echo "$HOME/.cache/circom" >> "$GITHUB_PATH"
- name: Print Circom version
run: circom --version
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
- name: Enable Corepack
run: corepack enable
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
circuits/node_modules
cache-version: v1
- name: Install Yarn dependencies
uses: ./.github/actions/yarn-install
with:
working_directory: circuits
- name: Run lint
run: yarn workspace @selfxyz/circuits lint
- name: Run Tests (Circuits)
env:
FULL_TEST_SUITE: false
run: yarn workspace @selfxyz/circuits test
================================================
FILE: .github/workflows/common-ci.yml
================================================
name: Common CI
on:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Build dependencies
run: yarn workspace @selfxyz/mobile-app run build:deps
- name: Cache build artifacts
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: build-deps-${{ runner.os }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
lint:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Run linter
run: yarn workspace @selfxyz/common lint
type-check:
runs-on: ubuntu-latest
needs: build
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Restore build artifacts
id: restore-build-deps
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: build-deps-${{ runner.os }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build @selfxyz/common (fallback on cache miss)
if: steps.restore-build-deps.outputs.cache-hit != 'true'
run: yarn workspace @selfxyz/common build
- name: Build @selfxyz/mobile-sdk-alpha
run: yarn workspace @selfxyz/mobile-sdk-alpha build
- name: Build @selfxyz/qrcode
run: yarn workspace @selfxyz/qrcode build:deps
- name: Yarn types
run: yarn types
test-common:
runs-on: ubuntu-latest
needs: build
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Restore build artifacts
id: restore-build-deps
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: build-deps-${{ runner.os }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build @selfxyz/common (fallback on cache miss)
if: steps.restore-build-deps.outputs.cache-hit != 'true'
run: yarn workspace @selfxyz/common build
- name: Build @selfxyz/mobile-sdk-alpha
run: yarn workspace @selfxyz/mobile-sdk-alpha build
- name: Run @selfxyz/common tests
run: yarn workspace @selfxyz/common test
================================================
FILE: .github/workflows/contracts.yml
================================================
name: Contracts CI
on:
pull_request:
branches:
- dev
- staging
- main
env:
GH_HARDHAT_CACHE_VERSION: v1
concurrency:
group: contracts-ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
check_changes:
runs-on: ubuntu-slim
outputs:
should_run: ${{ steps.filter.outputs.should_run }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check if should run
id: filter
run: |
set -e
if [[ "${{ github.base_ref }}" == "main" ]] || [[ "${{ github.base_ref }}" == "staging" ]]; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Running for ${{ github.base_ref }} - no path filter"
else
# For dev branch, check if contracts or common files changed
# Fetch the base branch to ensure it's available for comparison
git fetch origin ${{ github.base_ref }} --depth=1
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) || {
echo "Error: Failed to diff against base branch"
exit 1
}
if echo "$CHANGED_FILES" | grep -qE "^(contracts|common)/"; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Running for dev - contracts or common files changed"
else
echo "should_run=false" >> $GITHUB_OUTPUT
echo "Skipping for dev - no contracts or common files changed"
fi
fi
test_contracts:
needs: check_changes
if: github.event.pull_request.draft == false && needs.check_changes.outputs.should_run == 'true'
runs-on: ubuntu-latest
environment: development
steps:
- uses: actions/checkout@v6
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Set Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Cache Hardhat compilers
uses: actions/cache@v4
with:
path: ~/.cache/hardhat-nodejs/compilers-v2
key: ${{ runner.os }}-hardhat-compilers-${{ env.GH_HARDHAT_CACHE_VERSION }}-${{ hashFiles('contracts/hardhat.config.ts', 'contracts/package.json', 'yarn.lock') }}
restore-keys: |
${{ runner.os }}-hardhat-compilers-${{ env.GH_HARDHAT_CACHE_VERSION }}-
- name: Prettier Check - Code Formatting
run: yarn prettier:check
working-directory: ./contracts
- name: Build Common Dependencies
run: yarn workspace @selfxyz/common build
- name: Build Contracts
uses: nick-fields/retry@v3
with:
timeout_minutes: 15
max_attempts: 3
retry_wait_seconds: 15
command: yarn build
working_directory: ./contracts
- name: Run Tests (Contracts)
working-directory: ./contracts
# skip until they get fixed
if: false
run: yarn test
================================================
FILE: .github/workflows/core-sdk-ci.yml
================================================
name: Core SDK CI
on:
pull_request:
branches:
- dev
- staging
- main
jobs:
check_changes:
runs-on: ubuntu-slim
outputs:
should_run: ${{ steps.filter.outputs.should_run }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check if should run
id: filter
run: |
set -e
if [[ "${{ github.base_ref }}" == "main" ]] || [[ "${{ github.base_ref }}" == "staging" ]]; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Running for ${{ github.base_ref }} - no path filter"
else
# For dev branch, check if relevant files changed
# Fetch the base branch to ensure it's available for comparison
git fetch origin ${{ github.base_ref }} --depth=1
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) || {
echo "Error: Failed to diff against base branch"
exit 1
}
if echo "$CHANGED_FILES" | grep -qE "^(sdk/core/|common/|\.github/workflows/core-sdk-ci\.yml|\.github/actions/)"; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Running for dev - relevant files changed"
else
echo "should_run=false" >> $GITHUB_OUTPUT
echo "Skipping for dev - no relevant files changed"
fi
fi
build:
needs: check_changes
if: github.event.pull_request.draft == false && needs.check_changes.outputs.should_run == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Build dependencies
run: |
yarn workspace @selfxyz/common build
yarn workspace @selfxyz/core build
- name: Cache build artifacts
uses: ./.github/actions/cache-core-sdk-build
with:
mode: save
cache-version: v1
lint:
runs-on: ubuntu-latest
needs: [check_changes, build]
if: github.event.pull_request.draft == false && needs.check_changes.outputs.should_run == 'true'
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Setup Corepack
run: |
corepack enable
corepack prepare yarn@4.12.0 --activate
- name: Restore build artifacts
id: build-cache
uses: ./.github/actions/cache-core-sdk-build
with:
mode: restore
cache-version: v1
fail-on-cache-miss: false
- name: Install Dependencies
if: steps.build-cache.outputs.cache-hit != 'true'
uses: ./.github/actions/yarn-install
- name: Build dependencies (fallback on cache miss)
if: steps.build-cache.outputs.cache-hit != 'true'
run: |
yarn workspace @selfxyz/common build
yarn workspace @selfxyz/core build
- name: Run linter
run: yarn workspace @selfxyz/core lint
types:
runs-on: ubuntu-latest
needs: [check_changes, build]
if: github.event.pull_request.draft == false && needs.check_changes.outputs.should_run == 'true'
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Setup Corepack
run: |
corepack enable
corepack prepare yarn@4.12.0 --activate
- name: Restore build artifacts
id: build-cache
uses: ./.github/actions/cache-core-sdk-build
with:
mode: restore
cache-version: v1
fail-on-cache-miss: false
- name: Install Dependencies
if: steps.build-cache.outputs.cache-hit != 'true'
uses: ./.github/actions/yarn-install
- name: Build dependencies (fallback on cache miss)
if: steps.build-cache.outputs.cache-hit != 'true'
run: |
yarn workspace @selfxyz/common build
yarn workspace @selfxyz/core build
- name: Type checking
run: yarn workspace @selfxyz/core types
test:
runs-on: ubuntu-latest
needs: [check_changes, build]
if: github.event.pull_request.draft == false && needs.check_changes.outputs.should_run == 'true'
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- name: Setup Corepack
run: |
corepack enable
corepack prepare yarn@4.12.0 --activate
- name: Restore build artifacts
id: build-cache
uses: ./.github/actions/cache-core-sdk-build
with:
mode: restore
cache-version: v1
fail-on-cache-miss: false
- name: Install Dependencies
if: steps.build-cache.outputs.cache-hit != 'true'
uses: ./.github/actions/yarn-install
- name: Build dependencies (fallback on cache miss)
if: steps.build-cache.outputs.cache-hit != 'true'
run: |
yarn workspace @selfxyz/common build
yarn workspace @selfxyz/core build
- name: Run tests
run: yarn workspace @selfxyz/core test
================================================
FILE: .github/workflows/gitleaks.yml
================================================
name: Gitleaks Scan
on:
pull_request:
jobs:
gitleaks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install gitleaks
uses: gitleaks/gitleaks-action@v2.3.9
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITLEAKS_CONFIG: gitleaks-override.toml
GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
================================================
FILE: .github/workflows/kmp-ci.yml
================================================
name: KMP CI
permissions:
contents: read
on:
pull_request:
paths:
- "packages/kmp-sdk/**"
- "packages/kmp-sdk-test-app/**"
- "packages/kmp-minipay-sample/**"
- ".github/workflows/kmp-ci.yml"
- ".github/actions/**"
push:
branches: [dev, staging, main]
paths:
- "packages/kmp-sdk/**"
- "packages/kmp-sdk-test-app/**"
- "packages/kmp-minipay-sample/**"
- ".github/workflows/kmp-ci.yml"
- ".github/actions/**"
jobs:
# ── KMP SDK ──────────────────────────────────────────────
kmp-sdk-tests:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :shared:jvmTest
- uses: actions/upload-artifact@v4
if: always()
with:
name: kmp-sdk-test-results
path: packages/kmp-sdk/shared/build/reports/tests/
kmp-sdk-android-build:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :shared:assembleDebug
kmp-sdk-ios-framework:
runs-on: namespace-profile-apple-silicon-6cpu
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64
kmp-sdk-ios-test:
runs-on: namespace-profile-apple-silicon-6cpu
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :shared:iosSimulatorArm64Test
# ── KMP Test App ─────────────────────────────────────────
kmp-test-app-tests:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk-test-app
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :composeApp:testDebugUnitTest
- uses: actions/upload-artifact@v4
if: always()
with:
name: kmp-test-app-test-results
path: packages/kmp-sdk-test-app/composeApp/build/reports/tests/
kmp-test-app-android-build:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk-test-app
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :composeApp:assembleDebug
kmp-test-app-ios-build:
runs-on: namespace-profile-apple-silicon-6cpu
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk-test-app
steps:
- uses: actions/checkout@v4
- name: Generate token for private dependencies
uses: ./.github/actions/generate-github-token
id: github-token
with:
app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }}
private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }}
configure-netrc: "true"
- name: Configure git for HTTPS dependency fetch
run: git config --global url."https://github.com/".insteadOf "git@github.com:"
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- name: Build KMP framework for iOS
working-directory: packages/kmp-sdk
run: ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64
- name: Install CocoaPods dependencies
working-directory: packages/kmp-sdk-test-app/iosApp
run: pod install
- name: Find iOS Simulator
id: sim
uses: ./.github/actions/find-ios-simulator
- name: Build iOS app
working-directory: packages/kmp-sdk-test-app/iosApp
run: |
xcodebuild -workspace iosApp.xcworkspace \
-scheme iosApp \
-sdk iphonesimulator \
-destination "id=${{ steps.sim.outputs.id }}" \
ONLY_ACTIVE_ARCH=YES \
build
# ── KMP Minipay Sample ──────────────────────────────────
kmp-minipay-android-build:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-minipay-sample
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :composeApp:assembleDebug
kmp-minipay-ios-build:
runs-on: namespace-profile-apple-silicon-6cpu
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-minipay-sample
steps:
- uses: actions/checkout@v4
- name: Generate token for private dependencies
uses: ./.github/actions/generate-github-token
id: github-token
with:
app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }}
private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }}
configure-netrc: "true"
- name: Configure git for HTTPS dependency fetch
run: git config --global url."https://github.com/".insteadOf "git@github.com:"
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- name: Build KMP framework for iOS
working-directory: packages/kmp-sdk
run: ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64
- name: Find iOS Simulator
id: sim
uses: ./.github/actions/find-ios-simulator
- name: Resolve SPM dependencies
working-directory: packages/kmp-minipay-sample/iosApp
run: |
xcodebuild -project iosApp.xcodeproj \
-resolvePackageDependencies
- name: Build iOS app
working-directory: packages/kmp-minipay-sample/iosApp
run: |
xcodebuild -project iosApp.xcodeproj \
-scheme iosApp \
-sdk iphonesimulator \
-destination "id=${{ steps.sim.outputs.id }}" \
ONLY_ACTIVE_ARCH=YES \
ARCHS=arm64 \
SWIFT_ENABLE_EXPLICIT_MODULES=NO \
build
================================================
FILE: .github/workflows/mobile-bundle-analysis.yml
================================================
name: Mobile Bundle Analysis
env:
RUBY_VERSION: 3.2
JAVA_VERSION: 17
WORKSPACE: ${{ github.workspace }}
APP_PATH: ${{ github.workspace }}/app
NODE_ENV: "production"
on:
push:
branches:
- dev
- staging
- main
paths:
- "app/**"
- "packages/mobile-sdk-alpha/**"
- ".github/workflows/mobile-bundle-analysis.yml"
- ".github/actions/**"
pull_request:
branches:
- dev
- staging
- main
paths:
- "app/**"
- "packages/mobile-sdk-alpha/**"
- ".github/workflows/mobile-bundle-analysis.yml"
- ".github/actions/**"
workflow_dispatch:
jobs:
analyze-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
app/node_modules
cache-version: node-${{ env.NODE_VERSION_SANITIZED }}
- name: Cache Bundler
uses: ./.github/actions/cache-bundler
with:
path: app/vendor/bundle
lock-file: app/Gemfile.lock
cache-version: ruby${{ env.RUBY_VERSION }}
- name: Cache Gradle
uses: ./.github/actions/cache-gradle
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
- name: Generate token for self repositories
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false }}
uses: ./.github/actions/generate-github-token
id: github-token
with:
app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }}
private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }}
configure-netrc: "true"
- name: Install Mobile Dependencies
uses: ./.github/actions/mobile-setup
with:
app_path: ${{ env.APP_PATH }}
node_version: ${{ env.NODE_VERSION }}
ruby_version: ${{ env.RUBY_VERSION }}
workspace: ${{ env.WORKSPACE }}
env:
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
- name: Build dependencies
shell: bash
run: yarn workspace @selfxyz/common build
- name: Run Android analysis
run: yarn analyze:bundle:android
working-directory: ./app
analyze-ios:
if: github.event_name == 'workflow_dispatch' || github.event_name == 'push'
# runs-on: macos-latest-large
runs-on: namespace-profile-apple-silicon-6cpu
steps:
- uses: actions/checkout@v6
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
app/node_modules
cache-version: node-${{ env.NODE_VERSION_SANITIZED }}
- name: Cache Bundler
uses: ./.github/actions/cache-bundler
with:
path: app/vendor/bundle
lock-file: app/Gemfile.lock
cache-version: ruby${{ env.RUBY_VERSION }}
- name: Cache CocoaPods
uses: ./.github/actions/cache-pods
with:
path: app/ios/Pods
lockfile: app/ios/Podfile.lock
- name: Check Java installation
run: |
echo "INSTALL_JAVA=false" >> "$GITHUB_ENV"
if command -v java &> /dev/null && java -version &> /dev/null; then
echo "Java already installed: $(java -version 2>&1 | head -n 1)"
else
echo "Java not found or not working, will install..."
echo "INSTALL_JAVA=true" >> "$GITHUB_ENV"
fi
- name: Setup Java environment
if: env.INSTALL_JAVA == 'true'
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}
- name: Generate token for self repositories
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false }}
uses: ./.github/actions/generate-github-token
id: github-token
with:
app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }}
private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }}
configure-netrc: "true"
- name: Install Mobile Dependencies
uses: ./.github/actions/mobile-setup
with:
app_path: ${{ env.APP_PATH }}
node_version: ${{ env.NODE_VERSION }}
ruby_version: ${{ env.RUBY_VERSION }}
workspace: ${{ env.WORKSPACE }}
env:
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
- name: Build dependencies
shell: bash
run: yarn workspace @selfxyz/common build
- name: Run iOS analysis
run: yarn analyze:bundle:ios
working-directory: ./app
================================================
FILE: .github/workflows/mobile-ci.yml
================================================
name: Mobile CI
env:
# Build environment versions
# Node version is read from .nvmrc during workflow execution
RUBY_VERSION: 3.2
JAVA_VERSION: 17
ANDROID_NDK_VERSION: 28.0.13004108
XCODE_VERSION: 26
# Path configuration
WORKSPACE: ${{ github.workspace }}
APP_PATH: ${{ github.workspace }}/app
# Cache versions
GH_CACHE_VERSION: v2 # Global cache version - bumped to invalidate caches
GH_GEMS_CACHE_VERSION: v1 # Ruby gems cache version
# Performance optimizations
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=2 -Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.caching=true -Dorg.gradle.jvmargs='-Xmx6144m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8'
CI: true
on:
pull_request:
branches:
- dev
- staging
- main
paths:
- "common/**"
- "app/**"
- "packages/mobile-sdk-alpha/**"
- ".github/workflows/mobile-ci.yml"
- ".github/actions/**"
workflow_dispatch: {}
concurrency:
group: mobile-ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-deps:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v6
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Enable Corepack
run: corepack enable
- name: Activate Yarn 4.12.0
run: corepack prepare yarn@4.12.0 --activate
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
app/node_modules
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Cache Built Dependencies
id: built-deps
uses: ./.github/actions/cache-built-deps
with:
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}
- name: Build dependencies (cache miss)
# Temporarily disabled due to `yarn types` failures when cache is used.
# if: steps.built-deps.outputs.cache-hit != 'true'
run: |
echo "Cache miss for built dependencies. Building now..."
yarn workspace @selfxyz/mobile-app run build:deps
- name: Run linter
run: yarn lint
working-directory: ./app
- name: Run prettier
run: yarn fmt
working-directory: ./app
- name: Check App Types
run: yarn types
working-directory: ./app
test:
runs-on: ubuntu-latest
needs: build-deps
timeout-minutes: 60
steps:
- uses: actions/checkout@v6
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Enable Corepack
run: corepack enable
- name: Activate Yarn 4.12.0
run: corepack prepare yarn@4.12.0 --activate
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
app/node_modules
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Cache Built Dependencies
id: built-deps
uses: ./.github/actions/cache-built-deps
with:
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}
- name: Debug Cache Restoration
run: |
echo "Cache hit: ${{ steps.built-deps.outputs.cache-hit }}"
echo "Cache key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}"
echo "Checking if cached files exist:"
ls -la packages/mobile-sdk-alpha/dist/ || echo "❌ mobile-sdk-alpha dist not found"
ls -la packages/mobile-sdk-alpha/dist/cjs/ || echo "❌ mobile-sdk-alpha dist/cjs not found"
ls -la packages/mobile-sdk-alpha/dist/cjs/index.cjs || echo "❌ mobile-sdk-alpha dist/cjs/index.cjs not found"
ls -la common/dist/ || echo "❌ common dist not found"
ls -la common/dist/cjs/ || echo "❌ common dist/cjs not found"
ls -la common/dist/cjs/index.cjs || echo "❌ common dist/cjs/index.cjs not found"
- name: Build dependencies (always - debugging CI)
# Temporarily always build to debug CI issues
# TODO: Re-enable cache after fixing: if: steps.built-deps.outputs.cache-hit != 'true'
run: |
echo "Building dependencies (cache temporarily disabled for debugging)..."
yarn workspace @selfxyz/mobile-app run build:deps
# Verify build completed successfully
if [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "common/dist/cjs/index.cjs" ]; then
echo "❌ Build failed - required files missing after build"
ls -la packages/mobile-sdk-alpha/dist/ || echo "mobile-sdk-alpha dist not found"
ls -la common/dist/ || echo "common dist not found"
exit 1
fi
echo "✅ Build completed successfully"
- name: Force Build Dependencies If Missing
run: |
# Force build if required files don't exist, regardless of cache status
if [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "common/dist/cjs/index.cjs" ]; then
echo "❌ Required dependency files missing, forcing rebuild..."
echo "Missing files:"
[ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] && echo " - packages/mobile-sdk-alpha/dist/cjs/index.cjs"
[ ! -f "common/dist/cjs/index.cjs" ] && echo " - common/dist/cjs/index.cjs"
yarn workspace @selfxyz/mobile-app run build:deps
# Verify build completed successfully
if [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "common/dist/cjs/index.cjs" ]; then
echo "❌ Forced build failed - required files still missing"
ls -la packages/mobile-sdk-alpha/ || echo "packages/mobile-sdk-alpha not found"
ls -la packages/mobile-sdk-alpha/dist/ || echo "mobile-sdk-alpha dist not found"
ls -la common/ || echo "common not found"
ls -la common/dist/ || echo "common dist not found"
exit 1
fi
echo "✅ Forced build completed successfully"
else
echo "✅ All required dependency files exist"
fi
- name: Check for nested require() in tests
run: node scripts/check-test-requires.cjs
working-directory: ./app
- name: App Tests
env:
# Increase Node.js memory to prevent hermes-parser WASM memory errors
NODE_OPTIONS: --max-old-space-size=4096
# Override production NODE_ENV for tests - React's production build doesn't include testing utilities
NODE_ENV: test
run: |
# Final verification from app directory perspective
echo "Final verification before running tests (from app directory)..."
if [ ! -f "../packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "../common/dist/cjs/index.cjs" ]; then
echo "❌ Dependencies still not found from app directory"
ls -la ../packages/mobile-sdk-alpha/dist/ || echo "mobile-sdk-alpha dist not found"
ls -la ../common/dist/ || echo "common dist not found"
exit 1
fi
echo "✅ All dependencies verified, running tests..."
# Run jest through yarn to avoid the build:deps step since CI already built dependencies
yarn test:ci
working-directory: ./app
================================================
FILE: .github/workflows/mobile-deploy-auto.yml
================================================
name: Mobile Auto Deploy
on:
pull_request:
types: [closed]
branches: [staging]
paths:
- "app/**"
- "!app/**/*.md"
- "!app/docs/**"
- "packages/mobile-sdk-alpha/**"
concurrency:
group: mobile-deploy-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: write
pull-requests: write
id-token: write
jobs:
check-and-deploy:
# WORKFLOW DISABLED
# Maybe it's my understanding, but it doesn't work as expected. disabled for now.
if: false
# if: github.event.pull_request.merged == true && !contains(github.event.pull_request.labels.*.name, 'deploy:skip')
runs-on: ubuntu-latest
outputs:
should_deploy: ${{ steps.check.outputs.should_deploy }}
deployment_track: ${{ steps.check.outputs.deployment_track }}
version_bump: ${{ steps.check.outputs.version_bump }}
platforms: ${{ steps.check.outputs.platforms }}
steps:
- name: Check deployment conditions
id: check
run: |
echo "🔍 Checking deployment conditions..."
# Skip if PR has deploy:skip label
labels="${{ join(github.event.pull_request.labels.*.name, ',') }}"
if [[ "$labels" =~ deploy:skip ]]; then
echo "should_deploy=false" >> $GITHUB_OUTPUT
echo "⏭️ Skipping deployment due to deploy:skip label"
exit 0
fi
# Determine deployment track based on target branch
if [[ "${{ github.base_ref }}" == "main" ]]; then
echo "deployment_track=production" >> $GITHUB_OUTPUT
echo "🚀 Deployment track: production"
elif [[ "${{ github.base_ref }}" == "staging" ]]; then
echo "deployment_track=internal" >> $GITHUB_OUTPUT
echo "🧪 Deployment track: internal testing"
fi
# Determine version bump from PR labels
labels="${{ join(github.event.pull_request.labels.*.name, ',') }}"
if [[ "$labels" =~ version:major ]]; then
echo "version_bump=major" >> $GITHUB_OUTPUT
echo "📈 Version bump: major"
elif [[ "$labels" =~ version:minor ]]; then
echo "version_bump=minor" >> $GITHUB_OUTPUT
echo "📈 Version bump: minor"
elif [[ "$labels" =~ version:patch ]] || [[ "${{ github.base_ref }}" == "main" ]]; then
echo "version_bump=patch" >> $GITHUB_OUTPUT
echo "📈 Version bump: patch"
else
echo "version_bump=build" >> $GITHUB_OUTPUT
echo "📈 Version bump: build only"
fi
# Determine platforms based on deploy labels
# If both deploy:ios and deploy:android labels exist, deploy both
# If neither label exists, deploy both (default behavior)
# If only one label exists, deploy only that platform
has_ios_label=false
has_android_label=false
if [[ "$labels" =~ deploy:ios ]]; then
has_ios_label=true
fi
if [[ "$labels" =~ deploy:android ]]; then
has_android_label=true
fi
if [[ "$has_ios_label" == "true" && "$has_android_label" == "true" ]]; then
echo 'platforms=["ios", "android"]' >> $GITHUB_OUTPUT
echo "📱 Deploying both iOS and Android (both labels present)"
elif [[ "$has_ios_label" == "true" ]]; then
echo 'platforms=["ios"]' >> $GITHUB_OUTPUT
echo "📱 Deploying iOS only (deploy:ios label present)"
elif [[ "$has_android_label" == "true" ]]; then
echo 'platforms=["android"]' >> $GITHUB_OUTPUT
echo "📱 Deploying Android only (deploy:android label present)"
else
echo 'platforms=["ios", "android"]' >> $GITHUB_OUTPUT
echo "📱 Deploying both iOS and Android (no platform labels, default behavior)"
fi
echo "should_deploy=true" >> $GITHUB_OUTPUT
- name: Log deployment info
if: steps.check.outputs.should_deploy == 'true'
run: |
echo "📱 Auto-deployment triggered!"
echo "Branch: ${{ github.base_ref }}"
echo "Track: ${{ steps.check.outputs.deployment_track }}"
echo "Version bump: ${{ steps.check.outputs.version_bump }}"
echo "PR: #${{ github.event.pull_request.number }} - ${{ github.event.pull_request.title }}"
echo "Merged by: ${{ github.event.pull_request.merged_by.login }}"
deploy-ios:
needs: check-and-deploy
if: needs.check-and-deploy.outputs.should_deploy == 'true' && contains(fromJson(needs.check-and-deploy.outputs.platforms), 'ios')
uses: ./.github/workflows/mobile-deploy.yml
with:
platform: ios
deployment_track: ${{ needs.check-and-deploy.outputs.deployment_track }}
version_bump: ${{ needs.check-and-deploy.outputs.version_bump }}
auto_deploy: true
test_mode: true
secrets: inherit
deploy-android:
needs: check-and-deploy
if: needs.check-and-deploy.outputs.should_deploy == 'true' && contains(fromJson(needs.check-and-deploy.outputs.platforms), 'android')
uses: ./.github/workflows/mobile-deploy.yml
with:
platform: android
deployment_track: ${{ needs.check-and-deploy.outputs.deployment_track }}
version_bump: ${{ needs.check-and-deploy.outputs.version_bump }}
auto_deploy: true
test_mode: true
secrets: inherit
notify-skip:
needs: check-and-deploy
if: needs.check-and-deploy.outputs.should_deploy == 'false'
runs-on: ubuntu-latest
steps:
- name: Notify skip
run: |
echo "📱 Mobile deployment was skipped for this PR"
echo "To deploy manually, use the 'Run workflow' button on the Mobile App Deployments workflow"
================================================
FILE: .github/workflows/mobile-deploy.yml
================================================
name: Mobile Deploy
# Runs on:
# 1. Manual trigger (workflow_dispatch) with configurable options
# 2. When PRs are merged to staging (auto-deploy to internal track)
# 3. DISABLED: When called by other workflows (workflow_call)
#
# === PR LABELS ===
# - deploy:skip: Skip deployment entirely (no version bump, no builds)
# - version:major/minor/patch: Control version bump type
# - deploy:ios/deploy:android: Build only one platform
#
# === WORKFLOW LOGIC ===
# Build Branch: Always builds from the branch that triggered the workflow
# - PR merges: Builds from 'staging' branch (the branch being merged into)
# - Manual dispatch: Builds from the branch where workflow was manually triggered
# - This allows testing from feature branches before merging to dev/staging
#
# Version Bump PR: After successful build, creates PR to bump version
# - Target: 'dev' branch
# - Workflow checks out the target branch, applies version changes, and creates PR
# - This separates the build source from the version bump destination
#
# Example flows:
# 1. Normal production flow:
# - Merge PR to staging → builds from staging → creates version bump PR to dev
# 2. Testing from feature branch:
# - Manually trigger from feature branch → builds from feature branch → creates version bump PR to dev
env:
# Build environment versions
RUBY_VERSION: 3.2
NODE_ENV: "production"
JAVA_VERSION: 17
ANDROID_API_LEVEL: 35
ANDROID_NDK_VERSION: 27.0.12077973
XCODE_VERSION: 26
# Cache versioning - increment these to bust caches when needed
GH_CACHE_VERSION: v1 # Global cache version
GH_YARN_CACHE_VERSION: v1 # Yarn-specific cache version
GH_GEMS_CACHE_VERSION: v1 # Ruby gems cache version
GH_PODS_CACHE_VERSION: v1 # CocoaPods cache version
GH_GRADLE_CACHE_VERSION: v1 # Gradle cache version
# Path configuration
WORKSPACE: ${{ github.workspace }}
APP_PATH: ${{ github.workspace }}/app
# Certificate/keystore paths
ANDROID_KEYSTORE_PATH: /android/app/upload-keystore.jks
ANDROID_PLAY_STORE_JSON_KEY_PATH: /android/play-store-key.json
IOS_DIST_CERT_PATH: /ios/certs/dist_cert.p12
IOS_CONNECT_API_KEY_PATH: /ios/certs/connect_api_key.p8
IOS_PROV_PROFILE_PROJ_PATH: /ios/certs/profile.mobileprovision
IOS_PROV_PROFILE_DIRECTORY: "~/Library/MobileDevice/Provisioning\ Profiles/"
permissions:
contents: read
on:
workflow_dispatch:
inputs:
platform:
description: "Select platform to build"
required: true
default: "both"
type: choice
options:
- ios
- android
- both
test_mode:
description: "Test mode (skip upload to stores)"
required: false
type: boolean
default: false
deployment_track:
description: "Deployment track (internal/production)"
required: false
type: choice
default: "internal"
options:
- internal
- production
version_bump:
description: "Version bump type"
required: false
type: choice
default: "build"
options:
- build
- patch
- minor
- major
dry_run:
description: "Do not commit/push or create PR/tags"
required: false
type: boolean
default: false
pr_number:
description: "PR number for per-PR preview build. When set (Android only), uploads to Play Store Internal App Sharing and posts a Slack message with the install URL. Skips the version-bump PR."
required: false
type: string
default: ""
pull_request:
types: [closed]
branches: [staging]
paths:
- "app/**"
- "!app/**/*.md"
- "!app/docs/**"
- "packages/mobile-sdk-alpha/**"
- ".github/workflows/mobile-deploy.yml"
workflow_call:
inputs:
platform:
type: string
required: true
deployment_track:
type: string
required: false
default: "internal"
version_bump:
type: string
required: false
default: "build"
auto_deploy:
type: boolean
required: false
default: false
test_mode:
type: boolean
required: false
default: false
concurrency:
# Group by PR number (when set) so multiple PR preview builds run in parallel,
# otherwise by deployment track or ref name to allow different tracks to run in parallel.
# cancel-in-progress: false ensures we don't cancel ongoing deployments.
# Branch-locking in create-version-bump-pr prevents duplicate PRs for same version.
group: mobile-deploy-${{ inputs.pr_number != '' && format('pr-{0}', inputs.pr_number) || inputs.deployment_track || github.ref_name }}
cancel-in-progress: false
jobs:
# Bump version atomically before platform builds to avoid race conditions
# NOTE: Checks out the triggering branch (staging for PR merges, or the branch where manually triggered)
bump-version:
runs-on: ubuntu-latest
permissions:
contents: read
# Guard against auto-closed PRs (GitHub reports merged == false when a PR closes without merging)
if: |
(
github.event_name != 'pull_request' ||
(github.event.action == 'closed' && github.event.pull_request.merged == true)
) &&
(
github.event_name != 'pull_request' ||
!contains(github.event.pull_request.labels.*.name, 'deploy:skip')
)
outputs:
version: ${{ steps.bump.outputs.version }}
ios_build: ${{ steps.bump.outputs.ios_build }}
android_build: ${{ steps.bump.outputs.android_build }}
version_bump_type: ${{ steps.determine-bump.outputs.version_bump }}
platform: ${{ steps.determine-platform.outputs.platform }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
# Build from the branch that triggered the workflow (staging, feature branch, etc.)
ref: ${{ github.ref_name }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Determine version bump from PR labels or input
id: determine-bump
run: |
VERSION_BUMP="${{ inputs.version_bump || 'build' }}"
# Override with PR label if present
if [ "${{ github.event_name }}" = "pull_request" ]; then
LABELS='${{ toJSON(github.event.pull_request.labels.*.name) }}'
if echo "$LABELS" | grep -q "version:major"; then
VERSION_BUMP="major"
elif echo "$LABELS" | grep -q "version:minor"; then
VERSION_BUMP="minor"
elif echo "$LABELS" | grep -q "version:patch"; then
VERSION_BUMP="patch"
fi
fi
echo "version_bump=$VERSION_BUMP" >> $GITHUB_OUTPUT
echo "📦 Version bump type: $VERSION_BUMP"
- name: Determine platform from labels or input
id: determine-platform
run: |
PLATFORM="both"
# Check workflow input first
if [ -n "${{ inputs.platform }}" ]; then
INPUT_PLATFORM="${{ inputs.platform }}"
if [ "$INPUT_PLATFORM" = "ios" ]; then
PLATFORM="ios"
elif [ "$INPUT_PLATFORM" = "android" ]; then
PLATFORM="android"
fi
fi
# Override with PR labels if present
if [ "${{ github.event_name }}" = "pull_request" ]; then
LABELS='${{ toJSON(github.event.pull_request.labels.*.name) }}'
if echo "$LABELS" | grep -q "deploy:ios"; then
PLATFORM="ios"
elif echo "$LABELS" | grep -q "deploy:android"; then
PLATFORM="android"
fi
fi
echo "platform=$PLATFORM" >> $GITHUB_OUTPUT
echo "📱 Platform to deploy: $PLATFORM"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
- name: Bump version using version-manager script
id: bump
run: |
cd ${{ env.APP_PATH }}
VERSION_BUMP="${{ steps.determine-bump.outputs.version_bump }}"
PLATFORM="${{ steps.determine-platform.outputs.platform }}"
echo "🔄 Calculating version bump..."
echo " Type: $VERSION_BUMP"
echo " Platform: $PLATFORM"
echo ""
# Use version-manager script to calculate bump
# NOTE: Using absolute path to ensure script is found regardless of CWD
node ${{ env.APP_PATH }}/scripts/version-manager.cjs bump "$VERSION_BUMP" "$PLATFORM"
echo ""
echo "✅ Version bump calculated successfully"
echo "⚠️ Note: Changes are local only. Will be committed in PR after successful builds."
- name: Verify bump outputs were set
run: |
VERSION="${{ steps.bump.outputs.version }}"
IOS_BUILD="${{ steps.bump.outputs.ios_build }}"
ANDROID_BUILD="${{ steps.bump.outputs.android_build }}"
if [ -z "$VERSION" ] || [ -z "$IOS_BUILD" ] || [ -z "$ANDROID_BUILD" ]; then
echo "❌ Version bump failed to set required outputs"
echo "version='$VERSION', ios_build='$IOS_BUILD', android_build='$ANDROID_BUILD'"
exit 1
fi
echo "✅ All version outputs verified"
build-ios:
needs: [bump-version]
# runs-on: macos-latest-large
runs-on: namespace-profile-apple-silicon-6cpu
permissions:
contents: read
actions: write
# PR preview builds are Android-only for now — always skip iOS when pr_number is set.
if: |
inputs.pr_number == '' &&
(github.event_name != 'pull_request' ||
(github.event.action == 'closed' && github.event.pull_request.merged == true)) &&
(
(inputs.platform == 'ios' || inputs.platform == 'both') ||
(github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'deploy:android'))
)
steps:
- name: Mobile deployment status
run: |
echo "🚀 Mobile deployment is enabled - proceeding with iOS build"
echo "📱 Platform: ${{ inputs.platform || 'both' }}"
echo "🎯 Track: ${{ inputs.deployment_track || 'internal' }}"
echo "📦 Version bump: ${{ inputs.version_bump || 'build' }}"
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "🔀 Triggered by PR merge: #${{ github.event.pull_request.number }} - ${{ github.event.pull_request.title }}"
echo "👤 Merged by: ${{ github.event.pull_request.merged_by.login }}"
if ${{ contains(github.event.pull_request.labels.*.name, 'deploy:ios') }}; then
echo "🏷️ Label: deploy:ios (skipping Android)"
fi
fi
- uses: actions/checkout@v6
with:
fetch-depth: 0
# Checkout the branch that triggered the workflow
ref: ${{ github.ref_name }}
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Verify branch and commit (iOS)
if: needs.bump-version.outputs.platform != 'android'
run: |
echo "🔍 Verifying we're building from the correct branch and commit..."
echo "Current branch: $(git branch --show-current || git symbolic-ref --short HEAD 2>/dev/null || echo 'detached')"
echo "Current commit: $(git rev-parse HEAD)"
echo "Current commit message: $(git log -1 --pretty=format:'%s')"
BUILD_BRANCH="${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref || github.ref_name }}"
echo "Building from branch: $BUILD_BRANCH"
echo "Target HEAD commit: $(git rev-parse origin/$BUILD_BRANCH)"
echo "Target HEAD message: $(git log -1 --pretty=format:'%s' origin/$BUILD_BRANCH)"
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "📌 Building from merge commit on staging (includes source + conflict resolutions)"
echo "PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}"
echo "Merge commit includes version.json from source branch with bumped build numbers"
elif [ "$(git rev-parse HEAD)" != "$(git rev-parse origin/$BUILD_BRANCH)" ]; then
echo "⚠️ WARNING: Current commit differs from latest $BUILD_BRANCH commit"
echo "This might indicate we're not building from the latest $BUILD_BRANCH branch"
git log --oneline HEAD..origin/$BUILD_BRANCH || true
else
echo "✅ Building from latest $BUILD_BRANCH commit"
fi
- name: Apply version bump for build
if: needs.bump-version.outputs.platform != 'android'
run: |
cd ${{ env.APP_PATH }}
VERSION="${{ needs.bump-version.outputs.version }}"
IOS_BUILD="${{ needs.bump-version.outputs.ios_build }}"
ANDROID_BUILD="${{ needs.bump-version.outputs.android_build }}"
echo "📝 Applying version bump for iOS build: $VERSION (iOS Build: $IOS_BUILD, Android Build: $ANDROID_BUILD)"
# Use version-manager script to apply versions
node ${{ env.APP_PATH }}/scripts/version-manager.cjs apply "$VERSION" "$IOS_BUILD" "$ANDROID_BUILD"
- name: Set up Xcode
if: inputs.platform != 'android'
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ env.XCODE_VERSION }}
- name: Configure Xcode path
if: inputs.platform != 'android'
run: |
echo "🔧 Configuring Xcode path to fix iOS SDK issues..."
# Fix for macOS 15 runner iOS SDK issues
# See: https://github.com/actions/runner-images/issues/12758
sudo xcode-select --switch /Applications/Xcode_${{ env.XCODE_VERSION }}.app
echo "✅ Xcode path configured"
# Verify Xcode setup
echo "Xcode version:"
xcodebuild -version
echo "Xcode path:"
xcode-select -p
- name: Compute .yarnrc.yml hash
id: yarnrc-hash
uses: ./.github/actions/yarnrc-hash
- name: Cache Yarn artifacts
id: yarn-cache
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
.yarn/install-state.gz
.yarn/unplugged
cache-version: ${{ env.GH_CACHE_VERSION }}-node-${{ env.NODE_VERSION_SANITIZED }}-${{ steps.yarnrc-hash.outputs.hash }}
- name: Cache Ruby gems
id: gems-cache
uses: ./.github/actions/cache-bundler
with:
# TODO(jcortejoso): Confirm the path of the bundle cache
path: ${{ env.APP_PATH }}/ios/vendor/bundle
lock-file: app/Gemfile.lock
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-ruby${{ env.RUBY_VERSION }}
- name: Cache CocoaPods
id: pods-cache
uses: ./.github/actions/cache-pods
with:
path: |
${{ env.APP_PATH }}/ios/Pods
~/Library/Caches/CocoaPods
lockfile: app/ios/Podfile.lock
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.GH_PODS_CACHE_VERSION }}
- name: Log cache status
run: |
echo "Cache hit results:"
echo "- Yarn cache hit: ${{ steps.yarn-cache.outputs.cache-hit }}"
echo "- Gems cache hit: ${{ steps.gems-cache.outputs.cache-hit }}"
echo "- Pods cache hit: ${{ steps.pods-cache.outputs.cache-hit }}"
- name: Disable Yarn hardened mode
run: echo "YARN_ENABLE_HARDENED_MODE=0" >> $GITHUB_ENV
- name: Verify lock files are up to date
run: |
echo "🔍 Checking if lock files are in sync with dependency files..."
# For yarn workspaces, yarn.lock is at root
if [ ! -f "${{ env.WORKSPACE }}/yarn.lock" ]; then
echo "❌ ERROR: yarn.lock file is missing at workspace root!"
echo "Run 'yarn install' at the repository root and commit the yarn.lock file."
exit 1
fi
# Gemfile.lock is in app directory
if [ ! -f "${{ env.APP_PATH }}/Gemfile.lock" ]; then
echo "❌ ERROR: Gemfile.lock file is missing!"
echo "Run 'bundle install' in the app directory and commit the Gemfile.lock file."
exit 1
fi
echo "✅ Lock files exist"
- name: Check Java installation
run: |
echo "INSTALL_JAVA=false" >> "$GITHUB_ENV"
if command -v java &> /dev/null && java -version &> /dev/null; then
echo "Java already installed: $(java -version 2>&1 | head -n 1)"
else
echo "Java not found or not working, will install..."
echo "INSTALL_JAVA=true" >> "$GITHUB_ENV"
fi
- name: Setup Java environment
if: env.INSTALL_JAVA == 'true'
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}
- name: Generate token for self repositories
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false }}
uses: ./.github/actions/generate-github-token
id: github-token
with:
app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }}
private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }}
configure-netrc: "true"
- name: Install Mobile Dependencies (main repo)
if: inputs.platform != 'android' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false)
uses: ./.github/actions/mobile-setup
with:
app_path: ${{ env.APP_PATH }}
node_version: ${{ env.NODE_VERSION }}
ruby_version: ${{ env.RUBY_VERSION }}
workspace: ${{ env.WORKSPACE }}
env:
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
- name: Install Mobile Dependencies (forked PRs - no secrets)
if: inputs.platform != 'android' && github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true
uses: ./.github/actions/mobile-setup
with:
app_path: ${{ env.APP_PATH }}
node_version: ${{ env.NODE_VERSION }}
ruby_version: ${{ env.RUBY_VERSION }}
workspace: ${{ env.WORKSPACE }}
- name: Verify iOS Secrets
if: inputs.platform != 'android'
run: |
# Verify App Store Connect API Key exists and contains PEM header
if [ -z "${{ secrets.IOS_CONNECT_API_KEY_BASE64 }}" ]; then
echo "❌ Error: App Store Connect API Key cannot be empty"
exit 1
fi
# Verify Issuer ID is in correct format (UUID)
if ! echo "${{ secrets.IOS_CONNECT_ISSUER_ID }}" | grep -E "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" >/dev/null; then
echo "❌ Error: Invalid App Store Connect Issuer ID format (should be UUID)"
exit 1
fi
# Verify Key ID is in correct format (alphanumeric)
if ! echo "${{ secrets.IOS_CONNECT_KEY_ID }}" | grep -E "^[A-Z0-9]{10}$" >/dev/null; then
echo "❌ Error: Invalid App Store Connect Key ID format"
exit 1
fi
# Verify P12 password is not empty and meets basic security requirements
if [ -z "${{ secrets.IOS_P12_PASSWORD }}" ]; then
echo "❌ Error: P12 password cannot be empty"
exit 1
fi
# Verify base64 secrets are not empty
if [ -z "${{ secrets.IOS_DIST_CERT_BASE64 }}" ]; then
echo "❌ Error: Distribution certificate cannot be empty"
exit 1
fi
if [ -z "${{ secrets.IOS_PROV_PROFILE_BASE64 }}" ]; then
echo "❌ Error: Provisioning profile cannot be empty"
exit 1
fi
echo "✅ All iOS secrets verified successfully!"
- name: Decode certificate and profile
if: inputs.platform != 'android'
run: |
mkdir -p "${{ env.APP_PATH }}$(dirname "${{ env.IOS_DIST_CERT_PATH }}")"
echo "${{ secrets.IOS_DIST_CERT_BASE64 }}" | base64 --decode > ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}
echo "${{ secrets.IOS_PROV_PROFILE_BASE64 }}" | base64 --decode > ${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}
echo "${{ secrets.IOS_CONNECT_API_KEY_BASE64 }}" | base64 --decode > ${{ env.APP_PATH }}${{ env.IOS_CONNECT_API_KEY_PATH }}
# for debugging...which can take some time :(
- name: Verify ios secret checksums
if: false # for debugging
run: |
echo "SHA256 of dist_cert.p12:"
shasum -a 256 ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}
echo "SHA256 of profile.mobileprovision:"
shasum -a 256 ${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}
echo "SHA256 of connect_api_key.p8:"
shasum -a 256 ${{ env.APP_PATH }}${{ env.IOS_CONNECT_API_KEY_PATH }}
echo "Certificate file size:"
ls -l ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}
echo "SHA256 of password:"
echo -n "${{ secrets.IOS_P12_PASSWORD }}" | shasum -a 256
echo "SHA256 of connect_api_key_base64:"
echo -n "${{ secrets.IOS_CONNECT_API_KEY_BASE64 }}" | shasum -a 256
echo "Verifying certificate..."
if openssl pkcs12 -in ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }} -password pass:'${{ secrets.IOS_P12_PASSWORD }}' -info >/dev/null 2>&1 || openssl pkcs12 -in ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }} -password pass:'${{ secrets.IOS_P12_PASSWORD }}' -info 2>&1 | grep -q "MAC:"; then
echo "✅ Certificate verification successful (algorithm warning can be safely ignored)"
else
echo "❌ Certificate verification failed - please check certificate validity"
exit 1
fi
- name: Verify iOS certificate and environment
if: inputs.platform != 'android' && !env.ACT
run: |
# Check if certificate directory exists
if [ ! -d "${{ env.APP_PATH }}/ios/certs" ]; then
echo "❌ Error: iOS certificates directory not found at ${{ env.APP_PATH }}/ios/certs"
exit 1
fi
# Check if certificate file exists
if [ ! -f "${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}" ]; then
echo "❌ Error: Distribution certificate not found at ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}"
exit 1
fi
# Check certificate file permissions
CERT_PERMS=$(ls -l "${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}" | awk '{print $1}')
if [ "$CERT_PERMS" != "-rw-r--r--" ]; then
echo "❌ Error: Distribution certificate has incorrect permissions: $CERT_PERMS"
echo "Expected: -rw-r--r--"
exit 1
fi
# Check certificate file size
CERT_SIZE=$(stat -f%z "${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}" 2>/dev/null || stat -c%s "${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }}")
if [ "$CERT_SIZE" -lt 1000 ]; then
echo "❌ Error: Distribution certificate file size ($CERT_SIZE bytes) is suspiciously small"
exit 1
fi
# Check if we can create a test keychain
TEST_KEYCHAIN="test.keychain"
if ! security create-keychain -p "" "$TEST_KEYCHAIN" >/dev/null 2>&1; then
echo "❌ Error: Unable to create test keychain. Check permissions."
exit 1
fi
security delete-keychain "$TEST_KEYCHAIN" >/dev/null 2>&1
echo "✅ Certificate and environment verification passed!"
- name: Install certificate
if: inputs.platform != 'android' && !env.ACT
run: |
security create-keychain -p "" build.keychain >/dev/null 2>&1
security default-keychain -s build.keychain >/dev/null 2>&1
security unlock-keychain -p "" build.keychain >/dev/null 2>&1
security import ${{ env.APP_PATH }}${{ env.IOS_DIST_CERT_PATH }} -k build.keychain -P '${{ secrets.IOS_P12_PASSWORD }}' -T /usr/bin/codesign >/dev/null 2>&1
security set-key-partition-list -S apple-tool:,apple: -s -k "" build.keychain >/dev/null 2>&1
- name: Install provisioning profile
if: inputs.platform != 'android' && !env.ACT
env:
IOS_APP_IDENTIFIER: ${{ secrets.IOS_APP_IDENTIFIER }}
IOS_PROV_PROFILE_NAME: ${{ secrets.IOS_PROV_PROFILE_NAME }}
IOS_PROV_PROFILE_PATH: ${{ env.IOS_PROV_PROFILE_PATH }}
IOS_TEAM_ID: ${{ secrets.IOS_TEAM_ID }}
run: |
# Verify file exists before proceeding
echo "Checking for provisioning profile at: ${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}"
ls -l "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}"
if [ ! -f "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}" ]; then
echo "❌ Error: Provisioning profile not found at specified path."
exit 1
fi
echo "Provisioning profile found."
# Print file details
echo "Provisioning Profile File Details:"
echo "--------------------------------"
echo "File size: $(stat -f%z "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}" 2>/dev/null || stat -c%s "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}") bytes"
echo "File permissions: $(ls -l "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}" | awk '{print $1}')"
echo "File owner: $(ls -l "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}" | awk '{print $3}')"
echo "--------------------------------"
# Create a temporary plist file to extract UUID
TEMP_PLIST_PATH=$(mktemp /tmp/profile_plist.XXXXXX)
# Extract plist from mobileprovision file
echo "Extracting plist from provisioning profile..."
security cms -D -i "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}" -o "$TEMP_PLIST_PATH"
if [ $? -ne 0 ]; then
echo "❌ Error: Failed to extract plist from provisioning profile"
exit 1
fi
# Extract UUID and profile name from plist
echo "Extracting UUID and profile name from plist..."
PROFILE_UUID=$(/usr/libexec/PlistBuddy -c "Print :UUID" "$TEMP_PLIST_PATH" 2>/dev/null)
if [ $? -ne 0 ] || [ -z "$PROFILE_UUID" ]; then
echo "❌ Error: Failed to extract UUID from provisioning profile"
cat "$TEMP_PLIST_PATH" | head -20
exit 1
fi
# Extract the actual profile name from within the file
PROFILE_NAME=$(/usr/libexec/PlistBuddy -c "Print :Name" "$TEMP_PLIST_PATH" 2>/dev/null)
if [ $? -ne 0 ] || [ -z "$PROFILE_NAME" ]; then
echo "⚠️ Warning: Failed to extract Name from provisioning profile, will use provided IOS_PROV_PROFILE_NAME"
PROFILE_NAME="$IOS_PROV_PROFILE_NAME"
fi
echo "Profile UUID: $PROFILE_UUID"
echo "Profile Name: $PROFILE_NAME"
# Install provisioning profile in the correct location with UUID filename
echo "Installing provisioning profile in filesystem..."
mkdir -p "/Users/runner/Library/MobileDevice/Provisioning Profiles"
# Copy with the UUID as filename
UUID_TARGET_PATH="/Users/runner/Library/MobileDevice/Provisioning Profiles/${PROFILE_UUID}.mobileprovision"
cp -v "${{ env.APP_PATH }}${{ env.IOS_PROV_PROFILE_PROJ_PATH }}" "$UUID_TARGET_PATH"
# Set correct permissions on the profile
chmod 644 "$UUID_TARGET_PATH"
chown runner:staff "$UUID_TARGET_PATH"
# Save the profile path and name to environment for later steps
echo "IOS_PROV_PROFILE_PATH=$UUID_TARGET_PATH" >> $GITHUB_ENV
echo "IOS_PROV_PROFILE_NAME=$PROFILE_NAME" >> $GITHUB_ENV
# Print provisioning profile information
echo "Provisioning Profile Information:"
echo "--------------------------------"
echo "Profile Name (from file): $PROFILE_NAME"
echo "Profile Name (from env): $IOS_PROV_PROFILE_NAME"
echo "Profile Path: $UUID_TARGET_PATH"
echo "Profile UUID: $PROFILE_UUID"
echo "App Identifier: $IOS_APP_IDENTIFIER"
echo "Team ID: $IOS_TEAM_ID"
echo "--------------------------------"
# List all provisioning profiles in the system with detailed info
echo "List of all provisioning profiles in system:"
ls -la "/Users/runner/Library/MobileDevice/Provisioning Profiles/"
# Clean up temp file
rm -f "$TEMP_PLIST_PATH"
echo "✅ Provisioning profile installation steps completed."
- name: Build Dependencies (iOS)
if: inputs.platform != 'android'
run: |
echo "🏗️ Building SDK dependencies..."
cd ${{ env.APP_PATH }}
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
echo "✅ Dependencies built successfully"
# act won't work with macos, but you can test with `bundle exec fastlane ios ...`
- name: Build and upload to App Store Connect/TestFlight
if: inputs.platform != 'android' && !env.ACT
env:
CI_VERSION: ${{ needs.bump-version.outputs.version }}
CI_IOS_BUILD: ${{ needs.bump-version.outputs.ios_build }}
CI_ANDROID_BUILD: ${{ needs.bump-version.outputs.android_build }}
ENABLE_DEBUG_LOGS: ${{ secrets.ENABLE_DEBUG_LOGS }}
GOOGLE_SIGNIN_ANDROID_CLIENT_ID: ${{ secrets.GOOGLE_SIGNIN_ANDROID_CLIENT_ID }}
GOOGLE_SIGNIN_IOS_CLIENT_ID: ${{ secrets.GOOGLE_SIGNIN_IOS_CLIENT_ID }}
GOOGLE_SIGNIN_WEB_CLIENT_ID: ${{ secrets.GOOGLE_SIGNIN_WEB_CLIENT_ID }}
GRAFANA_LOKI_PASSWORD: ${{ secrets.GRAFANA_LOKI_PASSWORD }}
GRAFANA_LOKI_URL: ${{ secrets.GRAFANA_LOKI_URL }}
GRAFANA_LOKI_USERNAME: ${{ secrets.GRAFANA_LOKI_USERNAME }}
IOS_APP_IDENTIFIER: ${{ secrets.IOS_APP_IDENTIFIER }}
IOS_CONNECT_API_KEY_BASE64: ${{ secrets.IOS_CONNECT_API_KEY_BASE64 }}
IOS_CONNECT_API_KEY_PATH: ${{ env.APP_PATH }}${{ env.IOS_CONNECT_API_KEY_PATH }}
IOS_CONNECT_ISSUER_ID: ${{ secrets.IOS_CONNECT_ISSUER_ID }}
IOS_CONNECT_KEY_ID: ${{ secrets.IOS_CONNECT_KEY_ID }}
IOS_P12_PASSWORD: ${{ secrets.IOS_P12_PASSWORD }}
IOS_PROJECT_NAME: ${{ secrets.IOS_PROJECT_NAME }}
IOS_PROJECT_SCHEME: ${{ secrets.IOS_PROJECT_SCHEME }}
IOS_PROV_PROFILE_DIR: ${{ env.IOS_PROV_PROFILE_DIRECTORY }}
IOS_PROV_PROFILE_NAME: ${{ secrets.IOS_PROV_PROFILE_NAME }}
IOS_PROV_PROFILE_PATH: ${{ env.IOS_PROV_PROFILE_PATH }}
IOS_SIGNING_CERTIFICATE: ${{ secrets.IOS_SIGNING_CERTIFICATE }}
IOS_TEAM_ID: ${{ secrets.IOS_TEAM_ID }}
IOS_TEAM_NAME: ${{ secrets.IOS_TEAM_NAME }}
IOS_TESTFLIGHT_GROUPS: ${{ secrets.IOS_TESTFLIGHT_GROUPS }}
NODE_OPTIONS: "--max-old-space-size=8192"
SEGMENT_KEY: ${{ secrets.SEGMENT_KEY }}
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
KYC_TEE_URL: ${{ secrets.KYC_TEE_URL }}
TURNKEY_AUTH_PROXY_CONFIG_ID: ${{ secrets.TURNKEY_AUTH_PROXY_CONFIG_ID }}
TURNKEY_GOOGLE_CLIENT_ID: ${{ secrets.TURNKEY_GOOGLE_CLIENT_ID }}
TURNKEY_ORGANIZATION_ID: ${{ secrets.TURNKEY_ORGANIZATION_ID }}
timeout-minutes: 90
run: |
cd ${{ env.APP_PATH }}
echo "--- Pre-Fastlane Diagnostics ---"
echo "Running as user: $(whoami)"
echo "Default keychain:"
security list-keychains -d user
echo "Identities in build.keychain:"
security find-identity -v -p codesigning build.keychain || echo "Failed to find identities in build.keychain"
echo "--- Starting Fastlane ---"
# Determine deployment track and version bump
DEPLOYMENT_TRACK="${{ inputs.deployment_track || 'internal' }}"
VERSION_BUMP="${{ needs.bump-version.outputs.version_bump_type }}"
TEST_MODE="${{ inputs.test_mode || false }}"
echo "📱 Deployment Configuration:"
echo " - Track: $DEPLOYMENT_TRACK"
echo " - Version Bump: $VERSION_BUMP (already applied in bump-version job)"
echo " - Version: ${{ needs.bump-version.outputs.version }}"
echo " - iOS Build: ${{ needs.bump-version.outputs.ios_build }}"
echo " - Test Mode: $TEST_MODE"
if [ "$TEST_MODE" = "true" ]; then
echo "🧪 Running in TEST MODE - will skip upload to TestFlight"
bundle exec fastlane ios deploy_auto \
deployment_track:$DEPLOYMENT_TRACK \
version_bump:skip \
test_mode:true \
--verbose
else
echo "🚀 Deploying to App Store Connect..."
bundle exec fastlane ios deploy_auto \
deployment_track:$DEPLOYMENT_TRACK \
version_bump:skip \
--verbose
fi
- name: Verify iOS build output
if: inputs.platform != 'android'
run: |
cd ${{ env.APP_PATH }}
echo "🔍 Verifying iOS build artifacts..."
# Find the IPA file
IPA_PATH=$(find ios/build -name "*.ipa" 2>/dev/null | head -1)
if [ -z "$IPA_PATH" ]; then
echo "❌ ERROR: No IPA file found in ios/build directory"
echo "Build may have failed silently. Check Fastlane logs above."
exit 1
fi
echo "✅ Found IPA: $IPA_PATH"
# Check file size (should be at least 10MB for a real app)
IPA_SIZE=$(stat -f%z "$IPA_PATH" 2>/dev/null || stat -c%s "$IPA_PATH")
IPA_SIZE_MB=$((IPA_SIZE / 1024 / 1024))
echo "📦 IPA size: ${IPA_SIZE_MB}MB"
if [ "$IPA_SIZE" -lt 10485760 ]; then
echo "⚠️ WARNING: IPA file is suspiciously small (< 10MB)"
echo "This may indicate a build problem."
fi
echo "✅ iOS build output verification passed"
# Version updates moved to separate job to avoid race conditions
- name: Remove project.pbxproj updates we don't want to commit
if: inputs.platform != 'android'
run: |
PBXPROJ_FILE="app/ios/Self.xcodeproj/project.pbxproj"
# Create a temporary file to store version info
echo "Extracting version information..."
rm -f versions.txt
grep -E 'CURRENT_PROJECT_VERSION = [0-9]+;|MARKETING_VERSION = [0-9]+\.[0-9]+\.[0-9]+;' "${PBXPROJ_FILE}" > versions.txt
# Check if we have version information
if [ -s versions.txt ]; then
echo "Found version information. Resetting file and re-applying versions..."
# Store the version values
CURRENT_VERSION=$(grep 'CURRENT_PROJECT_VERSION' versions.txt | head -1 | sed 's/.*CURRENT_PROJECT_VERSION = \([0-9]*\);.*/\1/')
MARKETING_VERSION=$(grep 'MARKETING_VERSION' versions.txt | head -1 | sed 's/.*MARKETING_VERSION = \([0-9]*\.[0-9]*\.[0-9]*\);.*/\1/')
echo "Current version: $CURRENT_VERSION"
echo "Marketing version: $MARKETING_VERSION"
# Reset the file to HEAD
git checkout HEAD -- "${PBXPROJ_FILE}"
# Update the versions if they exist
if [ ! -z "$CURRENT_VERSION" ]; then
sed -i '' "s/\(CURRENT_PROJECT_VERSION = \)[0-9]*;/\1$CURRENT_VERSION;/g" "${PBXPROJ_FILE}"
fi
if [ ! -z "$MARKETING_VERSION" ]; then
sed -i '' "s/\(MARKETING_VERSION = \)[0-9]*\.[0-9]*\.[0-9]*;/\1$MARKETING_VERSION;/g" "${PBXPROJ_FILE}"
fi
echo "Version information successfully applied."
else
echo "No version information found. Resetting file..."
git checkout HEAD -- "${PBXPROJ_FILE}"
fi
# Clean up
rm -f versions.txt
- name: Monitor cache usage
if: always()
run: |
echo "📊 Cache Size Report (iOS Build)"
echo "================================"
if [ -d "${{ env.APP_PATH }}/node_modules" ]; then
NODE_SIZE=$(du -sh "${{ env.APP_PATH }}/node_modules" | cut -f1)
echo "Node modules: $NODE_SIZE"
fi
if [ -d "${{ env.APP_PATH }}/vendor/bundle" ]; then
GEMS_SIZE=$(du -sh "${{ env.APP_PATH }}/vendor/bundle" | cut -f1)
echo "Ruby gems: $GEMS_SIZE"
fi
if [ -d "${{ env.APP_PATH }}/ios/Pods" ]; then
PODS_SIZE=$(du -sh "${{ env.APP_PATH }}/ios/Pods" | cut -f1)
echo "CocoaPods: $PODS_SIZE"
fi
echo "================================"
echo "💡 GitHub Actions cache limit: 10GB per repository"
build-android:
needs: [bump-version]
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
id-token: write
if: |
(github.event_name != 'pull_request' ||
(github.event.action == 'closed' && github.event.pull_request.merged == true)) &&
(
(inputs.platform == 'android' || inputs.platform == 'both') ||
(github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'deploy:ios'))
)
steps:
- name: Mobile deployment status
run: |
echo "🚀 Mobile deployment is enabled - proceeding with Android build"
echo "📱 Platform: ${{ inputs.platform || 'both' }}"
echo "🎯 Track: ${{ inputs.deployment_track || 'internal' }}"
echo "📦 Version bump: ${{ inputs.version_bump || 'build' }}"
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "🔀 Triggered by PR merge: #${{ github.event.pull_request.number }} - ${{ github.event.pull_request.title }}"
echo "👤 Merged by: ${{ github.event.pull_request.merged_by.login }}"
if ${{ contains(github.event.pull_request.labels.*.name, 'deploy:android') }}; then
echo "🏷️ Label: deploy:android (skipping iOS)"
fi
fi
- uses: actions/checkout@v6
if: inputs.platform != 'ios'
with:
fetch-depth: 0
# Checkout the branch that triggered the workflow
ref: ${{ github.ref_name }}
- uses: "google-github-actions/auth@v2"
with:
project_id: "plucky-tempo-454713-r0"
workload_identity_provider: "projects/852920390127/locations/global/workloadIdentityPools/gh-self/providers/github-by-repos"
service_account: "self-xyz@plucky-tempo-454713-r0.iam.gserviceaccount.com"
- name: Free up disk space
uses: ./.github/actions/free-disk-space
# Fail fast: set up JDK for keytool and verify Android secrets early
- name: Setup Java environment
if: inputs.platform != 'ios'
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}
- name: Decode Android Secrets
if: inputs.platform != 'ios'
run: |
echo "${{ secrets.ANDROID_KEYSTORE }}" | base64 --decode > ${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}
- name: Verify Android Secrets
if: inputs.platform != 'ios'
run: |
# Verify Google Cloud auth via Workload Identity Federation (ADC)
if [ -z "$GOOGLE_APPLICATION_CREDENTIALS" ] || [ ! -f "$GOOGLE_APPLICATION_CREDENTIALS" ]; then
echo "❌ Error: GOOGLE_APPLICATION_CREDENTIALS not set or file missing. Ensure google-github-actions/auth ran."
exit 1
fi
# Verify keystore file exists and is valid
if [ ! -f "${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}" ]; then
echo "❌ Error: Keystore file was not created successfully"
exit 1
fi
# Try to verify the keystore with the provided password
if ! keytool -list -v -keystore "${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}" -storepass "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" >/dev/null 2>&1; then
echo "❌ Error: Invalid keystore password"
exit 1
fi
# Verify the key alias exists
if ! keytool -list -v -keystore "${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}" -storepass "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" -alias "${{ secrets.ANDROID_KEY_ALIAS }}" >/dev/null 2>&1; then
echo "❌ Error: Key alias '${{ secrets.ANDROID_KEY_ALIAS }}' not found in keystore"
exit 1
fi
# Verify the key password
if ! keytool -list -v -keystore "${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}" -storepass "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" -alias "${{ secrets.ANDROID_KEY_ALIAS }}" -keypass "${{ secrets.ANDROID_KEY_PASSWORD }}" >/dev/null 2>&1; then
echo "❌ Error: Invalid key password"
exit 1
fi
# Detect keystore type and export for later steps
KEYSTORE_TYPE=$(keytool -list -v -keystore "${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}" -storepass "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" 2>/dev/null | awk -F': ' '/Keystore type:/ {print $2; exit}')
if [ -z "$KEYSTORE_TYPE" ]; then
echo "❌ Error: Unable to determine keystore type"
exit 1
fi
echo "ANDROID_KEYSTORE_TYPE=$KEYSTORE_TYPE" >> "$GITHUB_ENV"
echo "Detected keystore type: $KEYSTORE_TYPE"
# Ensure the alias holds a PrivateKeyEntry (required for signing)
if ! keytool -list -v -keystore "${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}" -storepass "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" -alias "${{ secrets.ANDROID_KEY_ALIAS }}" -keypass "${{ secrets.ANDROID_KEY_PASSWORD }}" | grep -q "Entry type: PrivateKeyEntry"; then
echo "❌ Error: Alias '${{ secrets.ANDROID_KEY_ALIAS }}' is not a PrivateKeyEntry"
exit 1
fi
echo "✅ All Android secrets verified successfully!"
- name: Read and sanitize Node.js version
shell: bash
run: |
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
echo "❌ .nvmrc is missing or empty"; exit 1;
fi
VERSION="$(tr -d '\r\n' < .nvmrc)"
VERSION="${VERSION#v}"
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
fi
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
- name: Verify branch and commit (Android)
if: needs.bump-version.outputs.platform != 'ios'
run: |
echo "🔍 Verifying we're building from the correct branch and commit..."
echo "Current branch: $(git branch --show-current || git symbolic-ref --short HEAD 2>/dev/null || echo 'detached')"
echo "Current commit: $(git rev-parse HEAD)"
echo "Current commit message: $(git log -1 --pretty=format:'%s')"
BUILD_BRANCH="${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref || github.ref_name }}"
echo "Building from branch: $BUILD_BRANCH"
echo "Target HEAD commit: $(git rev-parse origin/$BUILD_BRANCH)"
echo "Target HEAD message: $(git log -1 --pretty=format:'%s' origin/$BUILD_BRANCH)"
if [ "$(git rev-parse HEAD)" != "$(git rev-parse origin/$BUILD_BRANCH)" ]; then
echo "⚠️ WARNING: Current commit differs from latest $BUILD_BRANCH commit"
echo "This might indicate we're not building from the latest $BUILD_BRANCH branch"
git log --oneline HEAD..origin/$BUILD_BRANCH || true
else
echo "✅ Building from latest $BUILD_BRANCH commit"
fi
- name: Apply version bump for build
if: needs.bump-version.outputs.platform != 'ios'
run: |
cd ${{ env.APP_PATH }}
VERSION="${{ needs.bump-version.outputs.version }}"
IOS_BUILD="${{ needs.bump-version.outputs.ios_build }}"
ANDROID_BUILD="${{ needs.bump-version.outputs.android_build }}"
echo "📝 Applying version bump for Android build: $VERSION (iOS Build: $IOS_BUILD, Android Build: $ANDROID_BUILD)"
# Use version-manager script to apply versions
node ${{ env.APP_PATH }}/scripts/version-manager.cjs apply "$VERSION" "$IOS_BUILD" "$ANDROID_BUILD"
- name: Compute .yarnrc.yml hash
id: yarnrc-hash
uses: ./.github/actions/yarnrc-hash
- name: Cache Yarn artifacts
id: yarn-cache
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
.yarn/install-state.gz
.yarn/unplugged
cache-version: ${{ env.GH_CACHE_VERSION }}-node-${{ env.NODE_VERSION_SANITIZED }}-${{ steps.yarnrc-hash.outputs.hash }}
- name: Cache Ruby gems
id: gems-cache
uses: ./.github/actions/cache-bundler
with:
path: ${{ env.APP_PATH }}/vendor/bundle
lock-file: app/Gemfile.lock
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-ruby${{ env.RUBY_VERSION }}
- name: Cache Gradle dependencies
id: gradle-cache
uses: ./.github/actions/cache-gradle
with:
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.GH_GRADLE_CACHE_VERSION }}
- name: Cache Android NDK
id: ndk-cache
uses: actions/cache@v4
with:
path: ${{ env.ANDROID_SDK_ROOT }}/ndk/${{ env.ANDROID_NDK_VERSION }}
key: ${{ runner.os }}-ndk-${{ env.ANDROID_NDK_VERSION }}
- name: Log cache status
run: |
echo "Cache hit results:"
echo "- Yarn cache hit: ${{ steps.yarn-cache.outputs.cache-hit }}"
echo "- Gems cache hit: ${{ steps.gems-cache.outputs.cache-hit }}"
echo "- Gradle cache hit: ${{ steps.gradle-cache.outputs.cache-hit }}"
echo "- NDK cache hit: ${{ steps.ndk-cache.outputs.cache-hit }}"
- name: Disable Yarn hardened mode
run: echo "YARN_ENABLE_HARDENED_MODE=0" >> $GITHUB_ENV
- name: Verify lock files are up to date
run: |
echo "🔍 Checking if lock files are in sync with dependency files..."
# For yarn workspaces, yarn.lock is at root
if [ ! -f "${{ env.WORKSPACE }}/yarn.lock" ]; then
echo "❌ ERROR: yarn.lock file is missing at workspace root!"
echo "Run 'yarn install' at the repository root and commit the yarn.lock file."
exit 1
fi
# Gemfile.lock is in app directory
if [ ! -f "${{ env.APP_PATH }}/Gemfile.lock" ]; then
echo "❌ ERROR: Gemfile.lock file is missing!"
echo "Run 'bundle install' in the app directory and commit the Gemfile.lock file."
exit 1
fi
echo "✅ Lock files exist"
- name: Generate token for self repositories
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false }}
uses: ./.github/actions/generate-github-token
id: github-token
with:
app-id: ${{ vars.GH_WORKFLOWS_CROSS_ACCESS_ID }}
private-key: ${{ secrets.GH_WORKFLOWS_CROSS_ACCESS_KEY }}
- name: Install Mobile Dependencies (main repo)
if: inputs.platform != 'ios' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false)
uses: ./.github/actions/mobile-setup
with:
app_path: ${{ env.APP_PATH }}
node_version: ${{ env.NODE_VERSION }}
ruby_version: ${{ env.RUBY_VERSION }}
workspace: ${{ env.WORKSPACE }}
env:
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
PLATFORM: ${{ inputs.platform }}
- name: Install Mobile Dependencies (forked PRs - no secrets)
if: inputs.platform != 'ios' && github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true
uses: ./.github/actions/mobile-setup
with:
app_path: ${{ env.APP_PATH }}
node_version: ${{ env.NODE_VERSION }}
ruby_version: ${{ env.RUBY_VERSION }}
workspace: ${{ env.WORKSPACE }}
env:
PLATFORM: ${{ inputs.platform }}
# android specific steps
- name: Setup Android SDK
if: inputs.platform != 'ios'
uses: android-actions/setup-android@v3
with:
accept-android-sdk-licenses: true
- name: Install NDK
if: inputs.platform != 'ios' && steps.ndk-cache.outputs.cache-hit != 'true'
uses: nick-fields/retry@v3
with:
timeout_minutes: 15
max_attempts: 5
retry_wait_seconds: 10
command: sdkmanager "ndk;${{ env.ANDROID_NDK_VERSION }}"
- name: Install CMake
if: inputs.platform != 'ios' && steps.ndk-cache.outputs.cache-hit != 'true'
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 10
command: sdkmanager "cmake;3.22.1"
- name: Set Gradle JVM options
if: inputs.platform != 'ios' # Apply to CI builds (not just ACT)
run: |
echo "org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8" >> ${{ env.APP_PATH }}/android/gradle.properties
- name: Install Python dependencies for Play Store upload
if: inputs.platform != 'ios'
run: |
python -m pip install --upgrade pip
pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
- name: Setup Android private modules
if: inputs.platform != 'ios'
run: |
cd ${{ env.APP_PATH }}
PLATFORM=android node scripts/setup-private-modules.cjs
env:
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
CI: true
- name: Build Dependencies (Android)
if: inputs.platform != 'ios'
run: |
echo "🏗️ Building SDK dependencies..."
cd ${{ env.APP_PATH }}
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
echo "✅ Dependencies built successfully"
- name: Build AAB with Fastlane
if: inputs.platform != 'ios'
env:
CI_VERSION: ${{ needs.bump-version.outputs.version }}
CI_IOS_BUILD: ${{ needs.bump-version.outputs.ios_build }}
CI_ANDROID_BUILD: ${{ needs.bump-version.outputs.android_build }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
ANDROID_KEYSTORE: ${{ secrets.ANDROID_KEYSTORE }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEYSTORE_PATH: ${{ env.APP_PATH }}${{ env.ANDROID_KEYSTORE_PATH }}
ANDROID_PACKAGE_NAME: ${{ secrets.ANDROID_PACKAGE_NAME }}
ENABLE_DEBUG_LOGS: ${{ secrets.ENABLE_DEBUG_LOGS }}
GOOGLE_SIGNIN_ANDROID_CLIENT_ID: ${{ secrets.GOOGLE_SIGNIN_ANDROID_CLIENT_ID }}
GOOGLE_SIGNIN_IOS_CLIENT_ID: ${{ secrets.GOOGLE_SIGNIN_IOS_CLIENT_ID }}
GOOGLE_SIGNIN_WEB_CLIENT_ID: ${{ secrets.GOOGLE_SIGNIN_WEB_CLIENT_ID }}
GRAFANA_LOKI_PASSWORD: ${{ secrets.GRAFANA_LOKI_PASSWORD }}
GRAFANA_LOKI_URL: ${{ secrets.GRAFANA_LOKI_URL }}
GRAFANA_LOKI_USERNAME: ${{ secrets.GRAFANA_LOKI_USERNAME }}
NODE_OPTIONS: "--max-old-space-size=6144"
SEGMENT_KEY: ${{ secrets.SEGMENT_KEY }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
KYC_TEE_URL: ${{ secrets.KYC_TEE_URL }}
TURNKEY_AUTH_PROXY_CONFIG_ID: ${{ secrets.TURNKEY_AUTH_PROXY_CONFIG_ID }}
TURNKEY_GOOGLE_CLIENT_ID: ${{ secrets.TURNKEY_GOOGLE_CLIENT_ID }}
TURNKEY_ORGANIZATION_ID: ${{ secrets.TURNKEY_ORGANIZATION_ID }}
run: |
cd ${{ env.APP_PATH }}
# Determine deployment track and version bump
DEPLOYMENT_TRACK="${{ inputs.deployment_track || 'internal' }}"
VERSION_BUMP="${{ needs.bump-version.outputs.version_bump_type }}"
TEST_MODE="${{ inputs.test_mode || false }}"
echo "🤖 Build Configuration:"
echo " - Track: $DEPLOYMENT_TRACK"
echo " - Version Bump: $VERSION_BUMP (already applied in bump-version job)"
echo " - Version: ${{ needs.bump-version.outputs.version }}"
echo " - Android Build: ${{ needs.bump-version.outputs.android_build }}"
echo " - Test Mode: $TEST_MODE"
echo "🔨 Building AAB with Fastlane..."
bundle exec fastlane android build_only \
deployment_track:$DEPLOYMENT_TRACK \
version_bump:skip \
--verbose
- name: Verify Android build output
if: inputs.platform != 'ios'
run: |
cd ${{ env.APP_PATH }}
echo "🔍 Verifying Android build artifacts..."
# Check for AAB file
AAB_PATH="android/app/build/outputs/bundle/release/app-release.aab"
if [ ! -f "$AAB_PATH" ]; then
echo "❌ ERROR: AAB file not found at $AAB_PATH"
echo "Build may have failed silently. Check Fastlane logs above."
exit 1
fi
echo "✅ Found AAB: $AAB_PATH"
# Check file size (should be at least 5MB for a real app)
AAB_SIZE=$(stat -c%s "$AAB_PATH" 2>/dev/null || stat -f%z "$AAB_PATH")
AAB_SIZE_MB=$((AAB_SIZE / 1024 / 1024))
echo "📦 AAB size: ${AAB_SIZE_MB}MB"
if [ "$AAB_SIZE" -lt 5242880 ]; then
echo "⚠️ WARNING: AAB file is suspiciously small (< 5MB)"
echo "This may indicate a build problem."
fi
echo "✅ Android build output verification passed"
- name: Clean up Gradle build artifacts
if: inputs.platform != 'ios'
uses: ./.github/actions/cleanup-gradle-artifacts
- name: Upload to Play Store Internal App Sharing (PR preview)
id: ias-upload
if: inputs.platform != 'ios' && inputs.test_mode != true && inputs.pr_number != ''
timeout-minutes: 10
run: |
cd ${{ env.APP_PATH }}
echo "🧪 PR preview build for #${{ inputs.pr_number }} — uploading to Internal App Sharing..."
python scripts/upload_to_play_store.py \
--aab "android/app/build/outputs/bundle/release/app-release.aab" \
--package-name "${{ secrets.ANDROID_PACKAGE_NAME }}" \
--mode ias
- name: Upload to Google Play Store track using WIF
if: inputs.platform != 'ios' && inputs.test_mode != true && inputs.pr_number == ''
timeout-minutes: 10
run: |
cd ${{ env.APP_PATH }}
# Determine deployment track
DEPLOYMENT_TRACK="${{ inputs.deployment_track || 'internal' }}"
echo "🚀 Uploading to Google Play Store using Workload Identity Federation..."
python scripts/upload_to_play_store.py \
--aab "android/app/build/outputs/bundle/release/app-release.aab" \
--package-name "${{ secrets.ANDROID_PACKAGE_NAME }}" \
--track "$DEPLOYMENT_TRACK"
- name: Post PR preview build link to Slack
if: inputs.platform != 'ios' && inputs.test_mode != true && inputs.pr_number != '' && steps.ias-upload.outputs.download_url != ''
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_QA_BUILDS }}
PR_NUMBER: ${{ inputs.pr_number }}
DOWNLOAD_URL: ${{ steps.ias-upload.outputs.download_url }}
APP_VERSION: ${{ needs.bump-version.outputs.version }}
BUILD_NUMBER: ${{ needs.bump-version.outputs.android_build }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
if [ -z "$SLACK_WEBHOOK_URL" ]; then
echo "⚠️ SLACK_WEBHOOK_QA_BUILDS not configured — skipping Slack notify"
echo " (Install URL: $DOWNLOAD_URL)"
exit 0
fi
# Fetch PR metadata so the Slack card is informative
PR_JSON=$(gh api "repos/${{ github.repository }}/pulls/${PR_NUMBER}" --jq '{title,html_url,user:.user.login,body}')
export PR_TITLE=$(echo "$PR_JSON" | python3 -c 'import json,sys;print(json.load(sys.stdin)["title"])')
export PR_URL=$(echo "$PR_JSON" | python3 -c 'import json,sys;print(json.load(sys.stdin)["html_url"])')
export PR_USER=$(echo "$PR_JSON" | python3 -c 'import json,sys;print(json.load(sys.stdin)["user"])')
python3 <<'PY'
import json, os, urllib.request
payload = {
"text": f"Android preview build ready for PR #{os.environ['PR_NUMBER']}",
"blocks": [
{
"type": "header",
"text": {"type": "plain_text", "text": f"🤖 Android preview — PR #{os.environ['PR_NUMBER']}"},
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"*<{os.environ['PR_URL']}|{os.environ.get('PR_TITLE','(no title)')}>*\n_by {os.environ.get('PR_USER','?')}_",
},
},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": f"*Version*\n`{os.environ.get('APP_VERSION','?')} ({os.environ.get('BUILD_NUMBER','?')})`"},
{"type": "mrkdwn", "text": f"*Source*\n<{os.environ['RUN_URL']}|CI run>"},
],
},
{
"type": "actions",
"elements": [
{
"type": "button",
"style": "primary",
"text": {"type": "plain_text", "text": "📱 Install on Android"},
"url": os.environ["DOWNLOAD_URL"],
},
{
"type": "button",
"text": {"type": "plain_text", "text": "View PR"},
"url": os.environ["PR_URL"],
},
],
},
{
"type": "context",
"elements": [
{"type": "mrkdwn", "text": "Open the install link on your Android device (must be signed into a Play Store tester account)."},
],
},
],
}
req = urllib.request.Request(
os.environ["SLACK_WEBHOOK_URL"],
data=json.dumps(payload).encode(),
headers={"Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as resp:
print(f"Slack webhook status: {resp.status}")
PY
# Also export to the run summary so the URL is visible in the GH Actions UI
{
echo "## 📱 Android preview build"
echo ""
echo "- PR: [#$PR_NUMBER]($PR_URL) — $PR_TITLE"
echo "- Version: \`$APP_VERSION ($BUILD_NUMBER)\`"
echo "- Install URL: $DOWNLOAD_URL"
} >> "$GITHUB_STEP_SUMMARY"
- name: Monitor cache usage
if: always()
run: |
echo "📊 Cache Size Report (Android Build)"
echo "===================================="
if [ -d "${{ env.APP_PATH }}/node_modules" ]; then
NODE_SIZE=$(du -sh "${{ env.APP_PATH }}/node_modules" | cut -f1)
echo "Node modules: $NODE_SIZE"
fi
if [ -d "${{ env.APP_PATH }}/ios/vendor/bundle" ]; then
GEMS_SIZE=$(du -sh "${{ env.APP_PATH }}/ios/vendor/bundle" | cut -f1)
echo "Ruby gems: $GEMS_SIZE"
fi
if [ -d "$HOME/.gradle/caches" ]; then
GRADLE_SIZE=$(du -sh "$HOME/.gradle/caches" | cut -f1)
echo "Gradle caches: $GRADLE_SIZE"
fi
if [ -d "${{ env.ANDROID_SDK_ROOT }}/ndk/${{ env.ANDROID_NDK_VERSION }}" ]; then
NDK_SIZE=$(du -sh "${{ env.ANDROID_SDK_ROOT }}/ndk/${{ env.ANDROID_NDK_VERSION }}" | cut -f1)
echo "Android NDK: $NDK_SIZE"
fi
echo "===================================="
echo "💡 GitHub Actions cache limit: 10GB per repository"
# Consolidated version bump PR - runs after both platforms complete
# NOTE: This job checks out the TARGET branch for version bump (default: dev)
# This is DIFFERENT from the build branch - we build from staging/feature branch,
# but create the version bump PR to dev so it can be reviewed before merging to staging
create-version-bump-pr:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
needs: [bump-version, build-ios, build-android]
# Skip when this is a per-PR preview build — preview builds must not mutate
# the repo's version lineage.
if: |
always() &&
inputs.pr_number == '' &&
(github.event_name != 'pull_request' ||
(github.event.action == 'closed' && github.event.pull_request.merged == true)) &&
(needs.build-ios.result == 'success' || needs.build-android.result == 'success')
env:
APP_PATH: ${{ github.workspace }}/app
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
# Checkout target branch for version bump PR (always dev)
ref: "dev"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
- name: Copy version-manager from build branch
run: |
BUILD_REF="${{ github.ref_name }}"
echo "📋 Using version-manager.cjs from build branch: $BUILD_REF"
SCRIPT_CONTENT=$(git show "origin/${BUILD_REF}:app/scripts/version-manager.cjs") || {
echo "❌ Failed to read version-manager.cjs from origin/${BUILD_REF}"
exit 1
}
echo "$SCRIPT_CONTENT" > "${{ env.APP_PATH }}/scripts/version-manager.cjs"
- name: Apply version bump from outputs
run: |
cd ${{ env.APP_PATH }}
VERSION="${{ needs.bump-version.outputs.version }}"
IOS_BUILD="${{ needs.bump-version.outputs.ios_build }}"
ANDROID_BUILD="${{ needs.bump-version.outputs.android_build }}"
IOS_SUCCESS="${{ needs.build-ios.result }}"
ANDROID_SUCCESS="${{ needs.build-android.result }}"
echo "📝 Applying version bump: $VERSION (iOS: $IOS_BUILD [$IOS_SUCCESS], Android: $ANDROID_BUILD [$ANDROID_SUCCESS])"
# Update package.json, version.json, and platform build files
# Pass build results so the script only updates platforms that succeeded
node scripts/version-manager.cjs apply "$VERSION" "$IOS_BUILD" "$ANDROID_BUILD" "$IOS_SUCCESS" "$ANDROID_SUCCESS"
- name: Load version-managed files
run: |
cd ${{ env.APP_PATH }}
VERSION_MANAGED_FILES="$(node scripts/version-manager.cjs files --shell)"
if [ -z "$VERSION_MANAGED_FILES" ]; then
echo "❌ Failed to load version-managed files"
exit 1
fi
{
echo "VERSION_MANAGED_FILES<<EOF"
echo "$VERSION_MANAGED_FILES"
echo "EOF"
} >> $GITHUB_ENV
echo "🗂️ Version-managed files: $VERSION_MANAGED_FILES"
- name: Verify version changes
run: |
cd ${{ env.APP_PATH }}
# Check that version-managed files actually changed
if ! git diff --quiet -- $VERSION_MANAGED_FILES; then
echo "✅ Version changes detected"
git diff -- $VERSION_MANAGED_FILES
else
echo "⚠️ No version changes detected in version-managed files"
echo "This may indicate a problem with version application"
exit 1
fi
- name: Determine platforms that succeeded and PR title
id: platforms
run: |
VERSION="${{ needs.bump-version.outputs.version }}"
PLATFORM="${{ needs.bump-version.outputs.platform }}"
IOS_RESULT="${{ needs.build-ios.result }}"
ANDROID_RESULT="${{ needs.build-android.result }}"
# Determine what was actually built
PLATFORMS_BUILT=""
if [ "$IOS_RESULT" = "success" ]; then
PLATFORMS_BUILT="iOS"
fi
if [ "$ANDROID_RESULT" = "success" ]; then
if [ -n "$PLATFORMS_BUILT" ]; then
PLATFORMS_BUILT="${PLATFORMS_BUILT} & Android"
else
PLATFORMS_BUILT="Android"
fi
fi
# Generate PR title based on what was bumped
if [ "$PLATFORM" = "ios" ]; then
PR_TITLE="chore: bump iOS version to $VERSION"
elif [ "$PLATFORM" = "android" ]; then
PR_TITLE="chore: bump Android version to $VERSION"
else
PR_TITLE="chore: bump mobile app version to $VERSION"
fi
echo "platforms=${PLATFORMS_BUILT}" >> $GITHUB_OUTPUT
echo "pr_title=${PR_TITLE}" >> $GITHUB_OUTPUT
echo "📱 Successful builds: $PLATFORMS_BUILT"
echo "📝 PR title: $PR_TITLE"
- name: Create version bump PR
if: inputs.dry_run != true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
VERSION="${{ needs.bump-version.outputs.version }}"
TARGET_BRANCH="dev"
# Add timestamp to branch name to avoid collisions
TIMESTAMP=$(date +%s%N | cut -b1-13) # Milliseconds since epoch (13 digits)
BRANCH_NAME="ci/bump-mobile-version-${VERSION}-${TIMESTAMP}"
PR_TITLE="${{ steps.platforms.outputs.pr_title }}"
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Check if a PR already exists for this version (avoid duplicate PRs)
EXISTING_PR=$(gh pr list --base "${TARGET_BRANCH}" --state open --json number,title,headRefName --jq ".[] | select(.title | contains(\"${VERSION}\")) | .number" | head -1)
if [ -n "$EXISTING_PR" ]; then
echo "⚠️ PR #${EXISTING_PR} already exists for version ${VERSION}"
echo "ℹ️ Skipping PR creation to avoid duplicates"
echo "ℹ️ Existing PR: https://github.com/${{ github.repository }}/pull/${EXISTING_PR}"
exit 0
fi
# Commit the version changes
cd ${{ env.APP_PATH }}
git add $VERSION_MANAGED_FILES
if git diff --cached --quiet; then
echo "⚠️ No version changes to commit"
exit 0
fi
git commit -m "chore: bump mobile app version to $VERSION" -m "Update build numbers, platform build files, and deployment timestamps after successful deployment."
# Create new branch from current HEAD (bump target branch with version bump)
git checkout -b ${BRANCH_NAME}
# Push the branch
git push --set-upstream origin ${BRANCH_NAME}
# Create PR to target branch (usually dev)
echo "Creating PR to ${TARGET_BRANCH}..."
gh pr create \
--base ${TARGET_BRANCH} \
--head ${BRANCH_NAME} \
--title "${PR_TITLE}" \
--body "🤖 Automated version bump after successful deployment
**Version:** $VERSION
**iOS Build:** ${{ needs.bump-version.outputs.ios_build }}
**Android Build:** ${{ needs.bump-version.outputs.android_build }}
**Platforms Built:** ${{ steps.platforms.outputs.platforms }}
**Build Branch:** ${{ github.ref_name }}
**Target Branch:** ${TARGET_BRANCH}
This PR updates:
- Build numbers for deployed platforms
- Platform build files (Android `versionCode`, iOS `CURRENT_PROJECT_VERSION` and `MARKETING_VERSION`)
- Deployment timestamps (\`lastDeployed\`) for successful builds
This PR was automatically created by the mobile deployment workflow." \
--label "automated"
echo "✅ Version bump PR created successfully to ${TARGET_BRANCH}"
# Create git tags after successful deployment
create-release-tags:
runs-on: ubuntu-latest
permissions:
contents: write
needs: [bump-version, build-ios, build-android, create-version-bump-pr]
if: |
always() &&
(inputs.dry_run != true) &&
needs.create-version-bump-pr.result == 'success' &&
(needs.build-ios.result == 'success' || needs.build-android.result == 'success') &&
(inputs.deployment_track == 'production')
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
# Checkout target branch for tagging (always dev)
ref: "dev"
token: ${{ secrets.GITHUB_TOKEN }}
- name: Configure Git
run: |
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
- name: Create and push tags
run: |
cd ${{ env.APP_PATH }}
# Use version info from bump-version outputs
VERSION="${{ needs.bump-version.outputs.version }}"
IOS_BUILD="${{ needs.bump-version.outputs.ios_build }}"
ANDROID_BUILD="${{ needs.bump-version.outputs.android_build }}"
echo "📦 Creating tags for version $VERSION"
# Create main version tag (idempotent)
if git tag -a "v${VERSION}" -m "Release ${VERSION}" 2>/dev/null; then
echo "✅ Created tag: v${VERSION}"
else
EXIT_CODE=$?
if [ $EXIT_CODE -eq 128 ]; then
echo "⏭️ Tag v${VERSION} already exists"
else
echo "❌ Failed to create tag v${VERSION} with exit code $EXIT_CODE"
exit 1
fi
fi
# Create platform-specific tags if deployments succeeded (idempotent)
if [ "${{ needs.build-ios.result }}" = "success" ]; then
TAG_NAME="v${VERSION}-ios-${IOS_BUILD}"
if git tag -a "${TAG_NAME}" -m "iOS Release ${VERSION} (Build ${IOS_BUILD})" 2>/dev/null; then
echo "✅ Created tag: ${TAG_NAME}"
else
EXIT_CODE=$?
if [ $EXIT_CODE -eq 128 ]; then
echo "⏭️ Tag ${TAG_NAME} already exists"
else
echo "❌ Failed to create tag ${TAG_NAME} with exit code $EXIT_CODE"
exit 1
fi
fi
fi
if [ "${{ needs.build-android.result }}" = "success" ]; then
TAG_NAME="v${VERSION}-android-${ANDROID_BUILD}"
if git tag -a "${TAG_NAME}" -m "Android Release ${VERSION} (Build ${ANDROID_BUILD})" 2>/dev/null; then
echo "✅ Created tag: ${TAG_NAME}"
else
EXIT_CODE=$?
if [ $EXIT_CODE -eq 128 ]; then
echo "⏭️ Tag ${TAG_NAME} already exists"
else
echo "❌ Failed to create tag ${TAG_NAME} with exit code $EXIT_CODE"
exit
Showing preview only (248K chars total). Download the full file or copy to clipboard to get everything.
gitextract_ajsfews0/
├── .actrc
├── .coderabbit.yaml
├── .cursor/
│ ├── mcp.json
│ └── rules/
│ ├── compliance-verification.mdc
│ └── test-memory-optimization.mdc
├── .cursorignore
├── .cursorrules
├── .editorconfig
├── .eslintignore
├── .gitattributes
├── .gitguardian.yml
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actionlint.yaml
│ ├── actions/
│ │ ├── cache-built-deps/
│ │ │ └── action.yml
│ │ ├── cache-bundler/
│ │ │ └── action.yml
│ │ ├── cache-core-sdk-build/
│ │ │ └── action.yml
│ │ ├── cache-gradle/
│ │ │ └── action.yml
│ │ ├── cache-mobile-sdk-build/
│ │ │ └── action.yml
│ │ ├── cache-pods/
│ │ │ └── action.yml
│ │ ├── cache-sdk-build/
│ │ │ └── action.yml
│ │ ├── cache-yarn/
│ │ │ └── action.yml
│ │ ├── cleanup-gradle-artifacts/
│ │ │ └── action.yml
│ │ ├── clone-android-passport-nfc-reader/
│ │ │ └── action.yml
│ │ ├── create-version-bump-pr/
│ │ │ └── action.yml
│ │ ├── find-ios-simulator/
│ │ │ └── action.yml
│ │ ├── free-disk-space/
│ │ │ └── action.yml
│ │ ├── generate-github-token/
│ │ │ └── action.yml
│ │ ├── get-version/
│ │ │ └── action.yml
│ │ ├── mobile-setup/
│ │ │ └── action.yml
│ │ ├── push-changes/
│ │ │ └── action.yml
│ │ ├── yarn-install/
│ │ │ └── action.yml
│ │ └── yarnrc-hash/
│ │ └── action.yml
│ └── workflows/
│ ├── block-non-dev-to-main.yml
│ ├── circuits-build.yml
│ ├── circuits.yml
│ ├── common-ci.yml
│ ├── contracts.yml
│ ├── core-sdk-ci.yml
│ ├── gitleaks.yml
│ ├── kmp-ci.yml
│ ├── mobile-bundle-analysis.yml
│ ├── mobile-ci.yml
│ ├── mobile-deploy-auto.yml
│ ├── mobile-deploy.yml
│ ├── mobile-e2e.yml
│ ├── mobile-sdk-ci.yml
│ ├── mobile-sdk-demo-ci.yml
│ ├── mobile-sdk-demo-e2e.yml
│ ├── native-shells-ci.yml
│ ├── npm-publish.yml
│ ├── qrcode-sdk-ci.yml
│ ├── release-calendar.yml
│ ├── rn-sdk-test-app-ci.yml
│ ├── swift-sdk-ci.yml
│ ├── web.yml
│ ├── webview-app-ci.yml
│ ├── webview-bridge-ci.yml
│ └── workspace-ci.yml
├── .gitignore
├── .gitleaks.toml
├── .gitleaksignore
├── .gitmodules
├── .husky/
│ └── pre-commit
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│ ├── settings.json
│ └── tasks.json
├── .watchmanconfig
├── AGENTS.md
├── CLAUDE.md
├── LICENSE
├── README.md
├── app/
│ ├── .babelrc
│ ├── .bundle/
│ │ └── config
│ ├── .codecov.yml
│ ├── .eslintrc.cjs
│ ├── .gitattributes
│ ├── .github/
│ │ └── workflows/
│ │ └── test-coverage.yml
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── .ruby-version
│ ├── .tool-versions
│ ├── AGENTS.md
│ ├── App.tsx
│ ├── Gemfile
│ ├── LICENSE
│ ├── README.md
│ ├── android/
│ │ ├── .gitignore
│ │ ├── app/
│ │ │ ├── build.gradle
│ │ │ ├── debug.keystore
│ │ │ ├── google-services.json
│ │ │ ├── proguard-rules.pro
│ │ │ └── src/
│ │ │ ├── debug/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── res/
│ │ │ │ └── xml/
│ │ │ │ └── network_security_config.xml
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── assets/
│ │ │ │ │ ├── fonts/
│ │ │ │ │ │ ├── Advercase-Regular.otf
│ │ │ │ │ │ ├── DINOT-Bold.otf
│ │ │ │ │ │ ├── DINOT-Medium.otf
│ │ │ │ │ │ └── IBMPlexMono-Regular.otf
│ │ │ │ │ └── masterList
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── proofofpassportapp/
│ │ │ │ │ ├── BackupModule.kt
│ │ │ │ │ ├── BackupPackage.kt
│ │ │ │ │ ├── CameraActivityPackage.java
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ ├── NativeLoggerBridgeModule.kt
│ │ │ │ │ ├── PhotoPickerActivity.java
│ │ │ │ │ ├── QRCodeScannerModule.java
│ │ │ │ │ ├── QRCodeScannerPackage.java
│ │ │ │ │ ├── ui/
│ │ │ │ │ │ ├── CameraMLKitFragment.kt
│ │ │ │ │ │ ├── PassportOCRViewManager.kt
│ │ │ │ │ │ ├── QRCodeScannerViewManager.kt
│ │ │ │ │ │ └── QrCodeScannerFragment.kt
│ │ │ │ │ └── utils/
│ │ │ │ │ └── QrCodeDetectorProcessor.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── rn_edit_text_material.xml
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ └── ic_launcher.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ ├── backup_rules.xml
│ │ │ │ ├── network_security_config.xml
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ └── release/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── awesomeproject/
│ │ │ └── ReactNativeFlipper.java
│ │ ├── build.gradle
│ │ ├── dev-keystore
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── link-assets-manifest.json
│ │ └── settings.gradle
│ ├── app.json
│ ├── babel.config.cjs
│ ├── babel.config.test.cjs
│ ├── declarations.d.ts
│ ├── deployments/
│ │ ├── artifacts/
│ │ │ ├── Deploy_Registry#Formatter.dbg.json
│ │ │ ├── Deploy_Registry#Formatter.json
│ │ │ ├── Deploy_Registry#OpenPassportRegister.dbg.json
│ │ │ ├── Deploy_Registry#OpenPassportRegister.json
│ │ │ ├── Deploy_Registry#PoseidonT3.dbg.json
│ │ │ ├── Deploy_Registry#PoseidonT3.json
│ │ │ ├── Deploy_Registry#Registry.dbg.json
│ │ │ ├── Deploy_Registry#Registry.json
│ │ │ ├── Deploy_Registry#SBT.dbg.json
│ │ │ ├── Deploy_Registry#SBT.json
│ │ │ ├── Deploy_Registry#Verifier_disclose.dbg.json
│ │ │ ├── Deploy_Registry#Verifier_disclose.json
│ │ │ ├── Deploy_Registry#Verifier_dsc_4096.dbg.json
│ │ │ ├── Deploy_Registry#Verifier_dsc_4096.json
│ │ │ ├── Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537.dbg.json
│ │ │ ├── Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537.json
│ │ │ ├── Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537.dbg.json
│ │ │ └── Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537.json
│ │ └── deployed_addresses.json
│ ├── docs/
│ │ ├── DOCSTRING_STYLE_GUIDE.md
│ │ ├── MOBILE_DEPLOYMENT.md
│ │ ├── TREE_SHAKING.md
│ │ └── examples/
│ │ └── tree-shaking/
│ │ ├── granular-circuits-example.ts
│ │ ├── level2-optimal-example.ts
│ │ ├── level3-migration-guide.ts
│ │ ├── level3-optimal-example.ts
│ │ └── optimal-pattern-example.ts
│ ├── env.sample
│ ├── env.ts
│ ├── fastlane/
│ │ ├── DEV.md
│ │ ├── Fastfile
│ │ ├── Pluginfile
│ │ ├── README.md
│ │ ├── helpers/
│ │ │ ├── android.rb
│ │ │ ├── common.rb
│ │ │ ├── ios.rb
│ │ │ ├── slack.rb
│ │ │ └── version_manager.rb
│ │ ├── helpers.rb
│ │ └── test/
│ │ ├── app_name_test.rb
│ │ └── helpers_test.rb
│ ├── firebase.json
│ ├── index.js
│ ├── ios/
│ │ ├── .bundle/
│ │ │ └── config
│ │ ├── .xcode.env
│ │ ├── App Thinning Size Report.txt
│ │ ├── AppDelegate.swift
│ │ ├── CameraView.swift
│ │ ├── GoogleService-Info.plist
│ │ ├── LiveMRZScannerView.swift
│ │ ├── LottieView.swift
│ │ ├── MRZScannerModule.m
│ │ ├── MRZScannerModule.swift
│ │ ├── MrzOcrCorrection.swift
│ │ ├── MrzResultMapper.swift
│ │ ├── MrzScanEngine.swift
│ │ ├── NativeLoggerBridge.m
│ │ ├── NativeLoggerBridge.swift
│ │ ├── NotificationService/
│ │ │ ├── Info.plist
│ │ │ ├── NotificationService.h
│ │ │ └── NotificationService.m
│ │ ├── OpenPassport/
│ │ │ ├── GoogleService-Info.plist
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ ├── LaunchScreen.storyboard
│ │ │ ├── OpenPassport.entitlements
│ │ │ ├── OpenPassportDebug.entitlements
│ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ └── passport.json
│ │ ├── OpenPassport.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ ├── PassportOCRViewManager.m
│ │ ├── PassportOCRViewManager.swift
│ │ ├── PassportReader.m
│ │ ├── PassportReader.swift
│ │ ├── PassportReaderCore.swift
│ │ ├── PhotoLibraryQRScannerViewController.swift
│ │ ├── Podfile
│ │ ├── PrivacyInfo.xcprivacy
│ │ ├── QKMRZScannerViewRepresentable.swift
│ │ ├── QRCodeScannerViewManager.m
│ │ ├── QRCodeScannerViewManager.swift
│ │ ├── QRScannerBridge.m
│ │ ├── QRScannerBridge.swift
│ │ ├── QRScannerViewController.swift
│ │ ├── ScannerHostingController.swift
│ │ ├── Self.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── OpenPassport.xcscheme
│ │ ├── Self.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── SelfAnalytics.swift
│ │ ├── link-assets-manifest.json
│ │ ├── local-pods/
│ │ │ ├── DiditSDK/
│ │ │ │ └── DiditSDK.podspec
│ │ │ └── OpenSSL-Universal/
│ │ │ └── OpenSSL-Universal.podspec
│ │ ├── passport.json
│ │ └── scripts/
│ │ ├── install-ios-deps-if-needed.sh
│ │ └── pod-install-with-cache-fix.sh
│ ├── jest.config.cjs
│ ├── jest.setup.js
│ ├── metro.config.cjs
│ ├── package.json
│ ├── react-native.config.cjs
│ ├── scripts/
│ │ ├── alias-imports.cjs
│ │ ├── analyze-tree-shaking.cjs
│ │ ├── bundle-analyze-ci.cjs
│ │ ├── capture-ios-crash-artifacts.cjs
│ │ ├── check-test-requires.cjs
│ │ ├── cleanup-ios-build.sh
│ │ ├── cleanup-private-modules.cjs
│ │ ├── find-type-import-issues.mjs
│ │ ├── generate-changelog.sh
│ │ ├── mobile-ci-build-android.sh
│ │ ├── mobile-deploy-confirm.cjs
│ │ ├── release.sh
│ │ ├── run-ios-simulator.cjs
│ │ ├── setup-macos.sh
│ │ ├── setup-private-modules.cjs
│ │ ├── tag.cjs
│ │ ├── test-e2e-local.sh
│ │ ├── test-tree-shaking.cjs
│ │ ├── tests/
│ │ │ ├── aliasImports.test.cjs
│ │ │ ├── bundleAnalyzeCi.test.cjs
│ │ │ ├── cleanupIosBuild.test.cjs
│ │ │ ├── mobileDeployConfirm.test.cjs
│ │ │ ├── mobileDeployConfirmModule.test.cjs
│ │ │ └── treeShaking.test.cjs
│ │ ├── upload_to_play_store.py
│ │ ├── version-manager.cjs
│ │ ├── version-manager.test.cjs
│ │ └── version.cjs
│ ├── src/
│ │ ├── assets/
│ │ │ ├── animations/
│ │ │ │ ├── launch_onboarding.json
│ │ │ │ ├── loader.ts
│ │ │ │ ├── passport_onboarding.json
│ │ │ │ ├── passport_scan.json
│ │ │ │ ├── passport_verify.json
│ │ │ │ ├── proof_failed.json
│ │ │ │ ├── proof_success.json
│ │ │ │ ├── qr_scan.json
│ │ │ │ ├── splash.json
│ │ │ │ └── warning.json
│ │ │ └── fonts/
│ │ │ ├── Advercase-Regular.otf
│ │ │ ├── DINOT-Bold.otf
│ │ │ ├── DINOT-Medium.otf
│ │ │ └── IBMPlexMono-Regular.otf
│ │ ├── components/
│ │ │ ├── AlertModal.tsx
│ │ │ ├── BackupDocumentationLink.tsx
│ │ │ ├── Disclosures.tsx
│ │ │ ├── ErrorBoundary.tsx
│ │ │ ├── FeedbackModal.tsx
│ │ │ ├── InputField.tsx
│ │ │ ├── LoadingUI.tsx
│ │ │ ├── Mnemonic.tsx
│ │ │ ├── PointHistoryList.tsx
│ │ │ ├── SystemBars.tsx
│ │ │ ├── Tips.tsx
│ │ │ ├── WebViewFooter.tsx
│ │ │ ├── documents/
│ │ │ │ ├── IDSelectorItem.tsx
│ │ │ │ ├── IDSelectorSheet.tsx
│ │ │ │ └── index.ts
│ │ │ ├── homescreen/
│ │ │ │ ├── CardBottomContent.tsx
│ │ │ │ ├── CardHeader.tsx
│ │ │ │ ├── EmptyIdCard.tsx
│ │ │ │ ├── ExpiredIdCard.tsx
│ │ │ │ ├── IdAttribute.tsx
│ │ │ │ ├── IdCard.tsx
│ │ │ │ ├── IdCardRevealed.tsx
│ │ │ │ ├── KycIdCard.tsx
│ │ │ │ ├── PendingIdCard.tsx
│ │ │ │ ├── SvgXmlWrapper.native.tsx
│ │ │ │ ├── SvgXmlWrapper.tsx
│ │ │ │ ├── SvgXmlWrapper.web.tsx
│ │ │ │ ├── UnregisteredIdCard.tsx
│ │ │ │ ├── cardSecurityBadge.ts
│ │ │ │ └── cardStyles.ts
│ │ │ ├── native/
│ │ │ │ ├── PassportCamera.tsx
│ │ │ │ ├── PassportCamera.web.tsx
│ │ │ │ ├── QRCodeScanner.tsx
│ │ │ │ ├── QRCodeScanner.web.tsx
│ │ │ │ └── RCTFragment.tsx
│ │ │ ├── navbar/
│ │ │ │ ├── AadhaarNavBar.tsx
│ │ │ │ ├── BaseNavBar.tsx
│ │ │ │ ├── DefaultNavBar.tsx
│ │ │ │ ├── DocumentFlowNavBar.tsx
│ │ │ │ ├── HeadlessNavForEuclid.tsx
│ │ │ │ ├── HomeNavBar.tsx
│ │ │ │ ├── IdDetailsNavBar.tsx
│ │ │ │ ├── Points.tsx
│ │ │ │ ├── PointsNavBar.tsx
│ │ │ │ ├── WebViewNavBar.tsx
│ │ │ │ └── index.ts
│ │ │ ├── proof-request/
│ │ │ │ ├── BottomActionBar.tsx
│ │ │ │ ├── BottomVerifyBar.tsx
│ │ │ │ ├── ConnectedWalletBadge.tsx
│ │ │ │ ├── DisclosureItem.tsx
│ │ │ │ ├── ProofMetadataBar.tsx
│ │ │ │ ├── ProofRequestCard.tsx
│ │ │ │ ├── ProofRequestHeader.tsx
│ │ │ │ ├── WalletAddressModal.tsx
│ │ │ │ ├── designTokens.ts
│ │ │ │ ├── icons.tsx
│ │ │ │ └── index.ts
│ │ │ ├── referral/
│ │ │ │ ├── CopyReferralButton.tsx
│ │ │ │ ├── ReferralHeader.tsx
│ │ │ │ ├── ReferralInfo.tsx
│ │ │ │ └── ShareButton.tsx
│ │ │ ├── starfall/
│ │ │ │ ├── StarfallLogoHeader.tsx
│ │ │ │ └── StarfallPIN.tsx
│ │ │ └── support/
│ │ │ └── SupportUuidRow.tsx
│ │ ├── config/
│ │ │ ├── index.ts
│ │ │ ├── remoteConfig.shared.ts
│ │ │ ├── remoteConfig.ts
│ │ │ ├── remoteConfig.web.ts
│ │ │ ├── segment.ts
│ │ │ ├── sentry.ts
│ │ │ └── sentry.web.ts
│ │ ├── consts/
│ │ │ ├── index.ts
│ │ │ ├── links.ts
│ │ │ └── recoveryPrompts.ts
│ │ ├── devtools/
│ │ │ ├── index.ts
│ │ │ ├── mocks/
│ │ │ │ ├── index.ts
│ │ │ │ ├── nfcScanner.ts
│ │ │ │ ├── react-native-community-blur.ts
│ │ │ │ ├── react-native-gesture-handler.ts
│ │ │ │ ├── react-native-passport-reader.ts
│ │ │ │ ├── react-native-safe-area-context.js
│ │ │ │ └── react-native-svg.ts
│ │ │ └── testing/
│ │ │ ├── index.ts
│ │ │ └── utils.ts
│ │ ├── hooks/
│ │ │ ├── useAppUpdates.ts
│ │ │ ├── useAppUpdates.web.ts
│ │ │ ├── useCardDimensions.ts
│ │ │ ├── useConnectionModal.ts
│ │ │ ├── useEarnPointsFlow.ts
│ │ │ ├── useErrorInjection.ts
│ │ │ ├── useFeedbackAutoHide.ts
│ │ │ ├── useFeedbackModal.ts
│ │ │ ├── useHapticNavigation.ts
│ │ │ ├── useHasRealDocument.ts
│ │ │ ├── useKycLauncher.ts
│ │ │ ├── useKycWebSocket.ts
│ │ │ ├── useMnemonic.ts
│ │ │ ├── useMockDataForm.ts
│ │ │ ├── useModal.ts
│ │ │ ├── useNetInfo.ts
│ │ │ ├── useNetInfo.web.ts
│ │ │ ├── useOpenSupportForm.ts
│ │ │ ├── usePendingKycRecovery.ts
│ │ │ ├── usePoints.ts
│ │ │ ├── usePointsGuardrail.ts
│ │ │ ├── useProofDisclosureStalenessCheck.ts
│ │ │ ├── useRecoveryPrompts.ts
│ │ │ ├── useReferralConfirmation.ts
│ │ │ ├── useReferralMessage.ts
│ │ │ ├── useReferralRegistration.ts
│ │ │ ├── useRegisterReferral.ts
│ │ │ ├── useSelfAppData.ts
│ │ │ ├── useSupportUuid.ts
│ │ │ └── useTestReferralFlow.ts
│ │ ├── integrations/
│ │ │ ├── haptics/
│ │ │ │ ├── index.ts
│ │ │ │ ├── shared.ts
│ │ │ │ ├── trigger.ts
│ │ │ │ └── trigger.web.ts
│ │ │ ├── keychain/
│ │ │ │ └── index.ts
│ │ │ ├── kyc/
│ │ │ │ ├── index.ts
│ │ │ │ ├── kycService.ts
│ │ │ │ └── types.ts
│ │ │ ├── nfc/
│ │ │ │ ├── nfcScanner.ts
│ │ │ │ └── passportReader.ts
│ │ │ ├── qrScanner.ts
│ │ │ ├── sharing.ts
│ │ │ └── turnkey.ts
│ │ ├── layouts/
│ │ │ ├── AppLayout.tsx
│ │ │ ├── ExpandableBottomLayout.tsx
│ │ │ └── SimpleScrolledTitleLayout.tsx
│ │ ├── navigation/
│ │ │ ├── account.ts
│ │ │ ├── account.web.ts
│ │ │ ├── app.tsx
│ │ │ ├── deeplinks.ts
│ │ │ ├── devTools.tsx
│ │ │ ├── documents.ts
│ │ │ ├── home.ts
│ │ │ ├── index.tsx
│ │ │ ├── onboarding.ts
│ │ │ ├── shared.ts
│ │ │ ├── starfall.ts
│ │ │ ├── types.ts
│ │ │ └── verification.ts
│ │ ├── polyfills/
│ │ │ └── buffer.js
│ │ ├── providers/
│ │ │ ├── authProvider.tsx
│ │ │ ├── authProvider.web.tsx
│ │ │ ├── databaseProvider.tsx
│ │ │ ├── feedbackProvider.tsx
│ │ │ ├── loggerProvider.tsx
│ │ │ ├── notificationTrackingProvider.tsx
│ │ │ ├── notificationTrackingProvider.web.tsx
│ │ │ ├── passportDataProvider.tsx
│ │ │ ├── remoteConfigProvider.tsx
│ │ │ └── selfClientProvider.tsx
│ │ ├── proving/
│ │ │ ├── index.ts
│ │ │ ├── loadingScreenStateText.ts
│ │ │ └── validateDocument.ts
│ │ ├── screens/
│ │ │ ├── account/
│ │ │ │ ├── recovery/
│ │ │ │ │ ├── AccountRecoveryChoiceScreen.tsx
│ │ │ │ │ ├── AccountRecoveryScreen.tsx
│ │ │ │ │ ├── DocumentDataNotFoundScreen.tsx
│ │ │ │ │ ├── RecoverWithPhraseScreen.tsx
│ │ │ │ │ └── recoveryCopy.ts
│ │ │ │ └── settings/
│ │ │ │ ├── CloudBackupScreen.tsx
│ │ │ │ ├── ProofSettingsScreen.tsx
│ │ │ │ ├── SecurityAndBackupScreen.tsx
│ │ │ │ ├── SettingsScreen.tsx
│ │ │ │ ├── ShowRecoveryPhraseScreen.tsx
│ │ │ │ ├── SupportScreen.tsx
│ │ │ │ └── settingsMenu.ts
│ │ │ ├── app/
│ │ │ │ ├── DeferredLinkingInfoScreen.tsx
│ │ │ │ ├── GratificationScreen.tsx
│ │ │ │ ├── LoadingScreen.tsx
│ │ │ │ ├── ModalScreen.tsx
│ │ │ │ ├── ReferralScreen.tsx
│ │ │ │ ├── SplashScreen.tsx
│ │ │ │ └── startupRouting.ts
│ │ │ ├── dev/
│ │ │ │ ├── CreateMockScreen.tsx
│ │ │ │ ├── CreateMockScreenDeepLink.tsx
│ │ │ │ ├── DevDangerZoneScreen.tsx
│ │ │ │ ├── DevFeatureFlagsScreen.tsx
│ │ │ │ ├── DevHapticFeedbackScreen.tsx
│ │ │ │ ├── DevLoadingScreen.tsx
│ │ │ │ ├── DevPrivateKeyScreen.tsx
│ │ │ │ ├── DevSettingsScreen.tsx
│ │ │ │ ├── SocialLoginDemoScreen.tsx
│ │ │ │ ├── TroubleshootingScreen.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── ErrorInjectionSelector.tsx
│ │ │ │ │ ├── LogLevelSelector.tsx
│ │ │ │ │ ├── ParameterSection.tsx
│ │ │ │ │ ├── ScreenSelector.tsx
│ │ │ │ │ ├── TopicToggleButton.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useDangerZoneActions.ts
│ │ │ │ │ └── useNotificationHandlers.ts
│ │ │ │ └── sections/
│ │ │ │ ├── DangerZoneSection.tsx
│ │ │ │ ├── DebugShortcutsSection.tsx
│ │ │ │ ├── DevTogglesSection.tsx
│ │ │ │ ├── PushNotificationsSection.tsx
│ │ │ │ └── index.ts
│ │ │ ├── documents/
│ │ │ │ ├── aadhaar/
│ │ │ │ │ ├── AadhaarUploadErrorScreen.tsx
│ │ │ │ │ ├── AadhaarUploadScreen.tsx
│ │ │ │ │ └── AadhaarUploadedSuccessScreen.tsx
│ │ │ │ ├── management/
│ │ │ │ │ ├── DocumentDataInfoScreen.tsx
│ │ │ │ │ ├── IdDetailsScreen.tsx
│ │ │ │ │ └── ManageDocumentsScreen.tsx
│ │ │ │ ├── scanning/
│ │ │ │ │ ├── DataConfirmationScreen.tsx
│ │ │ │ │ ├── DocumentCameraScreen.tsx
│ │ │ │ │ ├── DocumentCameraTroubleScreen.tsx
│ │ │ │ │ ├── DocumentNFCMethodSelectionScreen.tsx
│ │ │ │ │ ├── DocumentNFCScanScreen.tsx
│ │ │ │ │ ├── DocumentNFCScanScreen.web.tsx
│ │ │ │ │ ├── DocumentNFCTroubleScreen.tsx
│ │ │ │ │ ├── RegistrationFallbackMRZScreen.tsx
│ │ │ │ │ └── RegistrationFallbackNFCScreen.tsx
│ │ │ │ └── selection/
│ │ │ │ ├── ConfirmBelongingScreen.tsx
│ │ │ │ ├── CountryPickerScreen.tsx
│ │ │ │ ├── DocumentOnboardingScreen.tsx
│ │ │ │ ├── IDPickerScreen.tsx
│ │ │ │ └── LogoConfirmationScreen.tsx
│ │ │ ├── home/
│ │ │ │ ├── HomeScreen.tsx
│ │ │ │ ├── PointsInfoScreen.tsx
│ │ │ │ ├── ProofHistoryDetailScreen.tsx
│ │ │ │ ├── ProofHistoryList.tsx
│ │ │ │ └── ProofHistoryScreen.tsx
│ │ │ ├── kyc/
│ │ │ │ ├── KYCVerifiedScreen.tsx
│ │ │ │ ├── KycConnectionErrorScreen.tsx
│ │ │ │ ├── KycFailureScreen.tsx
│ │ │ │ └── KycSuccessScreen.tsx
│ │ │ ├── onboarding/
│ │ │ │ ├── AccountVerifiedSuccessScreen.tsx
│ │ │ │ ├── DisclaimerScreen.tsx
│ │ │ │ └── SaveRecoveryPhraseScreen.tsx
│ │ │ ├── shared/
│ │ │ │ ├── ComingSoonScreen.tsx
│ │ │ │ └── WebViewScreen.tsx
│ │ │ ├── starfall/
│ │ │ │ └── StarfallPushCodeScreen.tsx
│ │ │ └── verification/
│ │ │ ├── DocumentSelectorForProvingScreen.tsx
│ │ │ ├── ProofRequestStatusScreen.tsx
│ │ │ ├── ProveScreen.tsx
│ │ │ ├── ProvingScreenRouter.tsx
│ │ │ ├── QRCodeTroubleScreen.tsx
│ │ │ └── QRCodeViewFinderScreen.tsx
│ │ ├── services/
│ │ │ ├── analytics.ts
│ │ │ ├── cloud-backup/
│ │ │ │ ├── google.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── ios.ts
│ │ │ ├── logging/
│ │ │ │ ├── index.ts
│ │ │ │ └── logger/
│ │ │ │ ├── consoleInterceptor.ts
│ │ │ │ ├── lokiTransport.ts
│ │ │ │ └── nativeLoggerBridge.ts
│ │ │ ├── notifications/
│ │ │ │ ├── notificationService.shared.ts
│ │ │ │ ├── notificationService.ts
│ │ │ │ └── notificationService.web.ts
│ │ │ ├── points/
│ │ │ │ ├── api.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── eventPolling.ts
│ │ │ │ ├── getEvents.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── jobStatus.ts
│ │ │ │ ├── recordEvents.ts
│ │ │ │ ├── registerEvents.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── starfall/
│ │ │ │ └── pushCodeService.ts
│ │ │ ├── support.ts
│ │ │ └── supportUuid.ts
│ │ ├── stores/
│ │ │ ├── database.ts
│ │ │ ├── database.web.ts
│ │ │ ├── errorInjectionStore.ts
│ │ │ ├── pendingKycStore.ts
│ │ │ ├── pointEventStore.ts
│ │ │ ├── proofHistoryStore.ts
│ │ │ ├── proofTypes.ts
│ │ │ ├── settingStore.ts
│ │ │ └── userStore.ts
│ │ ├── types/
│ │ │ ├── countryIso3To2.d.ts
│ │ │ ├── global.d.ts
│ │ │ ├── mnemonic.ts
│ │ │ ├── png.d.ts
│ │ │ ├── react-native-keychain.d.ts
│ │ │ ├── reactNativePassportReader.d.ts
│ │ │ ├── svg.d.ts
│ │ │ └── vite-env.d.ts
│ │ └── utils/
│ │ ├── cameraPermission.ts
│ │ ├── cardBackgroundSelector.ts
│ │ ├── countryDemonyms.ts
│ │ ├── crypto/
│ │ │ ├── cryptoLoader.ts
│ │ │ ├── ethers.ts
│ │ │ └── mnemonic.ts
│ │ ├── devUtils.ts
│ │ ├── diffCalculator.ts
│ │ ├── disclosureUtils.ts
│ │ ├── documentAttributes.ts
│ │ ├── documentUtils.ts
│ │ ├── documents.ts
│ │ ├── formatUserId.ts
│ │ ├── index.ts
│ │ ├── jsonUtils.ts
│ │ ├── keychainErrors.ts
│ │ ├── modalCallbackRegistry.ts
│ │ ├── retry.ts
│ │ ├── styleUtils.ts
│ │ ├── webview.ts
│ │ └── yymmdd.ts
│ ├── tamagui.config.ts
│ ├── tests/
│ │ ├── __mocks__/
│ │ │ └── mobile-sdk-components.js
│ │ ├── __setup__/
│ │ │ ├── @env.js
│ │ │ ├── databaseMocks.ts
│ │ │ ├── expoCameraMock.js
│ │ │ ├── imageMock.js
│ │ │ ├── mocks/
│ │ │ │ ├── navigation.js
│ │ │ │ └── ui.js
│ │ │ ├── notificationServiceMock.js
│ │ │ ├── selfClientProvider.ts
│ │ │ └── svgMock.js
│ │ ├── build/
│ │ │ ├── android/
│ │ │ │ ├── build.gradle.test.ts
│ │ │ │ └── manifest.test.ts
│ │ │ └── ios/
│ │ │ ├── infoPlist.test.ts
│ │ │ └── pbxproj.test.ts
│ │ ├── e2e/
│ │ │ ├── launch.android.flow.yaml
│ │ │ └── launch.ios.flow.yaml
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── ErrorBoundary.test.tsx
│ │ │ │ ├── InputField.test.tsx
│ │ │ │ ├── PassportCamera.test.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ └── IDSelectorSheet.test.tsx
│ │ │ │ ├── homescreen/
│ │ │ │ │ └── UnregisteredIdCard.test.tsx
│ │ │ │ └── support/
│ │ │ │ └── SupportUuidRow.test.tsx
│ │ │ ├── config/
│ │ │ │ ├── remoteConfig.test.ts
│ │ │ │ └── sentry.test.ts
│ │ │ ├── consts/
│ │ │ │ └── links.test.ts
│ │ │ ├── hooks/
│ │ │ │ ├── useAppUpdates.test.tsx
│ │ │ │ ├── useConnectionModal.test.ts
│ │ │ │ ├── useEarnPointsFlow.test.ts
│ │ │ │ ├── useHapticNavigation.test.ts
│ │ │ │ ├── useHasRealDocument.test.ts
│ │ │ │ ├── useMnemonic.test.ts
│ │ │ │ ├── useModal.test.ts
│ │ │ │ ├── useOpenSupportForm.test.ts
│ │ │ │ ├── usePendingKycRecovery.test.ts
│ │ │ │ ├── useProofDisclosureStalenessCheck.test.ts
│ │ │ │ ├── useRecoveryPrompts.test.ts
│ │ │ │ ├── useReferralConfirmation.test.ts
│ │ │ │ ├── useReferralMessage.test.ts
│ │ │ │ ├── useReferralRegistration.test.ts
│ │ │ │ └── useRegisterReferral.test.ts
│ │ │ ├── integrations/
│ │ │ │ └── nfc/
│ │ │ │ ├── nfcScanner.test.ts
│ │ │ │ └── passportReader.test.ts
│ │ │ ├── navigation/
│ │ │ │ └── deeplinks.test.ts
│ │ │ ├── navigation.test.tsx
│ │ │ ├── providers/
│ │ │ │ ├── loggerProvider.test.tsx
│ │ │ │ ├── notificationTrackingProvider.test.tsx
│ │ │ │ ├── passportDataProvider.test.tsx
│ │ │ │ ├── remoteConfigProvider.test.tsx
│ │ │ │ └── selfClientProvider.test.tsx
│ │ │ ├── proving/
│ │ │ │ ├── loadingScreenStateText.test.ts
│ │ │ │ ├── provingUtils.test.ts
│ │ │ │ └── validateDocument.test.ts
│ │ │ ├── screens/
│ │ │ │ ├── GratificationScreen.test.tsx
│ │ │ │ ├── WebViewScreen.test.tsx
│ │ │ │ ├── account/
│ │ │ │ │ ├── recovery/
│ │ │ │ │ │ └── RecoverWithPhraseScreen.test.tsx
│ │ │ │ │ └── settings/
│ │ │ │ │ ├── SupportScreen.test.tsx
│ │ │ │ │ └── settingsMenu.test.ts
│ │ │ │ ├── app/
│ │ │ │ │ └── startupRouting.test.ts
│ │ │ │ ├── dev/
│ │ │ │ │ └── useDangerZoneActions.test.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ ├── management/
│ │ │ │ │ │ └── ManageDocumentsScreen.test.tsx
│ │ │ │ │ └── scanning/
│ │ │ │ │ ├── DataConfirmationScreen-nfcFallback.test.tsx
│ │ │ │ │ └── DataConfirmationScreen.test.tsx
│ │ │ │ ├── home/
│ │ │ │ │ └── PointsInfoScreen.test.tsx
│ │ │ │ ├── kyc/
│ │ │ │ │ ├── KYCVerifiedScreen.test.tsx
│ │ │ │ │ └── KycSuccessScreen.test.tsx
│ │ │ │ └── verification/
│ │ │ │ ├── DocumentSelectorForProvingScreen.test.tsx
│ │ │ │ ├── ProofRequestStatusScreen.test.tsx
│ │ │ │ └── ProvingScreenRouter.test.tsx
│ │ │ ├── services/
│ │ │ │ ├── analytics.test.ts
│ │ │ │ ├── cloud-backup.test.ts
│ │ │ │ ├── logging/
│ │ │ │ │ └── lokiTransport.test.ts
│ │ │ │ ├── logging.test.ts
│ │ │ │ ├── notifications/
│ │ │ │ │ └── notificationService.test.ts
│ │ │ │ └── supportUuid.test.ts
│ │ │ ├── stores/
│ │ │ │ ├── database.test.ts
│ │ │ │ ├── proofHistoryStore.test.ts
│ │ │ │ └── settingStore.test.ts
│ │ │ └── utils/
│ │ │ ├── cameraPermission.test.ts
│ │ │ ├── cardBackgroundSelector.test.ts
│ │ │ ├── crypto/
│ │ │ │ └── ethers.test.ts
│ │ │ ├── diffCalculator.test.ts
│ │ │ ├── documents.test.ts
│ │ │ ├── formatUserId.test.ts
│ │ │ ├── jsonUtils.test.ts
│ │ │ ├── keychainErrors.test.ts
│ │ │ ├── modalCallbackRegistry.test.ts
│ │ │ ├── points/
│ │ │ │ ├── api.test.ts
│ │ │ │ ├── recordEvents.test.ts
│ │ │ │ └── registerEvents.test.ts
│ │ │ ├── webview.test.ts
│ │ │ └── yymmdd.test.ts
│ │ └── tsconfig.json
│ ├── tsconfig.json
│ ├── tsconfig.test.json
│ ├── version.json
│ ├── vite.config.ts
│ └── web/
│ ├── fonts/
│ │ ├── Advercase-Regular.otf
│ │ ├── DINOT-Bold.otf
│ │ ├── DINOT-Medium.otf
│ │ └── IBMPlexMono-Regular.otf
│ ├── fonts.css
│ ├── index.html
│ ├── main.tsx
│ └── reset.css
├── babel.config.js
├── circuits/
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── LICENSE
│ ├── README.md
│ ├── circuits/
│ │ ├── disclose/
│ │ │ ├── vc_and_disclose.circom
│ │ │ ├── vc_and_disclose_aadhaar.circom
│ │ │ ├── vc_and_disclose_id.circom
│ │ │ └── vc_and_disclose_kyc.circom
│ │ ├── dsc/
│ │ │ ├── dsc.circom
│ │ │ └── instances/
│ │ │ ├── dsc_sha1_ecdsa_brainpoolP256r1.circom
│ │ │ ├── dsc_sha1_ecdsa_secp256r1.circom
│ │ │ ├── dsc_sha1_rsa_65537_4096.circom
│ │ │ ├── dsc_sha256_ecdsa_brainpoolP256r1.circom
│ │ │ ├── dsc_sha256_ecdsa_brainpoolP384r1.circom
│ │ │ ├── dsc_sha256_ecdsa_secp256r1.circom
│ │ │ ├── dsc_sha256_ecdsa_secp384r1.circom
│ │ │ ├── dsc_sha256_ecdsa_secp521r1.circom
│ │ │ ├── dsc_sha256_rsa_107903_4096.circom
│ │ │ ├── dsc_sha256_rsa_122125_4096.circom
│ │ │ ├── dsc_sha256_rsa_130689_4096.circom
│ │ │ ├── dsc_sha256_rsa_56611_4096.circom
│ │ │ ├── dsc_sha256_rsa_65537_4096.circom
│ │ │ ├── dsc_sha256_rsapss_3_32_3072.circom
│ │ │ ├── dsc_sha256_rsapss_65537_32_3072.circom
│ │ │ ├── dsc_sha256_rsapss_65537_32_4096.circom
│ │ │ ├── dsc_sha384_ecdsa_brainpoolP384r1.circom
│ │ │ ├── dsc_sha384_ecdsa_brainpoolP512r1.circom
│ │ │ ├── dsc_sha384_ecdsa_secp384r1.circom
│ │ │ ├── dsc_sha384_rsapss_65537_48_3072.circom
│ │ │ ├── dsc_sha512_ecdsa_brainpoolP512r1.circom
│ │ │ ├── dsc_sha512_ecdsa_secp521r1.circom
│ │ │ ├── dsc_sha512_rsa_65537_4096.circom
│ │ │ └── dsc_sha512_rsapss_65537_64_4096.circom
│ │ ├── gcp_jwt_verifier/
│ │ │ ├── README.md
│ │ │ ├── example_jwt.txt
│ │ │ ├── example_jwt_fail.txt
│ │ │ ├── gcp_jwt_verifier.circom
│ │ │ ├── jwt_verifier.circom
│ │ │ └── prepare.ts
│ │ ├── register/
│ │ │ ├── instances/
│ │ │ │ ├── register_aadhaar.circom
│ │ │ │ ├── register_kyc.circom
│ │ │ │ ├── register_sha1_sha1_sha1_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_sha1_sha1_sha1_ecdsa_secp256r1.circom
│ │ │ │ ├── register_sha1_sha1_sha1_rsa_64321_4096.circom
│ │ │ │ ├── register_sha1_sha1_sha1_rsa_65537_4096.circom
│ │ │ │ ├── register_sha1_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_sha224_sha224_sha224_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_sha256_sha1_sha1_rsa_65537_4096.circom
│ │ │ │ ├── register_sha256_sha224_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_sha256_sha256_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_brainpoolP256r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_secp256r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_ecdsa_secp384r1.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsa_3_4096.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_3_32_2048.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_32_3072.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_32_4096.circom
│ │ │ │ ├── register_sha256_sha256_sha256_rsapss_65537_64_2048.circom
│ │ │ │ ├── register_sha384_sha384_sha384_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_sha384_sha384_sha384_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_sha384_sha384_sha384_ecdsa_secp384r1.circom
│ │ │ │ ├── register_sha384_sha384_sha384_rsapss_65537_48_2048.circom
│ │ │ │ ├── register_sha512_sha512_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_sha512_sha512_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_sha512_sha512_sha512_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_sha512_sha512_sha512_ecdsa_secp521r1.circom
│ │ │ │ ├── register_sha512_sha512_sha512_rsa_65537_4096.circom
│ │ │ │ └── register_sha512_sha512_sha512_rsapss_65537_64_2048.circom
│ │ │ ├── register.circom
│ │ │ ├── register_aadhaar.circom
│ │ │ └── register_kyc.circom
│ │ ├── register_id/
│ │ │ ├── instances/
│ │ │ │ ├── register_id_sha1_sha1_sha1_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_id_sha1_sha1_sha1_ecdsa_secp256r1.circom
│ │ │ │ ├── register_id_sha1_sha1_sha1_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha1_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha224_sha224_sha224_ecdsa_brainpoolP224r1.circom
│ │ │ │ ├── register_id_sha256_sha224_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha224_ecdsa_secp224r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_brainpoolP256r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_secp256r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_ecdsa_secp384r1.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsa_3_4096.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_3_32_2048.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_65537_32_3072.circom
│ │ │ │ ├── register_id_sha256_sha256_sha256_rsapss_65537_64_2048.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_ecdsa_brainpoolP384r1.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_ecdsa_secp384r1.circom
│ │ │ │ ├── register_id_sha384_sha384_sha384_rsapss_65537_48_2048.circom
│ │ │ │ ├── register_id_sha512_sha512_sha256_rsa_65537_4096.circom
│ │ │ │ ├── register_id_sha512_sha512_sha256_rsapss_65537_32_2048.circom
│ │ │ │ ├── register_id_sha512_sha512_sha512_ecdsa_brainpoolP512r1.circom
│ │ │ │ ├── register_id_sha512_sha512_sha512_ecdsa_secp521r1.circom
│ │ │ │ ├── register_id_sha512_sha512_sha512_rsa_65537_4096.circom
│ │ │ │ └── register_id_sha512_sha512_sha512_rsapss_65537_64_2048.circom
│ │ │ └── register_id.circom
│ │ ├── tests/
│ │ │ ├── ofac/
│ │ │ │ ├── ofac_name_dob_id_tester.circom
│ │ │ │ ├── ofac_name_dob_tester.circom
│ │ │ │ ├── ofac_name_yob_id_tester.circom
│ │ │ │ ├── ofac_name_yob_tester.circom
│ │ │ │ └── ofac_passport_number_tester.circom
│ │ │ └── utils/
│ │ │ ├── customHasher_tester.circom
│ │ │ ├── ecdsa/
│ │ │ │ ├── test_brainpoolP224r1.circom
│ │ │ │ ├── test_brainpoolP256r1.circom
│ │ │ │ ├── test_brainpoolP384r1.circom
│ │ │ │ ├── test_brainpoolP512r1.circom
│ │ │ │ ├── test_p256.circom
│ │ │ │ ├── test_p384.circom
│ │ │ │ └── test_p521.circom
│ │ │ ├── extractQrData_tester.circom
│ │ │ ├── isOlderThan_tester.circom
│ │ │ ├── isValid_tester.circom
│ │ │ ├── packBytesAndPoseidon_tester.circom
│ │ │ ├── proveCountryIsNotInList_tester.circom
│ │ │ ├── rsa/
│ │ │ │ ├── test_rsa_sha1_64321_4096.circom
│ │ │ │ ├── test_rsa_sha1_65537_2048.circom
│ │ │ │ ├── test_rsa_sha224_65537_2048.circom
│ │ │ │ ├── test_rsa_sha256_107903_4096.circom
│ │ │ │ ├── test_rsa_sha256_122125_4096.circom
│ │ │ │ ├── test_rsa_sha256_130689_4096.circom
│ │ │ │ ├── test_rsa_sha256_3_2048.circom
│ │ │ │ ├── test_rsa_sha256_56611_4096.circom
│ │ │ │ ├── test_rsa_sha256_65537_2048.circom
│ │ │ │ ├── test_rsa_sha256_65537_3072.circom
│ │ │ │ ├── test_rsa_sha256_65537_4096.circom
│ │ │ │ └── test_rsa_sha512_65537_4096.circom
│ │ │ ├── rsapss/
│ │ │ │ ├── test_rsapss_sha256_3_2048_32.circom
│ │ │ │ ├── test_rsapss_sha256_3_2048_64.circom
│ │ │ │ ├── test_rsapss_sha256_3_3072_32.circom
│ │ │ │ ├── test_rsapss_sha256_3_3072_64.circom
│ │ │ │ ├── test_rsapss_sha256_3_4096_32.circom
│ │ │ │ ├── test_rsapss_sha256_3_4096_64.circom
│ │ │ │ ├── test_rsapss_sha256_65537_2048_32.circom
│ │ │ │ ├── test_rsapss_sha256_65537_2048_64.circom
│ │ │ │ ├── test_rsapss_sha256_65537_3072_32.circom
│ │ │ │ ├── test_rsapss_sha256_65537_3072_64.circom
│ │ │ │ ├── test_rsapss_sha256_65537_4096_32.circom
│ │ │ │ ├── test_rsapss_sha256_65537_4096_64.circom
│ │ │ │ ├── test_rsapss_sha384_3_3072_48.circom
│ │ │ │ ├── test_rsapss_sha384_3_4096_48.circom
│ │ │ │ ├── test_rsapss_sha384_65537_3072_48.circom
│ │ │ │ ├── test_rsapss_sha384_65537_4096_48.circom
│ │ │ │ ├── test_rsapss_sha512_3_2048_64.circom
│ │ │ │ └── test_rsapss_sha512_3_4096_64.circom
│ │ │ └── wordsToBytes_tester.circom
│ │ └── utils/
│ │ ├── aadhaar/
│ │ │ ├── disclose/
│ │ │ │ ├── country_not_in_list.circom
│ │ │ │ └── verify_commitment.circom
│ │ │ ├── extractQrData.circom
│ │ │ ├── ofac/
│ │ │ │ ├── ofac_name_dob.circom
│ │ │ │ └── ofac_name_yob.circom
│ │ │ └── pack.circom
│ │ ├── crypto/
│ │ │ ├── bigInt/
│ │ │ │ ├── bigInt.circom
│ │ │ │ ├── bigIntComparators.circom
│ │ │ │ ├── bigIntFunc.circom
│ │ │ │ ├── bigIntHelpers.circom
│ │ │ │ ├── bigIntOverflow.circom
│ │ │ │ └── shouldUseKaratsuba.circom
│ │ │ ├── bitify/
│ │ │ │ ├── bytes.circom
│ │ │ │ ├── gates.circom
│ │ │ │ ├── operations.circom
│ │ │ │ └── splitWordsToBytes.circom
│ │ │ ├── ec/
│ │ │ │ ├── curve.circom
│ │ │ │ ├── get.circom
│ │ │ │ └── powers/
│ │ │ │ ├── brainpoolP224r1pows.circom
│ │ │ │ ├── brainpoolP256r1pows.circom
│ │ │ │ ├── brainpoolP384r1pows.circom
│ │ │ │ ├── brainpoolP512r1pows.circom
│ │ │ │ ├── p224pows.circom
│ │ │ │ ├── p256pows.circom
│ │ │ │ ├── p384pows.circom
│ │ │ │ └── p521pows.circom
│ │ │ ├── hasher/
│ │ │ │ ├── hash.circom
│ │ │ │ ├── sha1/
│ │ │ │ │ ├── constants.circom
│ │ │ │ │ ├── f.circom
│ │ │ │ │ ├── parity.circom
│ │ │ │ │ ├── rotate.circom
│ │ │ │ │ ├── sha1.circom
│ │ │ │ │ ├── sha1compression.circom
│ │ │ │ │ ├── t.circom
│ │ │ │ │ └── xor4.circom
│ │ │ │ ├── sha2/
│ │ │ │ │ ├── sha224/
│ │ │ │ │ │ ├── sha224HashBits.circom
│ │ │ │ │ │ ├── sha224HashChunks.circom
│ │ │ │ │ │ └── sha224InitialValue.circom
│ │ │ │ │ ├── sha256/
│ │ │ │ │ │ ├── sha256Compress.circom
│ │ │ │ │ │ ├── sha256HashBits.circom
│ │ │ │ │ │ ├── sha256HashChunks.circom
│ │ │ │ │ │ ├── sha256InitialValue.circom
│ │ │ │ │ │ ├── sha256RoundConst.circom
│ │ │ │ │ │ ├── sha256Rounds.circom
│ │ │ │ │ │ └── sha256Schedule.circom
│ │ │ │ │ ├── sha2Common.circom
│ │ │ │ │ ├── sha384/
│ │ │ │ │ │ ├── sha384HashBits.circom
│ │ │ │ │ │ ├── sha384HashChunks.circom
│ │ │ │ │ │ └── sha384InitialValue.circom
│ │ │ │ │ └── sha512/
│ │ │ │ │ ├── sha512Compress.circom
│ │ │ │ │ ├── sha512HashBits.circom
│ │ │ │ │ ├── sha512HashChunks.circom
│ │ │ │ │ ├── sha512InitialValue.circom
│ │ │ │ │ ├── sha512RoundConst.circom
│ │ │ │ │ ├── sha512Rounds.circom
│ │ │ │ │ └── sha512Schedule.circom
│ │ │ │ └── shaBytes/
│ │ │ │ ├── dynamic/
│ │ │ │ │ ├── sha1Bytes.circom
│ │ │ │ │ ├── sha224Bytes.circom
│ │ │ │ │ ├── sha384Bytes.circom
│ │ │ │ │ └── sha512Bytes.circom
│ │ │ │ └── shaBytesDynamic.circom
│ │ │ ├── int/
│ │ │ │ └── arithmetic.circom
│ │ │ ├── merkle-trees/
│ │ │ │ └── smt.circom
│ │ │ ├── signature/
│ │ │ │ ├── FpPowMod.circom
│ │ │ │ ├── ecdsa/
│ │ │ │ │ ├── ecdsa.circom
│ │ │ │ │ └── ecdsaVerifier.circom
│ │ │ │ ├── rsa/
│ │ │ │ │ ├── pkcs1v1_5Padding.circom
│ │ │ │ │ ├── verifyRsa3Pkcs1v1_5.circom
│ │ │ │ │ ├── verifyRsa65537Pkcs1v1_5.circom
│ │ │ │ │ └── verifyRsaGenericPkcs1v1_5.circom
│ │ │ │ └── rsapss/
│ │ │ │ ├── mgf1.circom
│ │ │ │ ├── rsapss3.circom
│ │ │ │ ├── rsapss65537.circom
│ │ │ │ └── validate.circom
│ │ │ └── utils/
│ │ │ └── switcher.circom
│ │ ├── gcp_jwt/
│ │ │ ├── dateIsLessSeconds.circom
│ │ │ ├── extractAndValidatePubkey.circom
│ │ │ ├── singleOccurance.circom
│ │ │ ├── validityChecker.circom
│ │ │ ├── verifyCertificateSignature.circom
│ │ │ └── verifyJSONFieldExtraction.circom
│ │ ├── kyc/
│ │ │ ├── babyEcdsa.circom
│ │ │ ├── constants.circom
│ │ │ ├── date/
│ │ │ │ ├── dateIsLess.circom
│ │ │ │ ├── isOlderThan.circom
│ │ │ │ └── isValid.circom
│ │ │ ├── disclose/
│ │ │ │ ├── disclose.circom
│ │ │ │ └── ofac/
│ │ │ │ ├── ofac_name_dob_kyc.circom
│ │ │ │ └── ofac_name_yob_kyc.circom
│ │ │ └── verifySignature.circom
│ │ └── passport/
│ │ ├── BytesToNum.circom
│ │ ├── checkPubkeyPosition.circom
│ │ ├── checkPubkeysEqual.circom
│ │ ├── constants.circom
│ │ ├── customHashers.circom
│ │ ├── date/
│ │ │ ├── dateIsLess.circom
│ │ │ ├── isOlderThan.circom
│ │ │ └── isValid.circom
│ │ ├── disclose/
│ │ │ ├── disclose.circom
│ │ │ ├── disclose_id.circom
│ │ │ ├── proveCountryIsNotInList.circom
│ │ │ └── verify_commitment.circom
│ │ ├── ofac/
│ │ │ ├── ofac_name_dob.circom
│ │ │ ├── ofac_name_dob_id.circom
│ │ │ ├── ofac_name_yob.circom
│ │ │ ├── ofac_name_yob_id.circom
│ │ │ └── ofac_passport_number.circom
│ │ ├── passportVerifier.circom
│ │ ├── signatureAlgorithm.circom
│ │ └── signatureVerifier.circom
│ ├── package.json
│ ├── scripts/
│ │ ├── server/
│ │ │ ├── download_circuits_from_AWS.sh
│ │ │ ├── download_ptau.sh
│ │ │ └── upload_to_AWS.sh
│ │ └── utils/
│ │ └── print_circom_tree.sh
│ ├── src/
│ │ ├── index.ts
│ │ └── testing/
│ │ └── index.ts
│ ├── tests/
│ │ ├── consts/
│ │ │ └── ofac/
│ │ │ ├── nameAndDobAadhaarSMT.json
│ │ │ ├── nameAndDobKycSMT.json
│ │ │ ├── nameAndDobPersonaSMT.json
│ │ │ ├── nameAndDobSMT.json
│ │ │ ├── nameAndDobSMT_ID.json
│ │ │ ├── nameAndDobSelfricaSMT.json
│ │ │ ├── nameAndYobAadhaarSMT.json
│ │ │ ├── nameAndYobKycSMT.json
│ │ │ ├── nameAndYobPersonaSMT.json
│ │ │ ├── nameAndYobSMT.json
│ │ │ ├── nameAndYobSMT_ID.json
│ │ │ ├── nameAndYobSelfricaSMT.json
│ │ │ └── passportNoAndNationalitySMT.json
│ │ ├── disclose/
│ │ │ ├── vc_and_disclose.test.ts
│ │ │ ├── vc_and_disclose_aadhaar.test.ts
│ │ │ ├── vc_and_disclose_id.test.ts
│ │ │ └── vc_and_disclose_kyc.test.ts
│ │ ├── dsc/
│ │ │ ├── dsc.test.ts
│ │ │ └── test_cases.ts
│ │ ├── ofac/
│ │ │ └── ofac.test.ts
│ │ ├── other_circuits/
│ │ │ ├── custom_hasher.test.ts
│ │ │ ├── is_older_than.test.ts
│ │ │ ├── is_valid.test.ts
│ │ │ ├── prove_country_is_not_in_list.test.ts
│ │ │ └── qrdata_extractor.test.ts
│ │ ├── register/
│ │ │ ├── pubkeys.ts
│ │ │ ├── register.test.ts
│ │ │ ├── register_aadhaar.test.ts
│ │ │ ├── register_kyc.test.ts
│ │ │ └── test_cases.ts
│ │ ├── register_id/
│ │ │ ├── register_id.test.ts
│ │ │ └── test_cases.ts
│ │ └── utils/
│ │ ├── aadhaar/
│ │ │ ├── generateTestData.ts
│ │ │ └── utils.ts
│ │ ├── ecdsa.test.ts
│ │ ├── generateMockInputsInCircuits.ts
│ │ ├── generateMockInputsRsaPss.ts
│ │ ├── kyc/
│ │ │ ├── date/
│ │ │ │ ├── date.test.ts
│ │ │ │ ├── isOlderThan.test.ts
│ │ │ │ ├── is_older_than.test.circom
│ │ │ │ └── is_valid.test.circom
│ │ │ └── ofac/
│ │ │ ├── ofac.test.ts
│ │ │ ├── ofac_name_dob_kyc.test.circom
│ │ │ └── ofac_name_yob_kyc.test.circom
│ │ ├── rsaPkcs1v1_5.test.ts
│ │ ├── rsapss.test.ts
│ │ └── testcase/
│ │ └── rsapss.ts
│ └── tsconfig.json
├── common/
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .npmignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── README.md
│ ├── index.ts
│ ├── package.json
│ ├── pubkeys/
│ │ ├── public_keys_parsed.json
│ │ ├── serialized_csca_tree.json
│ │ ├── serialized_dsc_tree.json
│ │ └── serialized_tree.json
│ ├── sanctionedCountries/
│ │ └── outputs/
│ │ └── sc_SMT.json
│ ├── scripts/
│ │ ├── certificates/
│ │ │ └── concatCertificates.ts
│ │ ├── postBuild.mjs
│ │ ├── shimConfigs.js
│ │ ├── testExports.js
│ │ └── validateExports.js
│ ├── src/
│ │ ├── constants/
│ │ │ ├── constants.ts
│ │ │ ├── countries.ts
│ │ │ ├── index.ts
│ │ │ ├── mockCertificates.ts
│ │ │ ├── sampleDataHashes.ts
│ │ │ ├── skiPem.ts
│ │ │ └── vkey.ts
│ │ ├── mock_certificates/
│ │ │ ├── README.md
│ │ │ ├── aadhaar/
│ │ │ │ └── mockAadhaarCert.ts
│ │ │ ├── openssl.cnf
│ │ │ ├── sha1_ecdsa_brainpoolP224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_ecdsa_secp256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_3_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_64321_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha1_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha224_ecdsa_brainpoolP224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha224_ecdsa_secp224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_brainpoolP224r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_brainpoolP384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_secp256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_secp384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_ecdsa_secp521r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_107903_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_122125_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_130689_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_3_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_3_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_56611_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_65537_3072/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_3_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_3_3072/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_3_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_65537_2048/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_65537_3072/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_32_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha256_rsapss_64_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_brainpoolP384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_brainpoolP512r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_ecdsa_secp384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsapss_48_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsapss_48_65537_3072/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha384_rsapss_48_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ └── mock_csca.pem
│ │ │ ├── sha512_ecdsa_brainpoolP256r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_ecdsa_brainpoolP384r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_ecdsa_brainpoolP512r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_ecdsa_secp521r1/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_rsa_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_rsa_65537_4096/
│ │ │ │ ├── mock_csca.key
│ │ │ │ ├── mock_csca.pem
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ ├── sha512_rsapss_64_65537_2048/
│ │ │ │ ├── mock_dsc.key
│ │ │ │ └── mock_dsc.pem
│ │ │ └── sha512_rsapss_64_65537_4096/
│ │ │ ├── mock_csca.key
│ │ │ ├── mock_csca.pem
│ │ │ ├── mock_dsc.key
│ │ │ └── mock_dsc.pem
│ │ ├── polyfills/
│ │ │ └── crypto.ts
│ │ ├── scripts/
│ │ │ ├── addCertificatesInTs.py
│ │ │ ├── addSkiPemToTs.py
│ │ │ ├── extensions.cnf
│ │ │ ├── generateCertificates.sh
│ │ │ └── generateCountryOptions.ts
│ │ ├── types/
│ │ │ ├── app.ts
│ │ │ ├── certificates.ts
│ │ │ ├── circuits.ts
│ │ │ ├── index.ts
│ │ │ └── passport.ts
│ │ └── utils/
│ │ ├── aadhaar/
│ │ │ ├── assets/
│ │ │ │ ├── dataInput.ts
│ │ │ │ └── testPublicKey.pem
│ │ │ ├── build_aadhaar_ofac_smt.ts
│ │ │ ├── constants.ts
│ │ │ ├── mockData.ts
│ │ │ └── utils.ts
│ │ ├── appType.ts
│ │ ├── arrays.ts
│ │ ├── attest.ts
│ │ ├── bytes.ts
│ │ ├── certificate_parsing/
│ │ │ ├── certUtils.ts
│ │ │ ├── curveUtils.ts
│ │ │ ├── curves.ts
│ │ │ ├── dataStructure.ts
│ │ │ ├── elliptic.ts
│ │ │ ├── ellipticInit.ts
│ │ │ ├── index.ts
│ │ │ ├── oidUtils.ts
│ │ │ ├── oids.ts
│ │ │ ├── parseCertificate.ts
│ │ │ ├── parseCertificateNode.ts
│ │ │ ├── parseCertificateSimple.ts
│ │ │ ├── parseNode.ts
│ │ │ ├── parseSimple.ts
│ │ │ └── utils.ts
│ │ ├── circuits/
│ │ │ ├── circuitsName.ts
│ │ │ ├── discloseInputs.ts
│ │ │ ├── dscInputs.ts
│ │ │ ├── formatInputs.ts
│ │ │ ├── formatOutputs.ts
│ │ │ ├── generateInputs.ts
│ │ │ ├── index.ts
│ │ │ ├── ofacInputs.ts
│ │ │ ├── registerInputs.ts
│ │ │ └── uuid.ts
│ │ ├── contracts/
│ │ │ ├── forbiddenCountries.ts
│ │ │ ├── formatCallData.ts
│ │ │ └── index.ts
│ │ ├── cose.ts
│ │ ├── csca.ts
│ │ ├── date.ts
│ │ ├── hash/
│ │ │ ├── custom.ts
│ │ │ ├── poseidon.ts
│ │ │ └── sha.ts
│ │ ├── hash.test.ts
│ │ ├── hash.ts
│ │ ├── index.ts
│ │ ├── kyc/
│ │ │ ├── api.ts
│ │ │ ├── build_kyc_ofac_smt.ts
│ │ │ ├── constants.ts
│ │ │ ├── ecdsa/
│ │ │ │ ├── ecdsa.ts
│ │ │ │ └── utils.ts
│ │ │ ├── generateInputs.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ ├── ofac.test.ts
│ │ ├── ofac.ts
│ │ ├── passportData.ts
│ │ ├── passports/
│ │ │ ├── commitment.ts
│ │ │ ├── core.ts
│ │ │ ├── dg1.ts
│ │ │ ├── format.ts
│ │ │ ├── genMockIdDoc.ts
│ │ │ ├── genMockPassportData.ts
│ │ │ ├── getMockDSC.ts
│ │ │ ├── index.ts
│ │ │ ├── mock.ts
│ │ │ ├── mockDsc.ts
│ │ │ ├── mockGeneration.ts
│ │ │ ├── parsing.ts
│ │ │ ├── passport.ts
│ │ │ ├── passport_parsing/
│ │ │ │ ├── brutForceDscSignature.ts
│ │ │ │ ├── brutForcePassportSignature.ts
│ │ │ │ ├── parseDscCertificateData.ts
│ │ │ │ └── parsePassportData.ts
│ │ │ ├── signature.ts
│ │ │ ├── validate.test.ts
│ │ │ └── validate.ts
│ │ ├── proving.ts
│ │ ├── scope.ts
│ │ ├── selfAttestation.ts
│ │ ├── shaPad.ts
│ │ ├── trees.ts
│ │ └── types.ts
│ ├── tests/
│ │ ├── coseVerify.test.ts
│ │ ├── cryptoHash.test.ts
│ │ ├── cryptoHmac.test.ts
│ │ ├── genMockPassportData.test.ts
│ │ ├── proving.test.ts
│ │ ├── scope.test.ts
│ │ └── setup.ts
│ ├── tsconfig.cjs.json
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── vitest.config.ts
├── contracts/
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc.yml
│ ├── README.md
│ ├── UPGRADE_GUIDE.md
│ ├── contracts/
│ │ ├── IdentityVerificationHub.sol
│ │ ├── IdentityVerificationHubImplV1.sol
│ │ ├── IdentityVerificationHubImplV2.sol
│ │ ├── abstract/
│ │ │ ├── SelfVerificationRoot.sol
│ │ │ └── SelfVerificationRootUpgradeable.sol
│ │ ├── constants/
│ │ │ ├── AttestationId.sol
│ │ │ ├── CircuitConstants.sol
│ │ │ └── CircuitConstantsV2.sol
│ │ ├── example/
│ │ │ ├── Airdrop.sol
│ │ │ ├── HappyBirthday.sol
│ │ │ ├── SelfIdentityERC721.sol
│ │ │ └── SelfPassportERC721.sol
│ │ ├── interfaces/
│ │ │ ├── IDscCircuitVerifier.sol
│ │ │ ├── IIdentityRegistryAadhaarV1.sol
│ │ │ ├── IIdentityRegistryIdCardV1.sol
│ │ │ ├── IIdentityRegistryKycV1.sol
│ │ │ ├── IIdentityRegistryV1.sol
│ │ │ ├── IIdentityVerificationHubV1.sol
│ │ │ ├── IIdentityVerificationHubV2.sol
│ │ │ ├── IPassportAirdropRoot.sol
│ │ │ ├── IPoseidonT3.sol
│ │ │ ├── IRegisterCircuitVerifier.sol
│ │ │ ├── ISelfVerificationRoot.sol
│ │ │ └── IVcAndDiscloseCircuitVerifier.sol
│ │ ├── libraries/
│ │ │ ├── CircuitAttributeHandler.sol
│ │ │ ├── CircuitAttributeHandlerV2.sol
│ │ │ ├── CountryCode.sol
│ │ │ ├── CustomVerifier.sol
│ │ │ ├── DscProofVerifierLib.sol
│ │ │ ├── Formatter.sol
│ │ │ ├── GCPJWTHelper.sol
│ │ │ ├── GenericFormatter.sol
│ │ │ ├── IdCardAttributeHandler.sol
│ │ │ ├── OfacCheckLib.sol
│ │ │ ├── OutputFormatterLib.sol
│ │ │ ├── ProofVerifierLib.sol
│ │ │ ├── RegisterProofVerifierLib.sol
│ │ │ ├── RootCheckLib.sol
│ │ │ ├── SelfCircuitLibrary.sol
│ │ │ ├── SelfStructs.sol
│ │ │ └── SelfUtils.sol
│ │ ├── registry/
│ │ │ ├── IdentityRegistry.sol
│ │ │ ├── IdentityRegistryAadhaarImplV1.sol
│ │ │ ├── IdentityRegistryIdCardImplV1.sol
│ │ │ ├── IdentityRegistryImplV1.sol
│ │ │ └── IdentityRegistryKycImplV1.sol
│ │ ├── sdk/
│ │ │ └── VerifyAll.sol
│ │ ├── tests/
│ │ │ ├── MockGCPJWTVerifier.sol
│ │ │ ├── MockOwnableHub.sol
│ │ │ ├── MockOwnableImplRoot.sol
│ │ │ ├── MockOwnableRegistry.sol
│ │ │ ├── MockUpgradedHub.sol
│ │ │ ├── MockUpgradedRegistry.sol
│ │ │ ├── TestAirdrop.sol
│ │ │ ├── TestCountryCodes.sol
│ │ │ ├── TestCustomVerifier.sol
│ │ │ ├── TestGCPJWTHelper.sol
│ │ │ ├── TestSelfUtils.sol
│ │ │ ├── TestSelfVerificationRoot.sol
│ │ │ ├── airdropToken.sol
│ │ │ ├── testCircuitAttributeHandler.sol
│ │ │ ├── testFormatter.sol
│ │ │ ├── testGenericFormatter.sol
│ │ │ ├── testImplRoot.sol
│ │ │ ├── testUpgradedIdentityRegistryImplV1.sol
│ │ │ ├── testUpgradedIdentityVerificationHubImplV1.sol
│ │ │ └── testUpgradedIdentityVerificationHubImplV2.sol
│ │ ├── upgradeable/
│ │ │ ├── ImplRoot.sol
│ │ │ └── ProxyRoot.sol
│ │ ├── utils/
│ │ │ └── PCR0Manager.sol
│ │ └── verifiers/
│ │ ├── disclose/
│ │ │ ├── Verifier_vc_and_disclose.sol
│ │ │ ├── Verifier_vc_and_disclose_aadhaar.sol
│ │ │ ├── Verifier_vc_and_disclose_id.sol
│ │ │ └── Verifier_vc_and_disclose_kyc.sol
│ │ ├── dsc/
│ │ │ ├── Verifier_dsc_sha1_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_dsc_sha1_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_dsc_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_dsc_sha256_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_107903_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_122125_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_130689_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_56611_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_dsc_sha256_rsapss_3_32_3072.sol
│ │ │ ├── Verifier_dsc_sha256_rsapss_65537_32_3072.sol
│ │ │ ├── Verifier_dsc_sha256_rsapss_65537_32_4096.sol
│ │ │ ├── Verifier_dsc_sha384_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_dsc_sha384_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_dsc_sha384_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_dsc_sha512_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_dsc_sha512_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_dsc_sha512_rsa_65537_4096.sol
│ │ │ └── Verifier_dsc_sha512_rsapss_65537_64_4096.sol
│ │ ├── gcp/
│ │ │ └── Verifier_gcp_jwt.sol
│ │ ├── register/
│ │ │ ├── Verifier_register_sha1_sha1_sha1_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_sha1_sha1_sha1_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_sha1_sha1_sha1_rsa_64321_4096.sol
│ │ │ ├── Verifier_register_sha1_sha1_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha1_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha224_sha224_sha224_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_sha256_sha1_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha256_sha224_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsa_3_4096.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_3_32_2048.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_32_3072.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_32_4096.sol
│ │ │ ├── Verifier_register_sha256_sha256_sha256_rsapss_65537_64_2048.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_sha384_sha384_sha384_rsapss_65537_48_2048.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha512_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha512_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_register_sha512_sha512_sha512_rsa_65537_4096.sol
│ │ │ └── Verifier_register_sha512_sha512_sha512_rsapss_65537_64_2048.sol
│ │ ├── register_aadhaar/
│ │ │ └── Verifier_register_aadhaar.sol
│ │ ├── register_id/
│ │ │ ├── Verifier_register_id_sha1_sha1_sha1_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_id_sha1_sha1_sha1_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_id_sha1_sha1_sha1_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha1_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha224_sha224_sha224_ecdsa_brainpoolP224r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha224_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha224_ecdsa_secp224r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_brainpoolP256r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_secp256r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsa_3_4096.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_3_32_2048.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_65537_32_3072.sol
│ │ │ ├── Verifier_register_id_sha256_sha256_sha256_rsapss_65537_64_2048.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_ecdsa_brainpoolP384r1.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_ecdsa_secp384r1.sol
│ │ │ ├── Verifier_register_id_sha384_sha384_sha384_rsapss_65537_48_2048.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha256_rsa_65537_4096.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha256_rsapss_65537_32_2048.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha512_ecdsa_brainpoolP512r1.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha512_ecdsa_secp521r1.sol
│ │ │ ├── Verifier_register_id_sha512_sha512_sha512_rsa_65537_4096.sol
│ │ │ └── Verifier_register_id_sha512_sha512_sha512_rsapss_65537_64_2048.sol
│ │ └── register_kyc/
│ │ └── Verifier_register_kyc.sol
│ ├── deployments/
│ │ └── registry.json
│ ├── error-selectors.json
│ ├── foundry.toml
│ ├── hardhat.config.ts
│ ├── ignition/
│ │ ├── deployments/
│ │ │ ├── chain-11142220/
│ │ │ │ └── deployed_addresses.json
│ │ │ ├── chain-42220/
│ │ │ │ └── deployed_addresses.json
│ │ │ ├── prod/
│ │ │ │ └── deployed_addresses.json
│ │ │ └── staging/
│ │ │ └── deployed_addresses.json
│ │ ├── modules/
│ │ │ ├── deployTestSelfVerificationRoot.ts
│ │ │ ├── hub/
│ │ │ │ ├── deployHub.ts
│ │ │ │ ├── deployHubV2.ts
│ │ │ │ ├── updateRegistries.ts
│ │ │ │ └── updateVerifiers.ts
│ │ │ ├── registry/
│ │ │ │ ├── deployAadhaarRegistry.ts
│ │ │ │ ├── deployIdCardRegistry.ts
│ │ │ │ ├── deployKycRegistry.ts
│ │ │ │ ├── deployRegistry.ts
│ │ │ │ └── updateRegistries.ts
│ │ │ ├── scripts/
│ │ │ │ ├── updatePCR0.ts
│ │ │ │ ├── updateRegistryCscaRoot.ts
│ │ │ │ ├── updateRegistryHub.ts
│ │ │ │ ├── updateRegistryHubV2.ts
│ │ │ │ └── updateVerifyAllAddresses.ts
│ │ │ ├── upgrade/
│ │ │ │ ├── deployNewHubAndUpgrade.ts
│ │ │ │ ├── deployNewRegistryAndUpgrade.ts
│ │ │ │ ├── upgradeAadhaarRegistry.ts
│ │ │ │ ├── upgradeIdCardRegistry.ts
│ │ │ │ ├── upgradeKycRegistry.ts
│ │ │ │ └── upgradeRegistry.ts
│ │ │ ├── utils/
│ │ │ │ └── deployPCR0.ts
│ │ │ ├── verifiers/
│ │ │ │ ├── deployAllVerifiers.ts
│ │ │ │ └── deployIdCardVerifier.ts
│ │ │ └── verifyAll/
│ │ │ └── deployVerifyAll.ts
│ │ └── readme.md
│ ├── package.json
│ ├── remappings.txt
│ ├── script/
│ │ └── MigratePCR0Manager.s.sol
│ ├── scripts/
│ │ ├── README.md
│ │ ├── constants.ts
│ │ ├── deleteDscKeyCommitment.mts
│ │ ├── deleteDscKeyCommitment.ts
│ │ ├── dev.sh
│ │ ├── findErrorSelectors.ts
│ │ ├── findErrorSignature.mts
│ │ ├── prod.sh
│ │ ├── setDscKeyCommitment.ts
│ │ ├── setHubV2.ts
│ │ ├── setRegistry.ts
│ │ ├── setRegistryId.ts
│ │ ├── setVerifiers.ts
│ │ ├── setVerifiersV2.ts
│ │ ├── showRegistryAddresses.ts
│ │ ├── staging.sh
│ │ ├── test.sh
│ │ ├── updateRegistryOfacRoot.ts
│ │ └── update_contract_name.sh
│ ├── tasks/
│ │ └── upgrade/
│ │ ├── README.md
│ │ ├── history.ts
│ │ ├── index.ts
│ │ ├── prepare.ts
│ │ ├── propose.ts
│ │ ├── status.ts
│ │ ├── types.ts
│ │ ├── upgrade.ts
│ │ └── utils.ts
│ ├── test/
│ │ ├── foundry/
│ │ │ ├── MigratePCR0Manager.t.sol
│ │ │ └── UpgradeToAccessControl.t.sol
│ │ ├── unit/
│ │ │ ├── CircuitAttributeHandler.test.ts
│ │ │ ├── CountryCodes.test.ts
│ │ │ ├── CustomVerifier.test.ts
│ │ │ ├── GCPJWTHelper.test.ts
│ │ │ ├── GenericFormatter.test.ts
│ │ │ ├── IdentityRegistry.test.ts
│ │ │ ├── IdentityVerificationHub.test.ts
│ │ │ ├── ImplRoot.test.ts
│ │ │ ├── PCR0Manager.test.ts
│ │ │ ├── SelfUtils.test.ts
│ │ │ ├── formatter.test.ts
│ │ │ └── scopeGeneration.test.ts
│ │ ├── utils/
│ │ │ ├── constants.ts
│ │ │ ├── contractUtils.ts
│ │ │ ├── deploymentV2.ts
│ │ │ ├── example/
│ │ │ │ ├── balance-tree.ts
│ │ │ │ └── merkle-tree.ts
│ │ │ ├── formatter.ts
│ │ │ ├── generateProof.ts
│ │ │ ├── smt.json
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ └── v2/
│ │ ├── discloseAadhaar.test.ts
│ │ ├── discloseId.test.ts
│ │ ├── discloseKyc.test.ts
│ │ ├── disclosePassport.test.ts
│ │ ├── hubOther.test.ts
│ │ ├── ofacProofUpdate.test.ts
│ │ ├── ofacRollingWindow.test.ts
│ │ ├── ofacUpgradePath.test.ts
│ │ ├── registerAadhaar.test.ts
│ │ ├── registerId.test.ts
│ │ ├── registerKyc.test.ts
│ │ └── registerPassport.test.ts
│ └── tsconfig.json
├── contribute.md
├── docs/
│ ├── claude-statusline-setup.md
│ ├── coverage/
│ │ ├── app.json
│ │ └── sdk.json
│ ├── development-patterns.md
│ ├── maintenance/
│ │ ├── tech-debt-baseline.json
│ │ └── tech-debt-baseline.md
│ ├── refactor-restructure-utils.md
│ ├── reviews/
│ │ ├── 2026-03-23-euclid-settings-tunnel-audit.md
│ │ ├── PR-1901-review-findings.md
│ │ └── PR-1924-review-findings.md
│ ├── superpowers/
│ │ └── plans/
│ │ ├── 2026-03-22-settings-handover.md
│ │ ├── 2026-03-22-settings-screen-integration.md
│ │ └── 2026-04-21-passport-ocr-camera-permission.md
│ ├── templates/
│ │ └── pr-action-items-template.md
│ └── testing-guide.md
├── error-selectors.json
├── gitleaks-override.toml
├── knip.config.ts
├── new-common/
│ ├── .prettierrc
│ ├── package.json
│ ├── plans/
│ │ └── PLAN.md
│ ├── src/
│ │ ├── app/
│ │ │ ├── builder.ts
│ │ │ └── index.ts
│ │ ├── attestation/
│ │ │ ├── gcp.ts
│ │ │ └── index.ts
│ │ ├── blockchain/
│ │ │ ├── forbiddenCountries.ts
│ │ │ ├── formatCallData.ts
│ │ │ ├── index.ts
│ │ │ ├── ofac.ts
│ │ │ └── proving.ts
│ │ ├── certificates/
│ │ │ ├── csca.ts
│ │ │ ├── factory.ts
│ │ │ ├── index.ts
│ │ │ ├── parsing/
│ │ │ │ ├── bruteForceSignature.ts
│ │ │ │ ├── curves.ts
│ │ │ │ ├── elliptic.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── oids.ts
│ │ │ │ ├── parseCertificateSimple.ts
│ │ │ │ ├── parseDscCertificateData.ts
│ │ │ │ └── utils.ts
│ │ │ ├── pubkey.ts
│ │ │ ├── signature.ts
│ │ │ └── types.ts
│ │ ├── circuits/
│ │ │ ├── circuitName.ts
│ │ │ ├── generator.ts
│ │ │ ├── index.ts
│ │ │ ├── inputs/
│ │ │ │ ├── disclose-aadhaar.ts
│ │ │ │ ├── disclose-kyc.ts
│ │ │ │ ├── disclose.ts
│ │ │ │ ├── dsc.ts
│ │ │ │ ├── format.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── ofac.ts
│ │ │ │ ├── register-aadhaar.ts
│ │ │ │ ├── register-kyc.ts
│ │ │ │ └── register.ts
│ │ │ ├── outputs/
│ │ │ │ ├── format.ts
│ │ │ │ └── index.ts
│ │ │ ├── types.ts
│ │ │ └── userId.ts
│ │ ├── crypto/
│ │ │ ├── eddsa.ts
│ │ │ ├── encryption.ts
│ │ │ ├── hash/
│ │ │ │ ├── index.ts
│ │ │ │ ├── poseidon.ts
│ │ │ │ └── sha.ts
│ │ │ ├── identity.ts
│ │ │ ├── index.ts
│ │ │ ├── scope.ts
│ │ │ └── sha-pad.ts
│ │ ├── data/
│ │ │ ├── countries.ts
│ │ │ ├── error-selector-map.json
│ │ │ ├── index.ts
│ │ │ ├── mockCertificates.ts
│ │ │ ├── sampleDataHashes.ts
│ │ │ ├── serialized_csca_tree.json
│ │ │ ├── serialized_dsc_tree.json
│ │ │ └── skiPem.ts
│ │ ├── documents/
│ │ │ ├── aadhaar/
│ │ │ │ ├── adapter.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── qr.ts
│ │ │ │ └── utils.ts
│ │ │ ├── factory.ts
│ │ │ ├── index.ts
│ │ │ ├── interface.ts
│ │ │ ├── kyc/
│ │ │ │ ├── adapter.ts
│ │ │ │ ├── api.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ └── passport/
│ │ │ ├── adapter.ts
│ │ │ ├── bruteForcePassportSignature.ts
│ │ │ ├── commitment.ts
│ │ │ ├── core.ts
│ │ │ ├── format.ts
│ │ │ ├── index.ts
│ │ │ └── parsing.ts
│ │ ├── foundation/
│ │ │ ├── arrays.ts
│ │ │ ├── bytes.ts
│ │ │ ├── constants/
│ │ │ │ ├── circuit.ts
│ │ │ │ ├── countries.ts
│ │ │ │ ├── crypto.ts
│ │ │ │ ├── disclosure.ts
│ │ │ │ ├── identity.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── network.ts
│ │ │ ├── date.ts
│ │ │ ├── index.ts
│ │ │ └── types/
│ │ │ ├── app.ts
│ │ │ ├── attestation.ts
│ │ │ ├── certificate.ts
│ │ │ ├── circuit.ts
│ │ │ ├── document.ts
│ │ │ ├── environment.ts
│ │ │ └── index.ts
│ │ ├── index.ts
│ │ ├── testing/
│ │ │ ├── dg1.ts
│ │ │ ├── genMockAadhaarData.ts
│ │ │ ├── genMockIdDoc.ts
│ │ │ ├── genMockKycData.ts
│ │ │ ├── genMockPassportData.ts
│ │ │ ├── getMockDSC.ts
│ │ │ ├── index.ts
│ │ │ └── mockAadhaarCert.ts
│ │ └── trees/
│ │ ├── aadhaarLeafBuilder.ts
│ │ ├── certificate.ts
│ │ ├── index.ts
│ │ ├── kycLeafBuilder.ts
│ │ ├── leafBuilder.ts
│ │ ├── ofac.ts
│ │ ├── passportLeafBuilder.ts
│ │ └── proof.ts
│ ├── tsconfig.json
│ └── tsup.config.ts
├── noir/
│ ├── AGENTS.md
│ ├── Nargo.toml
│ ├── README.md
│ └── crates/
│ ├── dg1/
│ │ ├── Nargo.toml
│ │ ├── Prover.toml
│ │ ├── rsa-inputs.json
│ │ └── src/
│ │ ├── constants.nr
│ │ ├── dg1/
│ │ │ ├── dg1.nr
│ │ │ └── mod.nr
│ │ ├── disclose/
│ │ │ ├── country_not_in_list.nr
│ │ │ ├── disclose.nr
│ │ │ └── mod.nr
│ │ ├── eContent/
│ │ │ ├── hasher.nr
│ │ │ ├── mod.nr
│ │ │ └── utils.nr
│ │ ├── main.nr
│ │ ├── ofac/
│ │ │ ├── mod.nr
│ │ │ ├── ofac_name.nr
│ │ │ ├── ofac_name_dob.nr
│ │ │ └── ofac_passport_number.nr
│ │ ├── types.nr
│ │ └── utils/
│ │ ├── array.nr
│ │ ├── date/
│ │ │ ├── is_older_than.nr
│ │ │ └── mod.nr
│ │ ├── mod.nr
│ │ └── other/
│ │ ├── binary_merkle_tree.nr
│ │ ├── mod.nr
│ │ └── smt.nr
│ └── econtent/
│ ├── Nargo.toml
│ └── src/
│ └── main.nr
├── package.json
├── packages/
│ ├── kmp-minipay-sample/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ ├── composeApp/
│ │ │ ├── build.gradle.kts
│ │ │ └── src/
│ │ │ ├── androidMain/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin/
│ │ │ │ │ └── xyz/
│ │ │ │ │ └── self/
│ │ │ │ │ └── minipay/
│ │ │ │ │ ├── AppStorage.android.kt
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ ├── PlatformLaunch.android.kt
│ │ │ │ │ └── webview/
│ │ │ │ │ └── PlatformWebViewBridge.android.kt
│ │ │ │ └── res/
│ │ │ │ └── xml/
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ ├── commonMain/
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── minipay/
│ │ │ │ ├── App.kt
│ │ │ │ ├── AppStorage.kt
│ │ │ │ ├── MainViewModel.kt
│ │ │ │ ├── PlatformLaunch.kt
│ │ │ │ ├── screens/
│ │ │ │ │ ├── HomeScreen.kt
│ │ │ │ │ ├── ResultScreen.kt
│ │ │ │ │ └── WebViewBridgeScreen.kt
│ │ │ │ ├── theme/
│ │ │ │ │ └── Theme.kt
│ │ │ │ └── webview/
│ │ │ │ └── EthereumBridge.kt
│ │ │ └── iosMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── minipay/
│ │ │ ├── AppStorage.ios.kt
│ │ │ ├── MainViewController.kt
│ │ │ ├── PlatformLaunch.ios.kt
│ │ │ └── webview/
│ │ │ └── PlatformWebViewBridge.ios.kt
│ │ ├── gradle/
│ │ │ ├── libs.versions.toml
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── iosApp/
│ │ │ ├── iosApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ContentView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── iOSApp.swift
│ │ │ │ └── iosApp.entitlements
│ │ │ └── iosApp.xcodeproj/
│ │ │ └── project.pbxproj
│ │ └── settings.gradle.kts
│ ├── kmp-sdk/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── build.gradle.kts
│ │ ├── gradle/
│ │ │ ├── libs.versions.toml
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── package.json
│ │ ├── settings.gradle.kts
│ │ └── shared/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── androidMain/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ └── SelfSdk.android.kt
│ │ │ ├── bridge/
│ │ │ │ └── PlatformActuals.android.kt
│ │ │ ├── handlers/
│ │ │ │ ├── BiometricBridgeHandler.kt
│ │ │ │ ├── CameraMrzBridgeHandler.kt
│ │ │ │ ├── LifecycleBridgeHandler.kt
│ │ │ │ └── NfcBridgeHandler.kt
│ │ │ ├── providers/
│ │ │ │ ├── AndroidKeystoreCryptoProvider.kt
│ │ │ │ └── EncryptedSharedPreferencesProvider.kt
│ │ │ └── webview/
│ │ │ ├── AndroidWebViewHost.kt
│ │ │ └── SelfVerificationActivity.kt
│ │ ├── androidUnitTest/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ └── webview/
│ │ │ └── AndroidWebViewHostSecurityTest.kt
│ │ ├── commonMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ ├── QueryParamsBuilder.kt
│ │ │ │ ├── SdkConstants.kt
│ │ │ │ ├── SelfSdk.kt
│ │ │ │ ├── SelfSdkCallback.kt
│ │ │ │ ├── SelfSdkConfig.kt
│ │ │ │ ├── VerificationRequest.kt
│ │ │ │ └── VerificationResultJson.kt
│ │ │ ├── bridge/
│ │ │ │ ├── BridgeHandler.kt
│ │ │ │ ├── BridgeMessage.kt
│ │ │ │ └── MessageRouter.kt
│ │ │ ├── handlers/
│ │ │ │ ├── CryptoBridgeHandler.kt
│ │ │ │ ├── LifecycleSetResultOutcome.kt
│ │ │ │ ├── NfcApduPolicy.kt
│ │ │ │ └── SecureStorageBridgeHandler.kt
│ │ │ ├── models/
│ │ │ │ ├── MrzDetectionState.kt
│ │ │ │ ├── MrzKeyUtils.kt
│ │ │ │ ├── MrzParser.kt
│ │ │ │ ├── NfcScanParams.kt
│ │ │ │ ├── NfcScanProgress.kt
│ │ │ │ ├── NfcScanState.kt
│ │ │ │ └── PassportScanResult.kt
│ │ │ └── providers/
│ │ │ ├── CryptoProvider.kt
│ │ │ ├── SdkProviderRegistry.kt
│ │ │ └── SecureStorageProvider.kt
│ │ ├── commonTest/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ ├── QueryParamsBuilderTest.kt
│ │ │ │ └── VerificationResultJsonTest.kt
│ │ │ ├── bridge/
│ │ │ │ ├── BridgeMessageTest.kt
│ │ │ │ └── MessageRouterTest.kt
│ │ │ ├── handlers/
│ │ │ │ ├── LifecycleBridgeHandlerTest.kt
│ │ │ │ └── NfcApduPolicyTest.kt
│ │ │ ├── models/
│ │ │ │ ├── ModelSerializationTest.kt
│ │ │ │ ├── MrzKeyUtilsTest.kt
│ │ │ │ ├── MrzParserTest.kt
│ │ │ │ └── NfcScanStateTest.kt
│ │ │ └── testutil/
│ │ │ ├── FakeBridgeHandler.kt
│ │ │ └── TestData.kt
│ │ ├── iosMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ └── SelfSdk.ios.kt
│ │ │ ├── bridge/
│ │ │ │ └── PlatformActuals.ios.kt
│ │ │ ├── handlers/
│ │ │ │ ├── AnalyticsBridgeHandler.kt
│ │ │ │ ├── BiometricBridgeHandler.kt
│ │ │ │ ├── CameraMrzBridgeHandler.kt
│ │ │ │ ├── DocumentsBridgeHandler.kt
│ │ │ │ ├── HapticBridgeHandler.kt
│ │ │ │ ├── LifecycleBridgeHandler.kt
│ │ │ │ └── NfcBridgeHandler.kt
│ │ │ ├── providers/
│ │ │ │ ├── BiometricProvider.kt
│ │ │ │ ├── CameraMrzProvider.kt
│ │ │ │ ├── DocumentsProvider.kt
│ │ │ │ ├── HapticProvider.kt
│ │ │ │ ├── IosProviderRegistry.kt
│ │ │ │ ├── NfcProvider.kt
│ │ │ │ └── WebViewProvider.kt
│ │ │ └── webview/
│ │ │ └── IosWebViewHost.kt
│ │ ├── jvmMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ └── SelfSdk.jvm.kt
│ │ │ └── bridge/
│ │ │ └── PlatformActuals.jvm.kt
│ │ └── nativeInterop/
│ │ └── cinterop/
│ │ ├── CoreNFC.def
│ │ ├── LocalAuthentication.def
│ │ ├── Security.def
│ │ ├── UIKit.def
│ │ └── Vision.def
│ ├── kmp-sdk-test-app/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .swiftlint.yml
│ │ ├── README.md
│ │ ├── build.gradle.kts
│ │ ├── composeApp/
│ │ │ ├── build.gradle.kts
│ │ │ └── src/
│ │ │ ├── androidMain/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── testapp/
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── SelfTestApplication.kt
│ │ │ │ ├── components/
│ │ │ │ │ └── CameraPreviewComposable.kt
│ │ │ │ ├── screens/
│ │ │ │ │ ├── DevServerUrl.android.kt
│ │ │ │ │ ├── MrzScanScreen.android.kt
│ │ │ │ │ ├── NfcScanScreen.android.kt
│ │ │ │ │ └── PassportDetailsScreen.android.kt
│ │ │ │ ├── storage/
│ │ │ │ │ └── PassportDataStore.kt
│ │ │ │ └── utils/
│ │ │ │ └── Logger.android.kt
│ │ │ ├── commonMain/
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── testapp/
│ │ │ │ ├── App.kt
│ │ │ │ ├── components/
│ │ │ │ │ ├── MrzViewfinder.kt
│ │ │ │ │ └── NfcProgressIndicator.kt
│ │ │ │ ├── models/
│ │ │ │ │ ├── PassportData.kt
│ │ │ │ │ └── VerificationFlowState.kt
│ │ │ │ ├── screens/
│ │ │ │ │ ├── DomainSmokeScreen.kt
│ │ │ │ │ ├── MrzConfirmationScreen.kt
│ │ │ │ │ ├── PassportDetailsScreen.kt
│ │ │ │ │ ├── ResultScreen.kt
│ │ │ │ │ └── SdkLaunchScreen.kt
│ │ │ │ ├── theme/
│ │ │ │ │ └── Theme.kt
│ │ │ │ ├── utils/
│ │ │ │ │ └── Logger.kt
│ │ │ │ └── viewmodels/
│ │ │ │ └── VerificationViewModel.kt
│ │ │ ├── commonTest/
│ │ │ │ └── kotlin/
│ │ │ │ └── xyz/
│ │ │ │ └── self/
│ │ │ │ └── testapp/
│ │ │ │ ├── models/
│ │ │ │ │ ├── PassportDataTest.kt
│ │ │ │ │ └── VerificationFlowStateTest.kt
│ │ │ │ ├── testutil/
│ │ │ │ │ └── TestData.kt
│ │ │ │ └── viewmodels/
│ │ │ │ └── VerificationViewModelTest.kt
│ │ │ ├── debug/
│ │ │ │ └── AndroidManifest.xml
│ │ │ └── iosMain/
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── testapp/
│ │ │ ├── MainViewController.kt
│ │ │ ├── screens/
│ │ │ │ ├── DevServerUrl.ios.kt
│ │ │ │ ├── MrzScanScreen.ios.kt
│ │ │ │ ├── NfcScanScreen.ios.kt
│ │ │ │ └── PassportDetailsScreen.ios.kt
│ │ │ └── utils/
│ │ │ ├── ExceptionHandler.ios.kt
│ │ │ └── Logger.ios.kt
│ │ ├── gradle/
│ │ │ ├── libs.versions.toml
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── iosApp/
│ │ │ ├── .swiftlint.yml
│ │ │ ├── Podfile
│ │ │ ├── iosApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ContentView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── iOSApp.swift
│ │ │ │ └── iosApp.entitlements
│ │ │ ├── iosApp.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── iosApp.xcscheme
│ │ │ └── iosApp.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── run-android.sh
│ │ │ └── run-ios.sh
│ │ └── settings.gradle.kts
│ ├── mobile-sdk-alpha/
│ │ ├── .eslintignore
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── AGENTS.md
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── build.gradle
│ │ │ ├── build.gradle.source
│ │ │ ├── gradle.properties
│ │ │ ├── mobile-sdk-alpha-bom.gradle
│ │ │ └── proguard-rules.pro
│ │ ├── assets/
│ │ │ └── fonts/
│ │ │ ├── Advercase-Regular.otf
│ │ │ ├── DINOT-Bold.otf
│ │ │ ├── DINOT-Medium.otf
│ │ │ └── IBMPlexMono-Regular.otf
│ │ ├── docs/
│ │ │ └── DOCSTRING_STYLE_GUIDE.md
│ │ ├── ios/
│ │ │ ├── Frameworks/
│ │ │ │ ├── NFCPassportReader.xcframework/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ios-arm64/
│ │ │ │ │ └── NFCPassportReader.framework/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── NFCPassportReader.swiftmodule/
│ │ │ │ │ │ ├── arm64-apple-ios.abi.json
│ │ │ │ │ │ ├── arm64-apple-ios.private.swiftinterface
│ │ │ │ │ │ ├── arm64-apple-ios.swiftdoc
│ │ │ │ │ │ └── arm64-apple-ios.swiftinterface
│ │ │ │ │ ├── NFCPassportReader
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── OpenSSL.xcframework/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── _CodeSignature/
│ │ │ │ │ ├── CodeDirectory
│ │ │ │ │ ├── CodeRequirements
│ │ │ │ │ ├── CodeRequirements-1
│ │ │ │ │ ├── CodeResources
│ │ │ │ │ └── CodeSignature
│ │ │ │ ├── ios-arm64/
│ │ │ │ │ └── OpenSSL.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ ├── ios-arm64_x86_64-maccatalyst/
│ │ │ │ │ └── OpenSSL.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ └── Versions/
│ │ │ │ │ ├── A/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ │ ├── Modules/
│ │ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ │ ├── OpenSSL
│ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ │ └── CodeResources
│ │ │ │ │ └── Current/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ ├── ios-arm64_x86_64-simulator/
│ │ │ │ │ └── OpenSSL.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── macos-arm64_x86_64/
│ │ │ │ └── OpenSSL.framework/
│ │ │ │ ├── Headers/
│ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ ├── aes.h
│ │ │ │ │ ├── asn1.h
│ │ │ │ │ ├── asn1err.h
│ │ │ │ │ ├── asn1t.h
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ ├── bio.h
│ │ │ │ │ ├── bioerr.h
│ │ │ │ │ ├── blowfish.h
│ │ │ │ │ ├── bn.h
│ │ │ │ │ ├── bnerr.h
│ │ │ │ │ ├── buffer.h
│ │ │ │ │ ├── buffererr.h
│ │ │ │ │ ├── camellia.h
│ │ │ │ │ ├── cast.h
│ │ │ │ │ ├── cmac.h
│ │ │ │ │ ├── cms.h
│ │ │ │ │ ├── cmserr.h
│ │ │ │ │ ├── comp.h
│ │ │ │ │ ├── comperr.h
│ │ │ │ │ ├── conf.h
│ │ │ │ │ ├── conf_api.h
│ │ │ │ │ ├── conferr.h
│ │ │ │ │ ├── crypto.h
│ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ ├── ct.h
│ │ │ │ │ ├── cterr.h
│ │ │ │ │ ├── des.h
│ │ │ │ │ ├── dh.h
│ │ │ │ │ ├── dherr.h
│ │ │ │ │ ├── dsa.h
│ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ ├── dtls1.h
│ │ │ │ │ ├── e_os2.h
│ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ ├── ec.h
│ │ │ │ │ ├── ecdh.h
│ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ ├── ecerr.h
│ │ │ │ │ ├── engine.h
│ │ │ │ │ ├── engineerr.h
│ │ │ │ │ ├── err.h
│ │ │ │ │ ├── evp.h
│ │ │ │ │ ├── evperr.h
│ │ │ │ │ ├── hmac.h
│ │ │ │ │ ├── idea.h
│ │ │ │ │ ├── kdf.h
│ │ │ │ │ ├── kdferr.h
│ │ │ │ │ ├── lhash.h
│ │ │ │ │ ├── md2.h
│ │ │ │ │ ├── md4.h
│ │ │ │ │ ├── md5.h
│ │ │ │ │ ├── mdc2.h
│ │ │ │ │ ├── modes.h
│ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ ├── objects.h
│ │ │ │ │ ├── objectserr.h
│ │ │ │ │ ├── ocsp.h
│ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ ├── opensslv.h
│ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ ├── pem.h
│ │ │ │ │ ├── pem2.h
│ │ │ │ │ ├── pemerr.h
│ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ ├── rand.h
│ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ ├── randerr.h
│ │ │ │ │ ├── rc2.h
│ │ │ │ │ ├── rc4.h
│ │ │ │ │ ├── rc5.h
│ │ │ │ │ ├── ripemd.h
│ │ │ │ │ ├── rsa.h
│ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ ├── safestack.h
│ │ │ │ │ ├── seed.h
│ │ │ │ │ ├── sha.h
│ │ │ │ │ ├── shim.h
│ │ │ │ │ ├── srp.h
│ │ │ │ │ ├── srtp.h
│ │ │ │ │ ├── ssl.h
│ │ │ │ │ ├── ssl2.h
│ │ │ │ │ ├── ssl3.h
│ │ │ │ │ ├── sslerr.h
│ │ │ │ │ ├── stack.h
│ │ │ │ │ ├── store.h
│ │ │ │ │ ├── storeerr.h
│ │ │ │ │ ├── symhacks.h
│ │ │ │ │ ├── tls1.h
│ │ │ │ │ ├── ts.h
│ │ │ │ │ ├── tserr.h
│ │ │ │ │ ├── txt_db.h
│ │ │ │ │ ├── ui.h
│ │ │ │ │ ├── uierr.h
│ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ ├── x509.h
│ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ ├── x509err.h
│ │ │ │ │ ├── x509v3.h
│ │ │ │ │ └── x509v3err.h
│ │ │ │ ├── Modules/
│ │ │ │ │ └── module.modulemap
│ │ │ │ ├── OpenSSL
│ │ │ │ ├── Resources/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ └── Versions/
│ │ │ │ ├── A/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ │ ├── aes.h
│ │ │ │ │ │ ├── asn1.h
│ │ │ │ │ │ ├── asn1err.h
│ │ │ │ │ │ ├── asn1t.h
│ │ │ │ │ │ ├── async.h
│ │ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ │ ├── bio.h
│ │ │ │ │ │ ├── bioerr.h
│ │ │ │ │ │ ├── blowfish.h
│ │ │ │ │ │ ├── bn.h
│ │ │ │ │ │ ├── bnerr.h
│ │ │ │ │ │ ├── buffer.h
│ │ │ │ │ │ ├── buffererr.h
│ │ │ │ │ │ ├── camellia.h
│ │ │ │ │ │ ├── cast.h
│ │ │ │ │ │ ├── cmac.h
│ │ │ │ │ │ ├── cms.h
│ │ │ │ │ │ ├── cmserr.h
│ │ │ │ │ │ ├── comp.h
│ │ │ │ │ │ ├── comperr.h
│ │ │ │ │ │ ├── conf.h
│ │ │ │ │ │ ├── conf_api.h
│ │ │ │ │ │ ├── conferr.h
│ │ │ │ │ │ ├── crypto.h
│ │ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ │ ├── ct.h
│ │ │ │ │ │ ├── cterr.h
│ │ │ │ │ │ ├── des.h
│ │ │ │ │ │ ├── dh.h
│ │ │ │ │ │ ├── dherr.h
│ │ │ │ │ │ ├── dsa.h
│ │ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ │ ├── dtls1.h
│ │ │ │ │ │ ├── e_os2.h
│ │ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ │ ├── ec.h
│ │ │ │ │ │ ├── ecdh.h
│ │ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ │ ├── ecerr.h
│ │ │ │ │ │ ├── engine.h
│ │ │ │ │ │ ├── engineerr.h
│ │ │ │ │ │ ├── err.h
│ │ │ │ │ │ ├── evp.h
│ │ │ │ │ │ ├── evperr.h
│ │ │ │ │ │ ├── hmac.h
│ │ │ │ │ │ ├── idea.h
│ │ │ │ │ │ ├── kdf.h
│ │ │ │ │ │ ├── kdferr.h
│ │ │ │ │ │ ├── lhash.h
│ │ │ │ │ │ ├── md2.h
│ │ │ │ │ │ ├── md4.h
│ │ │ │ │ │ ├── md5.h
│ │ │ │ │ │ ├── mdc2.h
│ │ │ │ │ │ ├── modes.h
│ │ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ │ ├── objects.h
│ │ │ │ │ │ ├── objectserr.h
│ │ │ │ │ │ ├── ocsp.h
│ │ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ │ ├── opensslv.h
│ │ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ │ ├── pem.h
│ │ │ │ │ │ ├── pem2.h
│ │ │ │ │ │ ├── pemerr.h
│ │ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ │ ├── rand.h
│ │ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ │ ├── randerr.h
│ │ │ │ │ │ ├── rc2.h
│ │ │ │ │ │ ├── rc4.h
│ │ │ │ │ │ ├── rc5.h
│ │ │ │ │ │ ├── ripemd.h
│ │ │ │ │ │ ├── rsa.h
│ │ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ │ ├── safestack.h
│ │ │ │ │ │ ├── seed.h
│ │ │ │ │ │ ├── sha.h
│ │ │ │ │ │ ├── shim.h
│ │ │ │ │ │ ├── srp.h
│ │ │ │ │ │ ├── srtp.h
│ │ │ │ │ │ ├── ssl.h
│ │ │ │ │ │ ├── ssl2.h
│ │ │ │ │ │ ├── ssl3.h
│ │ │ │ │ │ ├── sslerr.h
│ │ │ │ │ │ ├── stack.h
│ │ │ │ │ │ ├── store.h
│ │ │ │ │ │ ├── storeerr.h
│ │ │ │ │ │ ├── symhacks.h
│ │ │ │ │ │ ├── tls1.h
│ │ │ │ │ │ ├── ts.h
│ │ │ │ │ │ ├── tserr.h
│ │ │ │ │ │ ├── txt_db.h
│ │ │ │ │ │ ├── ui.h
│ │ │ │ │ │ ├── uierr.h
│ │ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ │ ├── x509.h
│ │ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ │ ├── x509err.h
│ │ │ │ │ │ ├── x509v3.h
│ │ │ │ │ │ └── x509v3err.h
│ │ │ │ │ ├── Modules/
│ │ │ │ │ │ └── module.modulemap
│ │ │ │ │ ├── OpenSSL
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ └── CodeResources
│ │ │ │ └── Current/
│ │ │ │ ├── Headers/
│ │ │ │ │ ├── OpenSSL.h
│ │ │ │ │ ├── aes.h
│ │ │ │ │ ├── asn1.h
│ │ │ │ │ ├── asn1err.h
│ │ │ │ │ ├── asn1t.h
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── asyncerr.h
│ │ │ │ │ ├── bio.h
│ │ │ │ │ ├── bioerr.h
│ │ │ │ │ ├── blowfish.h
│ │ │ │ │ ├── bn.h
│ │ │ │ │ ├── bnerr.h
│ │ │ │ │ ├── buffer.h
│ │ │ │ │ ├── buffererr.h
│ │ │ │ │ ├── camellia.h
│ │ │ │ │ ├── cast.h
│ │ │ │ │ ├── cmac.h
│ │ │ │ │ ├── cms.h
│ │ │ │ │ ├── cmserr.h
│ │ │ │ │ ├── comp.h
│ │ │ │ │ ├── comperr.h
│ │ │ │ │ ├── conf.h
│ │ │ │ │ ├── conf_api.h
│ │ │ │ │ ├── conferr.h
│ │ │ │ │ ├── crypto.h
│ │ │ │ │ ├── cryptoerr.h
│ │ │ │ │ ├── ct.h
│ │ │ │ │ ├── cterr.h
│ │ │ │ │ ├── des.h
│ │ │ │ │ ├── dh.h
│ │ │ │ │ ├── dherr.h
│ │ │ │ │ ├── dsa.h
│ │ │ │ │ ├── dsaerr.h
│ │ │ │ │ ├── dtls1.h
│ │ │ │ │ ├── e_os2.h
│ │ │ │ │ ├── ebcdic.h
│ │ │ │ │ ├── ec.h
│ │ │ │ │ ├── ecdh.h
│ │ │ │ │ ├── ecdsa.h
│ │ │ │ │ ├── ecerr.h
│ │ │ │ │ ├── engine.h
│ │ │ │ │ ├── engineerr.h
│ │ │ │ │ ├── err.h
│ │ │ │ │ ├── evp.h
│ │ │ │ │ ├── evperr.h
│ │ │ │ │ ├── hmac.h
│ │ │ │ │ ├── idea.h
│ │ │ │ │ ├── kdf.h
│ │ │ │ │ ├── kdferr.h
│ │ │ │ │ ├── lhash.h
│ │ │ │ │ ├── md2.h
│ │ │ │ │ ├── md4.h
│ │ │ │ │ ├── md5.h
│ │ │ │ │ ├── mdc2.h
│ │ │ │ │ ├── modes.h
│ │ │ │ │ ├── obj_mac.h
│ │ │ │ │ ├── objects.h
│ │ │ │ │ ├── objectserr.h
│ │ │ │ │ ├── ocsp.h
│ │ │ │ │ ├── ocsperr.h
│ │ │ │ │ ├── opensslconf.h
│ │ │ │ │ ├── opensslv.h
│ │ │ │ │ ├── ossl_typ.h
│ │ │ │ │ ├── pem.h
│ │ │ │ │ ├── pem2.h
│ │ │ │ │ ├── pemerr.h
│ │ │ │ │ ├── pkcs12.h
│ │ │ │ │ ├── pkcs12err.h
│ │ │ │ │ ├── pkcs7.h
│ │ │ │ │ ├── pkcs7err.h
│ │ │ │ │ ├── rand.h
│ │ │ │ │ ├── rand_drbg.h
│ │ │ │ │ ├── randerr.h
│ │ │ │ │ ├── rc2.h
│ │ │ │ │ ├── rc4.h
│ │ │ │ │ ├── rc5.h
│ │ │ │ │ ├── ripemd.h
│ │ │ │ │ ├── rsa.h
│ │ │ │ │ ├── rsaerr.h
│ │ │ │ │ ├── safestack.h
│ │ │ │ │ ├── seed.h
│ │ │ │ │ ├── sha.h
│ │ │ │ │ ├── shim.h
│ │ │ │ │ ├── srp.h
│ │ │ │ │ ├── srtp.h
│ │ │ │ │ ├── ssl.h
│ │ │ │ │ ├── ssl2.h
│ │ │ │ │ ├── ssl3.h
│ │ │ │ │ ├── sslerr.h
│ │ │ │ │ ├── stack.h
│ │ │ │ │ ├── store.h
│ │ │ │ │ ├── storeerr.h
│ │ │ │ │ ├── symhacks.h
│ │ │ │ │ ├── tls1.h
│ │ │ │ │ ├── ts.h
│ │ │ │ │ ├── tserr.h
│ │ │ │ │ ├── txt_db.h
│ │ │ │ │ ├── ui.h
│ │ │ │ │ ├── uierr.h
│ │ │ │ │ ├── whrlpool.h
│ │ │ │ │ ├── x509.h
│ │ │ │ │ ├── x509_vfy.h
│ │ │ │ │ ├── x509err.h
│ │ │ │ │ ├── x509v3.h
│ │ │ │ │ └── x509v3err.h
│ │ │ │ ├── Modules/
│ │ │ │ │ └── module.modulemap
│ │ │ │ ├── OpenSSL
│ │ │ │ ├── Resources/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── PrivacyInfo.xcprivacy
│ │ │ │ └── _CodeSignature/
│ │ │ │ └── CodeResources
│ │ │ └── SelfSDK/
│ │ │ ├── MrzOcrCorrection.swift
│ │ │ ├── MrzResultMapper.swift
│ │ │ ├── MrzScanEngine.swift
│ │ │ ├── NFCPassportReader 2.xcframework/
│ │ │ │ ├── Info.plist
│ │ │ │ └── ios-arm64/
│ │ │ │ └── NFCPassportReader.framework/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Modules/
│ │ │ │ │ └── NFCPassportReader.swiftmodule/
│ │ │ │ │ ├── arm64-apple-ios.abi.json
│ │ │ │ │ ├── arm64-apple-ios.private.swiftinterface
│ │ │ │ │ ├── arm64-apple-ios.swiftdoc
│ │ │ │ │ └── arm64-apple-ios.swiftinterface
│ │ │ │ ├── NFCPassportReader
│ │ │ │ └── _CodeSignature/
│ │ │ │ └── CodeResources
│ │ │ ├── PassportReader.m
│ │ │ ├── PassportReader.swift
│ │ │ ├── PassportReaderCore.swift
│ │ │ ├── SelfCameraView.swift
│ │ │ ├── SelfLiveMRZScannerView.swift
│ │ │ ├── SelfMRZScannerModule.m
│ │ │ ├── SelfMRZScannerModule.swift
│ │ │ ├── SelfMRZScannerViewManager.m
│ │ │ ├── SelfMRZScannerViewManager.swift
│ │ │ ├── SelfSDK/
│ │ │ │ ├── SelfSDK.docc/
│ │ │ │ │ └── SelfSDK.md
│ │ │ │ ├── SelfSDK.m
│ │ │ │ └── SelfSDK.swift
│ │ │ └── SelfSDK.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── mobile-sdk-alpha.podspec
│ │ ├── package.json
│ │ ├── react-native.config.cjs
│ │ ├── scripts/
│ │ │ ├── build-android.sh
│ │ │ ├── build-ios.sh
│ │ │ ├── copy-assets.mjs
│ │ │ ├── postBuild.mjs
│ │ │ ├── report-exports.mjs
│ │ │ ├── setup-native-source.cjs
│ │ │ ├── shimConfigs.js
│ │ │ ├── validate-exports.mjs
│ │ │ └── verify-conditions.mjs
│ │ ├── src/
│ │ │ ├── adapters/
│ │ │ │ ├── browser/
│ │ │ │ │ ├── analytics.ts
│ │ │ │ │ ├── crypto.ts
│ │ │ │ │ ├── documents.ts
│ │ │ │ │ ├── haptic.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── network.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── react-native/
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── crypto.ts
│ │ │ │ │ ├── documents.ts
│ │ │ │ │ ├── factory.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── network.ts
│ │ │ │ │ └── nfc-scanner.ts
│ │ │ │ └── web/
│ │ │ │ └── shims.ts
│ │ │ ├── analytics/
│ │ │ │ └── onboardingFunnel.ts
│ │ │ ├── animations/
│ │ │ │ ├── loading/
│ │ │ │ │ ├── fail.json
│ │ │ │ │ ├── misc.json
│ │ │ │ │ ├── prove.json
│ │ │ │ │ ├── success.json
│ │ │ │ │ └── youWin.json
│ │ │ │ ├── passport_scan.json
│ │ │ │ └── passport_verify.json
│ │ │ ├── bridge/
│ │ │ │ ├── nativeEvents.native.ts
│ │ │ │ └── nativeEvents.ts
│ │ │ ├── browser.ts
│ │ │ ├── client.ts
│ │ │ ├── components/
│ │ │ │ ├── ButtonsContainer.tsx
│ │ │ │ ├── DelayedLottieView.tsx
│ │ │ │ ├── DelayedLottieView.web.tsx
│ │ │ │ ├── MRZScannerView.tsx
│ │ │ │ ├── RCTFragment.tsx
│ │ │ │ ├── TextsContainer.tsx
│ │ │ │ ├── buttons/
│ │ │ │ │ ├── AbstractButton.tsx
│ │ │ │ │ ├── HeldPrimaryButtonProveScreen.tsx
│ │ │ │ │ ├── PrimaryButton.tsx
│ │ │ │ │ ├── PrimaryButtonLongHold.shared.ts
│ │ │ │ │ ├── PrimaryButtonLongHold.tsx
│ │ │ │ │ ├── PrimaryButtonLongHold.web.tsx
│ │ │ │ │ ├── SecondaryButton.tsx
│ │ │ │ │ └── pressedStyle.tsx
│ │ │ │ ├── flag/
│ │ │ │ │ └── RoundFlag.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── layout/
│ │ │ │ │ ├── Button.tsx
│ │ │ │ │ ├── Text.tsx
│ │ │ │ │ ├── View.tsx
│ │ │ │ │ ├── XStack.tsx
│ │ │ │ │ └── YStack.tsx
│ │ │ │ ├── screens/
│ │ │ │ │ ├── NFCScannerScreen.tsx
│ │ │ │ │ ├── PassportCameraScreen.tsx
│ │ │ │ │ └── QRCodeScreen.tsx
│ │ │ │ └── typography/
│ │ │ │ ├── Additional.tsx
│ │ │ │ ├── BodyText.tsx
│ │ │ │ ├── Caption.tsx
│ │ │ │ ├── Caution.tsx
│ │ │ │ ├── Description.tsx
│ │ │ │ ├── DescriptionTitle.tsx
│ │ │ │ ├── SubHeader.tsx
│ │ │ │ ├── Title.tsx
│ │ │ │ └── styles.ts
│ │ │ ├── config/
│ │ │ │ ├── defaults.ts
│ │ │ │ ├── features.ts
│ │ │ │ └── merge.ts
│ │ │ ├── constants/
│ │ │ │ ├── analytics.ts
│ │ │ │ ├── colors.ts
│ │ │ │ ├── fonts.ts
│ │ │ │ ├── images.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── layout.ts
│ │ │ ├── context.tsx
│ │ │ ├── data/
│ │ │ │ └── country-document-types.json
│ │ │ ├── documents/
│ │ │ │ ├── useCountries.tsx
│ │ │ │ ├── utils.ts
│ │ │ │ └── validation.ts
│ │ │ ├── errors/
│ │ │ │ ├── InitError.ts
│ │ │ │ ├── LivenessError.ts
│ │ │ │ ├── MrzParseError.ts
│ │ │ │ ├── NfcParseError.ts
│ │ │ │ ├── SdkError.ts
│ │ │ │ └── index.ts
│ │ │ ├── flows/
│ │ │ │ ├── about.md
│ │ │ │ ├── disclosing/
│ │ │ │ │ ├── await-verification.ts
│ │ │ │ │ ├── confirm-selection.ts
│ │ │ │ │ └── scan-qr-code.ts
│ │ │ │ └── onboarding/
│ │ │ │ ├── confirm-identification.tsx
│ │ │ │ ├── country-picker-screen.tsx
│ │ │ │ ├── document-camera-screen.tsx
│ │ │ │ ├── document-nfc-screen.tsx
│ │ │ │ ├── id-selection-screen.tsx
│ │ │ │ ├── import-aadhaar.ts
│ │ │ │ ├── logo-confirmation-screen.tsx
│ │ │ │ └── read-mrz.ts
│ │ │ ├── haptic/
│ │ │ │ ├── index.ts
│ │ │ │ ├── shared.ts
│ │ │ │ ├── trigger.ts
│ │ │ │ └── trigger.web.ts
│ │ │ ├── hooks/
│ │ │ │ ├── index.ts
│ │ │ │ └── useSafeBottomPadding.ts
│ │ │ ├── index.ts
│ │ │ ├── layouts/
│ │ │ │ └── ExpandableBottomLayout.tsx
│ │ │ ├── mock/
│ │ │ │ └── generator.ts
│ │ │ ├── mrz/
│ │ │ │ └── index.ts
│ │ │ ├── nfc/
│ │ │ │ └── index.ts
│ │ │ ├── processing/
│ │ │ │ ├── mrz.ts
│ │ │ │ └── nfc.ts
│ │ │ ├── proving/
│ │ │ │ ├── internal/
│ │ │ │ │ ├── logging.ts
│ │ │ │ │ └── statusHandlers.ts
│ │ │ │ ├── provingMachine.ts
│ │ │ │ └── recoveryValidation.ts
│ │ │ ├── stores/
│ │ │ │ ├── index.ts
│ │ │ │ ├── mrzStore.tsx
│ │ │ │ ├── protocolStore.ts
│ │ │ │ └── selfAppStore.tsx
│ │ │ ├── types/
│ │ │ │ ├── base.ts
│ │ │ │ ├── events.ts
│ │ │ │ ├── png.d.ts
│ │ │ │ ├── public.ts
│ │ │ │ ├── svg.d.ts
│ │ │ │ └── ui.ts
│ │ │ ├── utils/
│ │ │ │ ├── styleUtils.ts
│ │ │ │ └── utils.ts
│ │ │ └── validation/
│ │ │ └── document.ts
│ │ ├── tests/
│ │ │ ├── adapters/
│ │ │ │ ├── browser/
│ │ │ │ │ ├── analytics.test.ts
│ │ │ │ │ ├── crypto.test.ts
│ │ │ │ │ ├── documents.test.ts
│ │ │ │ │ └── haptic.test.ts
│ │ │ │ └── reactNative/
│ │ │ │ └── nfcScanner.test.ts
│ │ │ ├── analytics/
│ │ │ │ └── onboardingFunnel.test.ts
│ │ │ ├── bridge/
│ │ │ │ └── nativeEvents.test.ts
│ │ │ ├── client.test.ts
│ │ │ ├── clientMrz.test.ts
│ │ │ ├── components/
│ │ │ │ └── buttons/
│ │ │ │ └── AbstractButton.test.tsx
│ │ │ ├── config.test.ts
│ │ │ ├── data/
│ │ │ │ └── country-data-sync.integration.test.ts
│ │ │ ├── documents/
│ │ │ │ ├── utils.test.ts
│ │ │ │ └── validation.test.ts
│ │ │ ├── errors.test.ts
│ │ │ ├── flows/
│ │ │ │ └── onboarding/
│ │ │ │ └── read-mrz.test.ts
│ │ │ ├── mock/
│ │ │ │ └── generator.test.ts
│ │ │ ├── processing/
│ │ │ │ ├── mrz.test.ts
│ │ │ │ └── nfc.test.ts
│ │ │ ├── provider.test.tsx
│ │ │ ├── proving/
│ │ │ │ ├── actorMock.ts
│ │ │ │ ├── internal/
│ │ │ │ │ ├── payloadGenerator.test.ts
│ │ │ │ │ ├── statusHandlers.test.ts
│ │ │ │ │ ├── statusListener.test.ts
│ │ │ │ │ ├── websocketHandlers.test.ts
│ │ │ │ │ └── websocketUrlResolver.test.ts
│ │ │ │ ├── provingMachine.disclose.stateless.test.ts
│ │ │ │ ├── provingMachine.documentProcessor.test.ts
│ │ │ │ ├── provingMachine.generatePayload.test.ts
│ │ │ │ ├── provingMachine.integration.test.ts
│ │ │ │ ├── provingMachine.startFetchingData.test.ts
│ │ │ │ ├── provingMachine.test.ts
│ │ │ │ └── recoveryValidation.test.ts
│ │ │ ├── setup.ts
│ │ │ ├── stores/
│ │ │ │ └── protocolStore.test.ts
│ │ │ ├── utils/
│ │ │ │ ├── sanitizeErrorMessage.test.ts
│ │ │ │ └── testHelpers.ts
│ │ │ ├── validation/
│ │ │ │ └── document.test.ts
│ │ │ └── webShim.test.ts
│ │ ├── tsconfig.cjs.json
│ │ ├── tsconfig.eslint.json
│ │ ├── tsconfig.json
│ │ ├── tsup.config.ts
│ │ └── vitest.config.ts
│ ├── mobile-sdk-demo/
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── App.tsx
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── build.gradle
│ │ │ │ ├── debug.keystore
│ │ │ │ ├── proguard-rules.pro
│ │ │ │ └── src/
│ │ │ │ ├── debug/
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── selfxyz/
│ │ │ │ │ └── demoapp/
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ └── MainApplication.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── rn_edit_text_material.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ ├── libs.versions.toml
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ └── settings.gradle
│ │ ├── app.json
│ │ ├── babel.config.cjs
│ │ ├── index.js
│ │ ├── ios/
│ │ │ ├── .xcode.env
│ │ │ ├── Podfile
│ │ │ ├── SelfDemoApp/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info-Debug.plist
│ │ │ │ ├── Info.plist
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ └── SelfDemoApp.entitlements
│ │ │ ├── SelfDemoApp.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── SelfDemoApp.xcscheme
│ │ │ │ └── TempProject.xcscheme
│ │ │ ├── SelfDemoApp.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── scripts/
│ │ │ └── pod-install-with-cache-fix.sh
│ │ ├── metro.config.cjs
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── bundle-analyze-ci.cjs
│ │ │ └── e2e-android-ci.sh
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── AlgorithmCountryFields.tsx
│ │ │ │ ├── DocumentScanResultCard.tsx
│ │ │ │ ├── LogsPanel.tsx
│ │ │ │ ├── MenuButton.tsx
│ │ │ │ ├── PickerField.tsx
│ │ │ │ ├── PlaceholderScreen.tsx
│ │ │ │ ├── SafeAreaScrollView.tsx
│ │ │ │ ├── ScreenLayout.tsx
│ │ │ │ ├── SimplePicker.tsx
│ │ │ │ └── StandardHeader.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useDocuments.ts
│ │ │ │ └── useRegistration.ts
│ │ │ ├── lib/
│ │ │ │ └── catalog.ts
│ │ │ ├── navigation/
│ │ │ │ └── NavigationProvider.tsx
│ │ │ ├── polyfills/
│ │ │ │ └── cryptoPolyfill.js
│ │ │ ├── providers/
│ │ │ │ └── SelfClientProvider.tsx
│ │ │ ├── screens/
│ │ │ │ ├── CountrySelection.tsx
│ │ │ │ ├── DocumentCamera.tsx
│ │ │ │ ├── DocumentNFCScan.tsx
│ │ │ │ ├── DocumentScanSuccess.tsx
│ │ │ │ ├── DocumentsList.tsx
│ │ │ │ ├── GenerateMock.tsx
│ │ │ │ ├── HomeScreen.tsx
│ │ │ │ ├── IDSelection.tsx
│ │ │ │ ├── ProofHistory.tsx
│ │ │ │ ├── QRCodeViewFinder.tsx
│ │ │ │ ├── RegisterDocument.tsx
│ │ │ │ └── index.ts
│ │ │ └── utils/
│ │ │ ├── camera.ts
│ │ │ ├── document.ts
│ │ │ ├── documentStore.ts
│ │ │ ├── ethers.ts
│ │ │ └── secureStorage.ts
│ │ ├── tests/
│ │ │ ├── App.test.tsx
│ │ │ ├── __mocks__/
│ │ │ │ └── @selfxyz/
│ │ │ │ └── mobile-sdk-alpha/
│ │ │ │ └── index.ts
│ │ │ ├── components/
│ │ │ │ ├── MenuButton.test.tsx
│ │ │ │ └── ScreenLayout.test.tsx
│ │ │ ├── cryptoPolyfills.test.ts
│ │ │ ├── documentStore.test.ts
│ │ │ ├── e2e/
│ │ │ │ ├── launch.android.flow.yaml
│ │ │ │ └── launch.ios.flow.yaml
│ │ │ ├── lib/
│ │ │ │ └── catalog.test.ts
│ │ │ ├── mocks/
│ │ │ │ ├── mobile-sdk-alpha.ts
│ │ │ │ ├── react-native.ts
│ │ │ │ └── sdk.ts
│ │ │ ├── screens/
│ │ │ │ ├── DocumentCamera.test.tsx
│ │ │ │ ├── DocumentsList.test.tsx
│ │ │ │ ├── GenerateMock.test.tsx
│ │ │ │ ├── HomeScreen.test.tsx
│ │ │ │ ├── ProofHistory.test.tsx
│ │ │ │ ├── QRCodeViewFinder.test.tsx
│ │ │ │ ├── RegisterDocument.test.tsx
│ │ │ │ ├── documentCamera.test.ts
│ │ │ │ └── index.test.ts
│ │ │ ├── secureStorage.test.ts
│ │ │ ├── setup.ts
│ │ │ └── utils/
│ │ │ └── document.test.ts
│ │ ├── tsconfig.json
│ │ ├── types/
│ │ │ ├── reactNativePickerPicker.d.ts
│ │ │ └── svg.d.ts
│ │ └── vitest.config.ts
│ ├── native-shell-android/
│ │ ├── build.gradle.kts
│ │ ├── consumer-rules.pro
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── proguard-rules.pro
│ │ ├── settings.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── kotlin/
│ │ │ └── xyz/
│ │ │ └── self/
│ │ │ └── sdk/
│ │ │ ├── api/
│ │ │ │ ├── SecureStorageProvider.kt
│ │ │ │ ├── SelfSdk.kt
│ │ │ │ ├── SelfSdkConfig.kt
│ │ │ │ └── SelfSdkLaunchConfig.kt
│ │ │ ├── bridge/
│ │ │ │ ├── BridgeHandler.kt
│ │ │ │ ├── BridgeModels.kt
│ │ │ │ └── MessageRouter.kt
│ │ │ ├── handlers/
│ │ │ │ ├── CryptoHandler.kt
│ │ │ │ ├── LifecycleHandler.kt
│ │ │ │ └── SecureStorageHandler.kt
│ │ │ └── webview/
│ │ │ ├── AndroidWebViewHost.kt
│ │ │ ├── RemoteNavigationPolicy.kt
│ │ │ └── SelfVerificationActivity.kt
│ │ └── test/
│ │ └── kotlin/
│ │ └── xyz/
│ │ └── self/
│ │ └── sdk/
│ │ ├── api/
│ │ │ ├── SelfSdkConfigTest.kt
│ │ │ ├── SelfSdkHandleResultTest.kt
│ │ │ └── SelfSdkLaunchTest.kt
│ │ ├── bridge/
│ │ │ ├── BridgeModelsTest.kt
│ │ │ ├── MessageRouterEscapeTest.kt
│ │ │ └── MessageRouterTest.kt
│ │ ├── handlers/
│ │ │ ├── CryptoHandlerTest.kt
│ │ │ ├── LifecycleHandlerTest.kt
│ │ │ ├── LifecycleResultEnvelopeTest.kt
│ │ │ ├── LifecycleResultGateTest.kt
│ │ │ └── SecureStorageHandlerTest.kt
│ │ └── webview/
│ │ ├── AndroidWebViewHostSecurityTest.kt
│ │ └── RemoteNavigationPolicyTest.kt
│ ├── native-shell-ios/
│ │ ├── .swiftlint.yml
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── SelfNativeShell/
│ │ │ ├── API/
│ │ │ │ ├── SecureStorageProvider.swift
│ │ │ │ ├── SelfSdk.swift
│ │ │ │ └── SelfSdkConfig.swift
│ │ │ ├── Bridge/
│ │ │ │ ├── BridgeHandler.swift
│ │ │ │ ├── BridgeModels.swift
│ │ │ │ └── MessageRouter.swift
│ │ │ ├── Handlers/
│ │ │ │ ├── CryptoHandler.swift
│ │ │ │ ├── LifecycleHandler.swift
│ │ │ │ └── SecureStorageHandler.swift
│ │ │ └── WebView/
│ │ │ ├── RemoteNavigationPolicy.swift
│ │ │ └── SelfWebViewHost.swift
│ │ └── Tests/
│ │ └── SelfNativeShellTests/
│ │ ├── BridgeModelsTests.swift
│ │ ├── CryptoHandlerTests.swift
│ │ ├── LifecycleHandlerRaceTests.swift
│ │ ├── LifecycleHandlerTests.swift
│ │ ├── LifecycleResultEnvelopeTests.swift
│ │ ├── MessageRouterEscapeTests.swift
│ │ ├── MessageRouterTests.swift
│ │ ├── RemoteNavigationPolicyTests.swift
│ │ ├── SecureStorageHandlerTests.swift
│ │ ├── SelfSdkConfigTests.swift
│ │ └── SelfWebViewHostTests.swift
│ ├── rn-sdk/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── HANDOFF.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── SelfVerification.tsx
│ │ │ ├── __tests__/
│ │ │ │ ├── BiometricHandler.test.ts
│ │ │ │ ├── CameraHandler.test.ts
│ │ │ │ ├── KeychainHandler.test.ts
│ │ │ │ ├── LifecycleHandler.test.ts
│ │ │ │ ├── MessageRouter.test.ts
│ │ │ │ ├── NfcHandler.test.ts
│ │ │ │ ├── assetBundling.test.ts
│ │ │ │ └── createHandlers.test.ts
│ │ │ ├── bridge/
│ │ │ │ ├── MessageRouter.ts
│ │ │ │ └── types.ts
│ │ │ ├── handlers/
│ │ │ │ ├── BiometricHandler.ts
│ │ │ │ ├── CameraHandler.ts
│ │ │ │ ├── KeychainHandler.ts
│ │ │ │ ├── LifecycleHandler.ts
│ │ │ │ ├── NfcHandler.ts
│ │ │ │ └── index.ts
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ ├── tsup.config.ts
│ │ └── vitest.config.ts
│ ├── rn-sdk-test-app/
│ │ ├── .gitignore
│ │ ├── App.tsx
│ │ ├── Gemfile
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── mrzBridgeContract.test.ts
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── build.gradle
│ │ │ │ ├── debug.keystore
│ │ │ │ ├── proguard-rules.pro
│ │ │ │ └── src/
│ │ │ │ ├── debug/
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── selfxyz/
│ │ │ │ │ └── demoapp/
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ ├── SelfMRZScannerModule.kt
│ │ │ │ │ ├── SelfMRZScannerPackage.kt
│ │ │ │ │ └── SelfMrzScannerActivity.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── rn_edit_text_material.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ └── nfc_tech_filter.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ ├── libs.versions.toml
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ └── settings.gradle
│ │ ├── app.json
│ │ ├── babel.config.cjs
│ │ ├── index.js
│ │ ├── ios/
│ │ │ ├── .xcode.env
│ │ │ ├── Podfile
│ │ │ ├── SelfRNTestApp/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info-Debug.plist
│ │ │ │ ├── Info.plist
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ ├── SelfMRZScannerModule.m
│ │ │ │ ├── SelfMRZScannerModule.swift
│ │ │ │ └── SelfRNTestApp.entitlements
│ │ │ ├── SelfRNTestApp.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── SelfRNTestApp.xcscheme
│ │ │ ├── SelfRNTestApp.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── scripts/
│ │ │ └── pod-install-with-cache-fix.sh
│ │ ├── metro.config.cjs
│ │ ├── package.json
│ │ ├── react-native.config.cjs
│ │ ├── scripts/
│ │ │ └── postinstall.cjs
│ │ └── tsconfig.json
│ ├── sdk-test-app/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── build.gradle.kts
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin/
│ │ │ │ │ └── xyz/
│ │ │ │ │ └── self/
│ │ │ │ │ └── testapp/
│ │ │ │ │ ├── EncryptedPrefsStorageProvider.kt
│ │ │ │ │ └── MainActivity.kt
│ │ │ │ └── res/
│ │ │ │ ├── values/
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── themes.xml
│ │ │ │ └── xml/
│ │ │ │ └── network_security_config.xml
│ │ │ ├── build.gradle.kts
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ └── settings.gradle.kts
│ │ ├── ios/
│ │ │ ├── SelfTestApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AccentColor.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ContentView.swift
│ │ │ │ ├── KeychainStorageProvider.swift
│ │ │ │ └── SelfTestAppApp.swift
│ │ │ └── project.yml
│ │ └── package.json
│ ├── self-sdk-swift/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── SelfSdkSwift/
│ │ │ ├── Constants/
│ │ │ │ └── SdkConstants.swift
│ │ │ ├── Helpers/
│ │ │ │ ├── MrzCameraHelper.swift
│ │ │ │ └── NfcPassportHelper.swift
│ │ │ ├── Providers/
│ │ │ │ ├── BiometricProviderImpl.swift
│ │ │ │ ├── CameraMrzProviderImpl.swift
│ │ │ │ ├── CryptoProviderImpl.swift
│ │ │ │ ├── DocumentsProviderImpl.swift
│ │ │ │ ├── HapticProviderImpl.swift
│ │ │ │ ├── NfcProviderImpl.swift
│ │ │ │ ├── SecureStorageProviderImpl.swift
│ │ │ │ └── WebViewProviderImpl.swift
│ │ │ └── SelfSdkSwift.swift
│ │ └── Tests/
│ │ └── SelfSdkSwiftTests/
│ │ └── WebViewProviderImplTests.swift
│ ├── webview-app/
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── AGENTS.md
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── animations/
│ │ │ │ ├── app-tour-generate.json
│ │ │ │ ├── app-tour-get-started.json
│ │ │ │ ├── app-tour-proof.json
│ │ │ │ ├── app-tour-welcome.json
│ │ │ │ ├── cloud-backup.json
│ │ │ │ ├── proof-progress.json
│ │ │ │ ├── proof-success-check.json
│ │ │ │ ├── proof-success.json
│ │ │ │ ├── push-notification-prompt.json
│ │ │ │ └── scan-bar.json
│ │ │ └── fonts/
│ │ │ ├── Advercase-Regular.otf
│ │ │ ├── DINOT-Bold.otf
│ │ │ ├── DINOT-Medium.otf
│ │ │ └── IBMPlexMono-Regular.otf
│ │ ├── src/
│ │ │ ├── App.tsx
│ │ │ ├── components/
│ │ │ │ ├── DevRouteMenu.tsx
│ │ │ │ ├── MockRegistrationFailureButton.tsx
│ │ │ │ └── PasswordGate.tsx
│ │ │ ├── data/
│ │ │ │ └── country-document-types.json
│ │ │ ├── fonts.css
│ │ │ ├── main.tsx
│ │ │ ├── providers/
│ │ │ │ ├── BridgeProvider.tsx
│ │ │ │ ├── SelfClientProvider.tsx
│ │ │ │ └── VerificationRequestProvider.tsx
│ │ │ ├── recovery.css
│ │ │ ├── reset.css
│ │ │ ├── screens/
│ │ │ │ ├── ComingSoonScreen.tsx
│ │ │ │ ├── account/
│ │ │ │ │ ├── DevModeScreen.tsx
│ │ │ │ │ ├── NotificationPreferencesScreen.tsx
│ │ │ │ │ ├── SecurityScreen.tsx
│ │ │ │ │ └── SettingsScreen.tsx
│ │ │ │ ├── debug/
│ │ │ │ │ └── KeychainDebugScreen.tsx
│ │ │ │ ├── home/
│ │ │ │ │ ├── HomeScreen.tsx
│ │ │ │ │ ├── IDDataScreen.tsx
│ │ │ │ │ └── ManageDocumentsScreen.tsx
│ │ │ │ ├── onboarding/
│ │ │ │ │ ├── ConfirmIdentificationScreen.tsx
│ │ │ │ │ ├── ConflictDetectedScreen.tsx
│ │ │ │ │ ├── CountryPickerScreen.tsx
│ │ │ │ │ ├── IDSelectionScreen.tsx
│ │ │ │ │ ├── KycFailureScreen.tsx
│ │ │ │ │ ├── ProviderLaunchScreen.tsx
│ │ │ │ │ ├── ProviderResultScreen.tsx
│ │ │ │ │ ├── PushNotificationPromptScreen.tsx
│ │ │ │ │ ├── RegistrationFailureScreen.tsx
│ │ │ │ │ ├── ScanSuccessScreen.tsx
│ │ │ │ │ ├── SocialSignOnMethodPickerScreen.tsx
│ │ │ │ │ ├── SocialSignOnPickerScreen.tsx
│ │ │ │ │ └── TourScreen.tsx
│ │ │ │ ├── proving/
│ │ │ │ │ ├── DialogueWithCtaScreen.tsx
│ │ │ │ │ ├── DiscloseResultScreen.tsx
│ │ │ │ │ ├── KycPendingScreen.tsx
│ │ │ │ │ ├── KycSuccessScreen.tsx
│ │ │ │ │ ├── ProofGenerationDialogueScreen.tsx
│ │ │ │ │ ├── ProofGenerationRouteScreen.tsx
│ │ │ │ │ ├── ProofGenerationSuccessScreen.tsx
│ │ │ │ │ ├── ProofHistoryScreen.tsx
│ │ │ │ │ ├── ProofRequestReceiptScreen.tsx
│ │ │ │ │ ├── ProofSuccessBackupScreen.tsx
│ │ │ │ │ ├── ProvingScreen.tsx
│ │ │ │ │ ├── SimpleDialogueScreen.tsx
│ │ │ │ │ └── VerificationResultScreen.tsx
│ │ │ │ ├── recovery/
│ │ │ │ │ ├── BackupMethodPickerScreen.tsx
│ │ │ │ │ ├── LaunchRecoveryScreen.tsx
│ │ │ │ │ ├── RecoveryFailureScreen.tsx
│ │ │ │ │ ├── RecoveryPhraseScreen.tsx
│ │ │ │ │ ├── RecoverySuccessScreen.tsx
│ │ │ │ │ └── SecretPhraseInputScreen.tsx
│ │ │ │ └── tunnel/
│ │ │ │ ├── TourScreen.tsx
│ │ │ │ ├── TunnelCountryPickerScreen.tsx
│ │ │ │ ├── TunnelDiscloseScreen.tsx
│ │ │ │ ├── TunnelIDTypeScreen.tsx
│ │ │ │ ├── TunnelKycFailureScreen.tsx
│ │ │ │ ├── TunnelKycPendingScreen.tsx
│ │ │ │ ├── TunnelKycSuccessScreen.tsx
│ │ │ │ ├── TunnelKycWrapper.tsx
│ │ │ │ ├── TunnelProofReceiptScreen.tsx
│ │ │ │ ├── TunnelProvingScreen.tsx
│ │ │ │ ├── TunnelRecoveryRequiredScreen.tsx
│ │ │ │ └── TunnelResultScreen.tsx
│ │ │ ├── test/
│ │ │ │ └── sri.test.ts
│ │ │ ├── types/
│ │ │ │ └── kycProvider.ts
│ │ │ └── utils/
│ │ │ ├── buildKycDocument.ts
│ │ │ ├── countryFlags.tsx
│ │ │ ├── insets.ts
│ │ │ ├── kycAttestation.ts
│ │ │ ├── kycProvider.ts
│ │ │ ├── mockDocumentStore.ts
│ │ │ ├── mockOnboardingFlow.ts
│ │ │ ├── provingUtils.test.ts
│ │ │ ├── provingUtils.ts
│ │ │ ├── secretManager.ts
│ │ │ ├── selfAppContext.ts
│ │ │ ├── verificationRequest.test.ts
│ │ │ └── verificationRequest.ts
│ │ ├── tests/
│ │ │ ├── components/
│ │ │ │ └── PasswordGate.test.tsx
│ │ │ ├── screens/
│ │ │ │ ├── ComingSoonScreen.test.tsx
│ │ │ │ ├── account/
│ │ │ │ │ └── settingsScreens.test.tsx
│ │ │ │ ├── home/
│ │ │ │ │ └── homeSupportScreens.test.tsx
│ │ │ │ ├── onboarding/
│ │ │ │ │ └── registrationPrompts.test.tsx
│ │ │ │ ├── proving/
│ │ │ │ │ └── provingSupportScreens.test.tsx
│ │ │ │ ├── recovery/
│ │ │ │ │ ├── recoveryPhraseScreen.test.tsx
│ │ │ │ │ ├── recoverySupportScreens.test.tsx
│ │ │ │ │ └── secretPhraseInputScreen.test.tsx
│ │ │ │ └── tunnel/
│ │ │ │ └── tunnelFlowScreens.test.tsx
│ │ │ └── utils/
│ │ │ └── secretManager.test.ts
│ │ ├── tsconfig.json
│ │ ├── vercel.json
│ │ ├── vite-env.d.ts
│ │ └── vite.config.ts
│ └── webview-bridge/
│ ├── .eslintrc.cjs
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── package.json
│ ├── src/
│ │ ├── __tests__/
│ │ │ ├── adapters.test.ts
│ │ │ ├── analytics-web.test.ts
│ │ │ ├── bridge.test.ts
│ │ │ ├── documents-web.test.ts
│ │ │ ├── helpers/
│ │ │ │ └── mockWindow.ts
│ │ │ └── schema.test.ts
│ │ ├── adapters/
│ │ │ ├── analytics.ts
│ │ │ ├── auth.ts
│ │ │ ├── biometrics.ts
│ │ │ ├── camera.ts
│ │ │ ├── crypto.ts
│ │ │ ├── documents.ts
│ │ │ ├── haptic.ts
│ │ │ ├── index.ts
│ │ │ ├── keychain-documents.ts
│ │ │ ├── lifecycle.ts
│ │ │ ├── navigation.ts
│ │ │ ├── nfc-scanner.ts
│ │ │ ├── sdk-adapter-map.ts
│ │ │ └── storage.ts
│ │ ├── bridge.ts
│ │ ├── index.ts
│ │ ├── mock.ts
│ │ ├── schema.ts
│ │ └── types.ts
│ ├── tsconfig.json
│ └── tsup.config.ts
├── patches/
│ ├── @turnkey+core+1.7.0.patch
│ ├── react-native-gesture-handler+2.22.1.patch
│ ├── react-native-keychain+10.0.0.patch
│ ├── react-native-passport-reader+1.0.3.patch
│ └── react-native-svg+15.14.0.patch
├── purple/
│ ├── business/
│ │ ├── core-value-prop.md
│ │ ├── general-description.md
│ │ └── pricing-model.md
│ ├── crypto/
│ │ ├── sdk-architecture.md
│ │ ├── smart-contracts.md
│ │ └── zk-circuits.md
│ ├── frontend/
│ │ ├── components.md
│ │ ├── responsiveness.md
│ │ └── styling.md
│ ├── global/
│ │ ├── authentication.md
│ │ ├── code-style.md
│ │ ├── database.md
│ │ ├── external-services.md
│ │ ├── how-agents-document.md
│ │ ├── tech-stack.md
│ │ └── testing.md
│ ├── mobile/
│ │ ├── native-platforms.md
│ │ ├── nfc-biometrics.md
│ │ └── security-storage.md
│ └── temp/
│ └── codebase-analysis.md
├── scripts/
│ ├── audit/
│ │ └── tech-debt-baseline.mjs
│ ├── build-webview-bundle.sh
│ ├── check-duplicate-headers.cjs
│ ├── check-license-headers.mjs
│ ├── check-package-versions.mjs
│ ├── docstring-report.ts
│ ├── kmp-start.sh
│ ├── lint-headers.cjs
│ ├── migrate-license-headers.mjs
│ ├── reinstall-app.sh
│ ├── run-patch-package.cjs
│ └── tests/
│ ├── .gitignore
│ ├── checkLicenseHeaders.test.mjs
│ ├── checkPackageVersions.test.mjs
│ └── package.json
├── sdk/
│ ├── core/
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── README.md
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ └── copyAbi.sh
│ │ ├── src/
│ │ │ ├── SelfBackendVerifier.ts
│ │ │ ├── abi/
│ │ │ │ ├── AadhaarVerifier.json
│ │ │ │ ├── IdentityVerificationHubImpl.json
│ │ │ │ ├── KycVerifier.json
│ │ │ │ ├── Registry.json
│ │ │ │ └── Verifier.json
│ │ │ ├── errors/
│ │ │ │ ├── ProofError.ts
│ │ │ │ ├── RegistryContractError.ts
│ │ │ │ ├── VerifierContractError.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── store/
│ │ │ │ ├── DefaultConfigStore.ts
│ │ │ │ ├── InMemoryConfigStore.ts
│ │ │ │ └── interface.ts
│ │ │ ├── types/
│ │ │ │ └── types.ts
│ │ │ └── utils/
│ │ │ ├── constants.ts
│ │ │ ├── hash.ts
│ │ │ ├── id.ts
│ │ │ ├── proof.ts
│ │ │ └── utils.ts
│ │ ├── tests/
│ │ │ ├── proof.test.ts
│ │ │ └── verifierErrors.test.ts
│ │ └── tsconfig.json
│ ├── qrcode/
│ │ ├── .eslintrc.cjs
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── .size-limit.json
│ │ ├── README.md
│ │ ├── animations/
│ │ │ ├── index.ts
│ │ │ ├── status-connecting.json
│ │ │ ├── status-error.json
│ │ │ ├── status-failed.json
│ │ │ └── status-success.json
│ │ ├── components/
│ │ │ ├── QRCode.tsx
│ │ │ ├── SelfQRcode.tsx
│ │ │ └── StatusBanner.tsx
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── postBuild.mjs
│ │ │ └── shimConfigs.js
│ │ ├── tsconfig.cjs.json
│ │ ├── tsconfig.json
│ │ ├── tsconfig.react.json
│ │ ├── tsup.config.ts
│ │ ├── types/
│ │ │ └── svg.d.ts
│ │ └── utils/
│ │ ├── styles.ts
│ │ ├── utils.ts
│ │ └── websocket.ts
│ ├── qrcode-angular/
│ │ ├── .eslintrc.json
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── README.md
│ │ ├── angular.json
│ │ ├── karma.conf.js
│ │ ├── ng-package.json
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── lib/
│ │ │ │ ├── common.ts
│ │ │ │ ├── components/
│ │ │ │ │ ├── animations/
│ │ │ │ │ │ ├── check_animation.json
│ │ │ │ │ │ └── x_animation.json
│ │ │ │ │ ├── led/
│ │ │ │ │ │ └── led.component.ts
│ │ │ │ │ └── self-qrcode/
│ │ │ │ │ ├── self-qrcode.component.css
│ │ │ │ │ ├── self-qrcode.component.html
│ │ │ │ │ └── self-qrcode.component.ts
│ │ │ │ ├── providers.ts
│ │ │ │ ├── services/
│ │ │ │ │ └── websocket.service.ts
│ │ │ │ └── utils/
│ │ │ │ ├── styles.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── websocket.ts
│ │ │ ├── public-api.ts
│ │ │ └── styles.css
│ │ ├── tsconfig.json
│ │ ├── tsconfig.lib.json
│ │ ├── tsconfig.lib.prod.json
│ │ ├── tsconfig.spec.json
│ │ └── validate-build.cjs
│ ├── sdk-common/
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── tsconfig.cjs.json
│ │ └── tsconfig.json
│ └── sdk-go/
│ ├── InMemoryConfigStore.go
│ ├── LICENSE
│ ├── README.md
│ ├── common/
│ │ ├── constants.go
│ │ ├── customHash.go
│ │ └── utils.go
│ ├── config.go
│ ├── contracts/
│ │ ├── abi/
│ │ │ ├── AadhaarVerifier.abi
│ │ │ ├── IdentityVerificationHubImpl.abi
│ │ │ ├── Registry.abi
│ │ │ └── Verifier.abi
│ │ └── bindings/
│ │ ├── AadhaarVerifier.go
│ │ ├── IdentityVerificationHubImpl.go
│ │ ├── Registry.go
│ │ └── Verifier.go
│ ├── go.mod
│ ├── go.sum
│ ├── sdk.go
│ ├── test/
│ │ └── selfBackendVerifier_test.go
│ ├── types.go
│ ├── utils.go
│ └── verifier.go
└── specs/
├── ARCHIVE.md
├── README.md
├── archive/
│ ├── CI-COVERAGE-GAPS.md
│ ├── EUCLID-WEB-CONSOLIDATION.md
│ ├── IOS-CRASH-FIX.md
│ ├── LOTTIE-DOTLOTTIE-REVIEW.md
│ ├── PROJECT-RULES.md
│ ├── SECURITY-HARDENING.md
│ ├── SPEC-GUIDE.md
│ ├── SPECS-REORG-PLAN.md
│ ├── kmp/
│ │ ├── ARCHITECTURE.md
│ │ ├── INDEX.md
│ │ ├── INITIATIVE.md
│ │ └── REORG-PLAN.md
│ └── sdk/
│ ├── SPEC-AGENT-OPTIMIZATION.md
│ ├── SPEC-MRZ-CONSOLIDATION.md
│ └── SPEC-TEST-APP-CAMERA.md
├── framework/
│ ├── PRODUCT-SPEC-ENHANCEMENT-PROMPT.md
│ ├── SPEC-EXECUTION-MODEL.md
│ └── TEMPLATES.md
└── projects/
└── sdk/
├── INDEX.md
├── OVERVIEW.md
├── paused/
│ ├── INDEX.md
│ ├── integrations/
│ │ ├── SPEC.md
│ │ └── plans/
│ │ ├── IN-01-sample-polish-and-error-handling.md
│ │ └── IN-02-sample-physical-device-validation.md
│ ├── native-consolidation/
│ │ ├── CONTRACTS.md
│ │ ├── PLAN.md
│ │ ├── SPEC.md
│ │ └── plans/
│ │ ├── NC-01-phase-0-safety-rails.md
│ │ ├── NC-02-phase-1-mrz-unification.md
│ │ ├── NC-03-phase-2-passport-reader-parity.md
│ │ ├── NC-04-phase-3-shim-cleanup.md
│ │ ├── NC-05-phase-4-deletions-and-guardrails.md
│ │ └── NC-06-external-mrz-nfc-inventory.md
│ ├── native-shells/
│ │ ├── SPEC.md
│ │ └── plans/
│ │ ├── NS-01-physical-device-validation.md
│ │ ├── NS-03-publishing-readiness.md
│ │ ├── NS-04-apdu-allowlist.md
│ │ ├── NS-05-lifecycle-handler-semantics.md
│ │ ├── NS-06-kmp-callback-contract-alignment.md
│ │ ├── NS-08-ship-artifacts-to-minipay.md
│ │ └── NS-09-nfcpassportreader-distribution.md
│ └── rn-sdk/
│ ├── SPEC.md
│ └── plans/
│ ├── RN-01-self-wallet-integration-validation.md
│ ├── RN-02-npm-publishing-readiness.md
│ └── RN-03-nfc-hardening.md
└── workstreams/
├── analytics/
│ ├── SPEC.md
│ └── plans/
│ └── ANA-01-canonical-onboarding-funnel.md
├── build-pipeline/
│ ├── SPEC.md
│ └── plans/
│ └── BP-01-build-script.md
├── kmp-revival/
│ ├── SPEC.md
│ └── plans/
│ ├── KR-01-android-parity.md
│ ├── KR-02-ios-parity.md
│ └── KR-03-validate-and-publish.md
├── native-hardware-handlers/
│ └── SPEC.md
├── native-shells-lite/
│ ├── SPEC.md
│ └── plans/
│ ├── NSL-01-android-shell.md
│ ├── NSL-02-ios-shell.md
│ ├── NSL-03-test-apps.md
│ └── NSL-04-delegate-keychain.md
├── sdk-core/
│ ├── SPEC.md
│ └── plans/
│ ├── SC-01-fallback-adapter-dedup.md
│ ├── SC-02-crypto-bridge-surface.md
│ └── SC-03-selfclient-adapter-assembly.md
├── sdk-distribution/
│ ├── SPEC.md
│ └── plans/
│ ├── SD-01-android-hosted-url.md
│ ├── SD-02-ios-hosted-url.md
│ ├── SD-03-hosting-setup.md
│ ├── SD-04-android-maven-publishing.md
│ ├── SD-05-ios-spm-publishing.md
│ └── SD-06-kmp-remote-publishing.md
└── webview/
├── INDEX.md
├── SCREEN-INVENTORY.md
├── SPEC.md
├── TICKET-PLAN.md
└── plans/
├── SELF-2504-onboarding-recovery-phrase.md
├── WV-01-dynamic-proof-request-items.md
├── WV-02-kyc-provider-contract.md
├── WV-03-remove-native-scan-assumptions.md
├── WV-04-host-callback-contract.md
├── WV-05-kyc-provider-sdk.md
├── WV-06-kyc-result-flow.md
├── WV-07-selfclient-proving-assembly.md
├── WV-08-tunnel-proving-flow.md
├── WV-09-registration-core.md
├── WV-10-eu-id-helper-flow.md
├── WV-11-disclose-core.md
├── WV-12-registration-prompts.md
└── WV-17-recovery-phrase-restore-flow.md
SYMBOL INDEX (1856 symbols across 416 files)
FILE: app/App.tsx
constant TURNKEY_CALLBACKS (line 46) | const TURNKEY_CALLBACKS: TurnkeyCallbacks = {
constant TURNKEY_CONFIG (line 65) | const TURNKEY_CONFIG: TurnkeyProviderConfig = {
function App (line 90) | function App(): React.JSX.Element {
FILE: app/android/app/src/main/java/com/proofofpassportapp/CameraActivityPackage.java
class CameraActivityPackage (line 15) | public class CameraActivityPackage implements ReactPackage {
method createViewManagers (line 17) | @Override
method createNativeModules (line 24) | @Override
FILE: app/android/app/src/main/java/com/proofofpassportapp/PhotoPickerActivity.java
class PhotoPickerActivity (line 16) | public class PhotoPickerActivity extends AppCompatActivity {
method onCreate (line 24) | @Override
method launchPhotoPicker (line 37) | private void launchPhotoPicker() {
method handlePhotoPickerResult (line 54) | private void handlePhotoPickerResult(Uri selectedUri) {
method finishWithResult (line 64) | private void finishWithResult(Uri selectedUri) {
method finishWithError (line 71) | private void finishWithError(String errorMessage) {
FILE: app/android/app/src/main/java/com/proofofpassportapp/QRCodeScannerModule.java
class QRCodeScannerModule (line 30) | public class QRCodeScannerModule extends ReactContextBaseJavaModule impl...
method onActivityResult (line 40) | @Override
method QRCodeScannerModule (line 79) | public QRCodeScannerModule(ReactApplicationContext reactContext) {
method getName (line 86) | @NonNull
method scanQRCode (line 92) | @ReactMethod
method scanQRCodeFromPhotoLibrary (line 112) | @ReactMethod
method startQRScanner (line 153) | private void startQRScanner(Activity activity) {
method processImageForQRCode (line 158) | private void processImageForQRCode(Uri imageUri) {
method onRequestPermissionsResult (line 217) | public void onRequestPermissionsResult(int requestCode, String[] permi...
method onHostResume (line 234) | @Override
method onHostPause (line 238) | @Override
method onHostDestroy (line 242) | @Override
FILE: app/android/app/src/main/java/com/proofofpassportapp/QRCodeScannerPackage.java
class QRCodeScannerPackage (line 14) | public class QRCodeScannerPackage implements ReactPackage {
method createViewManagers (line 15) | @Override
method createNativeModules (line 22) | @Override
FILE: app/android/app/src/release/java/com/awesomeproject/ReactNativeFlipper.java
class ReactNativeFlipper (line 16) | public class ReactNativeFlipper {
method initializeFlipper (line 17) | public static void initializeFlipper(Context context, ReactInstanceMan...
FILE: app/babel.config.cjs
function rewriteDunderRequire (line 9) | function rewriteDunderRequire() {
FILE: app/docs/examples/tree-shaking/granular-circuits-example.ts
function exampleCircuitUsage (line 11) | function exampleCircuitUsage(passportData: PassportData) {
FILE: app/docs/examples/tree-shaking/level2-optimal-example.ts
function optimalLevel2Example (line 18) | function optimalLevel2Example(data: PassportData) {
FILE: app/docs/examples/tree-shaking/level3-migration-guide.ts
function certificateParserOptimalImports (line 55) | function certificateParserOptimalImports() {
function circuitWorkerOptimalImports (line 68) | function circuitWorkerOptimalImports() {
function frontendOptimalImports (line 82) | function frontendOptimalImports() {
function mockDataOptimalImports (line 94) | function mockDataOptimalImports() {
FILE: app/docs/examples/tree-shaking/level3-optimal-example.ts
function optimalLevel3Example (line 27) | function optimalLevel3Example(data: PassportData, secret: string) {
FILE: app/docs/examples/tree-shaking/optimal-pattern-example.ts
function processPassportData (line 17) | function processPassportData(passportData: PassportData): {
FILE: app/env.ts
constant DEFAULT_DOB (line 5) | const DEFAULT_DOB = undefined;
constant DEFAULT_DOE (line 7) | const DEFAULT_DOE = undefined;
constant DEFAULT_PNUMBER (line 9) | const DEFAULT_PNUMBER = undefined;
constant ENABLE_DEBUG_LOGS (line 11) | const ENABLE_DEBUG_LOGS = process.env.ENABLE_DEBUG_LOGS === 'true';
constant GOOGLE_SIGNIN_ANDROID_CLIENT_ID (line 13) | const GOOGLE_SIGNIN_ANDROID_CLIENT_ID =
constant GOOGLE_SIGNIN_IOS_CLIENT_ID (line 16) | const GOOGLE_SIGNIN_IOS_CLIENT_ID =
constant GOOGLE_SIGNIN_WEB_CLIENT_ID (line 19) | const GOOGLE_SIGNIN_WEB_CLIENT_ID =
constant GRAFANA_LOKI_PASSWORD (line 22) | const GRAFANA_LOKI_PASSWORD = process.env.GRAFANA_LOKI_PASSWORD;
constant GRAFANA_LOKI_URL (line 23) | const GRAFANA_LOKI_URL = process.env.GRAFANA_LOKI_URL;
constant GRAFANA_LOKI_USERNAME (line 24) | const GRAFANA_LOKI_USERNAME = process.env.GRAFANA_LOKI_USERNAME;
constant IS_TEST_BUILD (line 29) | const IS_TEST_BUILD = process.env.IS_TEST_BUILD === 'true';
constant KYC_TEE_URL (line 31) | const KYC_TEE_URL = process.env.KYC_TEE_URL || 'http://localhost:8080';
constant MIXPANEL_NFC_PROJECT_TOKEN (line 32) | const MIXPANEL_NFC_PROJECT_TOKEN = undefined;
constant SEGMENT_KEY (line 33) | const SEGMENT_KEY = process.env.SEGMENT_KEY;
constant SENTRY_DSN (line 34) | const SENTRY_DSN = process.env.SENTRY_DSN;
constant TURNKEY_AUTH_PROXY_CONFIG_ID (line 36) | const TURNKEY_AUTH_PROXY_CONFIG_ID =
constant TURNKEY_GOOGLE_CLIENT_ID (line 38) | const TURNKEY_GOOGLE_CLIENT_ID = process.env.TURNKEY_GOOGLE_CLIENT_ID;
constant TURNKEY_ORGANIZATION_ID (line 39) | const TURNKEY_ORGANIZATION_ID = process.env.TURNKEY_ORGANIZATION_ID;
FILE: app/fastlane/helpers.rb
type Fastlane (line 18) | module Fastlane
type Helpers (line 19) | module Helpers
FILE: app/fastlane/helpers/android.rb
type Fastlane (line 3) | module Fastlane
type Helpers (line 4) | module Helpers
type Android (line 5) | module Android
function set_permissions (line 8) | def self.set_permissions(value)
function android_create_keystore (line 13) | def android_create_keystore(path)
function android_create_play_store_key (line 22) | def android_create_play_store_key(path)
function android_verify_version_code (line 36) | def android_verify_version_code(gradle_file)
function android_increment_version_code (line 71) | def android_increment_version_code(gradle_file)
FILE: app/fastlane/helpers/common.rb
type Fastlane (line 3) | module Fastlane
type Helpers (line 4) | module Helpers
type Common (line 5) | module Common
function is_ci_environment? (line 7) | def is_ci_environment?
function dev_load_dotenv_secrets (line 12) | def dev_load_dotenv_secrets
function report_error (line 20) | def report_error(message, suggestion = nil, abort_message = nil)
function report_success (line 27) | def report_success(message)
function verify_env_vars (line 32) | def verify_env_vars(required_vars)
function should_upload_app (line 46) | def should_upload_app(platform)
function with_retry (line 52) | def with_retry(max_retries: 3, delay: 5)
function log_keychain_diagnostics (line 80) | def log_keychain_diagnostics(certificate_name)
FILE: app/fastlane/helpers/ios.rb
type Fastlane (line 3) | module Fastlane
type Helpers (line 4) | module Helpers
type IOS (line 5) | module IOS
function ios_verify_app_store_build_number (line 7) | def ios_verify_app_store_build_number(xcodeproj)
function ios_ensure_generic_versioning (line 38) | def ios_ensure_generic_versioning(xcodeproj)
function ios_connect_api_key (line 52) | def ios_connect_api_key
function ios_increment_build_number (line 62) | def ios_increment_build_number(xcodeproj)
function ios_dev_setup_certificate (line 82) | def ios_dev_setup_certificate
function ios_dev_setup_connect_api_key (line 99) | def ios_dev_setup_connect_api_key(path)
function ios_dev_setup_provisioning_profile (line 112) | def ios_dev_setup_provisioning_profile(dir)
function ios_verify_provisioning_profile (line 140) | def ios_verify_provisioning_profile
FILE: app/fastlane/helpers/slack.rb
type Fastlane (line 3) | module Fastlane
type Helpers (line 4) | module Helpers
type Slack (line 5) | module Slack
function upload_file_to_slack (line 7) | def upload_file_to_slack(file_path:, channel_id:, initial_comment:...
function request_upload_url (line 30) | def request_upload_url(slack_token, file_name, file_size)
function upload_file_content (line 56) | def upload_file_content(upload_url, file_path, file_size)
function complete_upload (line 76) | def complete_upload(slack_token, file_id, file_title, channel_id, ...
FILE: app/fastlane/helpers/version_manager.rb
type Fastlane (line 6) | module Fastlane
type Helpers (line 7) | module Helpers
type VersionManager (line 8) | module VersionManager
function read_version_file (line 13) | def read_version_file
function write_version_file (line 23) | def write_version_file(data)
function get_current_version (line 30) | def get_current_version
function get_ios_build_number (line 37) | def get_ios_build_number
function get_android_build_number (line 42) | def get_android_build_number
function bump_local_build_number (line 47) | def bump_local_build_number(platform)
function verify_ci_version_match (line 61) | def verify_ci_version_match
function update_deployment_timestamp (line 110) | def update_deployment_timestamp(platform)
function sync_build_numbers_to_native (line 124) | def sync_build_numbers_to_native
FILE: app/fastlane/test/app_name_test.rb
class AppNameTest (line 9) | class AppNameTest < Minitest::Test
method setup (line 10) | def setup
method teardown (line 15) | def teardown
method write_app_json (line 21) | def write_app_json(content)
method evaluate_app_name (line 25) | def evaluate_app_name
method test_env_variable_precedence (line 38) | def test_env_variable_precedence
method test_display_name_from_app_json (line 43) | def test_display_name_from_app_json
method test_default_when_app_json_missing_or_malformed (line 49) | def test_default_when_app_json_missing_or_malformed
FILE: app/fastlane/test/helpers_test.rb
class HelpersTest (line 6) | class HelpersTest < Minitest::Test
method setup (line 7) | def setup
method teardown (line 18) | def teardown
method test_android_increment_version_code (line 26) | def test_android_increment_version_code
method test_should_upload_app (line 32) | def test_should_upload_app
method test_should_upload_app_with_ci (line 45) | def test_should_upload_app_with_ci
method test_should_upload_app_with_act_or_is_pr (line 53) | def test_should_upload_app_with_act_or_is_pr
method test_should_upload_app_with_invalid_platform (line 62) | def test_should_upload_app_with_invalid_platform
method test_is_ci_environment_true_conditions (line 68) | def test_is_ci_environment_true_conditions
method test_is_ci_environment_false_with_act (line 74) | def test_is_ci_environment_false_with_act
method test_is_ci_environment_false_without_ci (line 80) | def test_is_ci_environment_false_without_ci
method test_is_ci_environment_false_with_ci_false (line 86) | def test_is_ci_environment_false_with_ci_false
method test_android_create_keystore_success (line 93) | def test_android_create_keystore_success
method test_android_create_keystore_missing_env (line 107) | def test_android_create_keystore_missing_env
method test_android_create_keystore_creates_directory (line 113) | def test_android_create_keystore_creates_directory
method test_android_create_play_store_key_success (line 127) | def test_android_create_play_store_key_success
method test_android_create_play_store_key_missing_env (line 141) | def test_android_create_play_store_key_missing_env
method test_android_increment_version_code_different_formats (line 148) | def test_android_increment_version_code_different_formats
method test_android_increment_version_code_no_permissions (line 173) | def test_android_increment_version_code_no_permissions
method test_android_increment_version_code_missing_file (line 185) | def test_android_increment_version_code_missing_file
method test_android_verify_version_code_parsing_logic (line 195) | def test_android_verify_version_code_parsing_logic
method test_android_verify_version_code_missing_version_code_line (line 221) | def test_android_verify_version_code_missing_version_code_line
method test_android_verify_version_code_invalid_format (line 234) | def test_android_verify_version_code_invalid_format
method test_with_retry_success_first_attempt (line 260) | def test_with_retry_success_first_attempt
method test_with_retry_success_after_failures (line 271) | def test_with_retry_success_after_failures
method test_with_retry_max_retries_exceeded (line 283) | def test_with_retry_max_retries_exceeded
method test_with_retry_custom_parameters (line 295) | def test_with_retry_custom_parameters
method test_verify_env_vars_all_present (line 309) | def test_verify_env_vars_all_present
method test_verify_env_vars_some_missing (line 320) | def test_verify_env_vars_some_missing
method test_upload_file_to_slack_missing_channel (line 333) | def test_upload_file_to_slack_missing_channel
method test_upload_file_to_slack_missing_token (line 347) | def test_upload_file_to_slack_missing_token
method test_slack_deploy_source_messages (line 360) | def test_slack_deploy_source_messages
method clear_test_env_vars (line 386) | def clear_test_env_vars
FILE: app/jest.setup.js
method NativeModules (line 99) | get NativeModules() {
function MockNativeEventEmitter (line 497) | function MockNativeEventEmitter(nativeModule) {
method constructor (line 772) | constructor() {
method readAsArrayBuffer (line 775) | readAsArrayBuffer() {
method constructor (line 827) | constructor() {}
class MockUploader (line 1025) | class MockUploader {
method setData (line 1026) | setData() {
method setDataMimeType (line 1029) | setDataMimeType() {
method setRequestBody (line 1032) | setRequestBody() {
class MockFiles (line 1038) | class MockFiles {
method newMultipartUploader (line 1039) | newMultipartUploader() {
class GDrive (line 1047) | class GDrive {
class MockReactNativeBiometrics (line 1232) | class MockReactNativeBiometrics {
method constructor (line 1233) | constructor(options) {
FILE: app/scripts/alias-imports.cjs
function determineAliasStrategy (line 8) | function determineAliasStrategy(dir, abs, baseDir, baseAlias) {
function transformProjectToAliasImports (line 13) | function transformProjectToAliasImports(project, appRootPath) {
function runAliasImportsTransform (line 199) | function runAliasImportsTransform(options = {}) {
FILE: app/scripts/analyze-tree-shaking.cjs
function formatBytes (line 10) | function formatBytes(bytes) {
function analyzeWebBundle (line 17) | function analyzeWebBundle() {
function analyzeReactNativeBundle (line 131) | function analyzeReactNativeBundle(platform) {
function categorizeImports (line 163) | function categorizeImports(imports) {
function compareImportPatterns (line 260) | function compareImportPatterns() {
function main (line 586) | function main() {
FILE: app/scripts/bundle-analyze-ci.cjs
constant BUNDLE_THRESHOLDS_MB (line 18) | const BUNDLE_THRESHOLDS_MB = {
function formatBytes (line 23) | function formatBytes(bytes) {
function checkBundleSize (line 30) | function checkBundleSize(bundleSize, targetPlatform) {
FILE: app/scripts/capture-ios-crash-artifacts.cjs
constant APP_NAME (line 10) | const APP_NAME = process.env.IOS_CRASH_CAPTURE_APP_NAME || 'OpenPassport';
constant WINDOW_MINUTES (line 11) | const WINDOW_MINUTES = process.env.IOS_CRASH_CAPTURE_WINDOW_MINUTES || '5';
constant OUTPUT_ROOT (line 12) | const OUTPUT_ROOT =
constant DERIVED_DATA_ROOT (line 15) | const DERIVED_DATA_ROOT = path.join(
constant DIAGNOSTIC_REPORTS_DIR (line 22) | const DIAGNOSTIC_REPORTS_DIR = path.join(
function timestamp (line 29) | function timestamp() {
function ensureDir (line 33) | function ensureDir(directory) {
function runCommand (line 37) | function runCommand(command, args, options = {}) {
function writeFile (line 44) | function writeFile(filePath, contents) {
function copyFileIfPresent (line 48) | function copyFileIfPresent(sourcePath, destinationPath) {
function getLatestLaunchResult (line 54) | function getLatestLaunchResult() {
function getRecentDiagnosticReports (line 107) | function getRecentDiagnosticReports() {
function captureUnifiedLog (line 133) | function captureUnifiedLog(outputDir) {
function captureDiagnosticReports (line 152) | function captureDiagnosticReports(outputDir) {
function captureLatestLaunchResult (line 168) | function captureLatestLaunchResult(outputDir) {
function main (line 198) | function main() {
FILE: app/scripts/check-test-requires.cjs
constant TESTS_DIR (line 16) | const TESTS_DIR = path.join(__dirname, '..', 'tests');
constant FORBIDDEN_PATTERNS (line 17) | const FORBIDDEN_PATTERNS = [
function findTestFiles (line 33) | function findTestFiles(dir, files = []) {
function checkFile (line 65) | function checkFile(filePath) {
function main (line 92) | function main() {
FILE: app/scripts/cleanup-private-modules.cjs
function cleanupPrivateModules (line 11) | function cleanupPrivateModules() {
FILE: app/scripts/find-type-import-issues.mjs
constant PATTERNS (line 23) | const PATTERNS = {
constant SCAN_DIRS (line 41) | const SCAN_DIRS = ['src', 'tests/src', 'scripts'];
constant SCAN_EXTENSIONS (line 44) | const SCAN_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
constant IGNORE_DIRS (line 47) | const IGNORE_DIRS = [
constant IGNORE_FILES (line 58) | const IGNORE_FILES = [
function shouldIgnoreFile (line 62) | function shouldIgnoreFile(filePath) {
function shouldIgnoreFileByName (line 66) | function shouldIgnoreFileByName(filePath) {
function shouldScanFile (line 70) | function shouldScanFile(filePath) {
function findIssuesInFile (line 75) | function findIssuesInFile(filePath) {
function scanDirectory (line 98) | function scanDirectory(dirPath) {
function formatResults (line 133) | function formatResults(results) {
function main (line 168) | function main() {
FILE: app/scripts/mobile-deploy-confirm.cjs
constant DEPLOYMENT_METHODS (line 10) | const DEPLOYMENT_METHODS = {
constant PLATFORMS (line 15) | const PLATFORMS = {
constant SUPPORTED_PLATFORMS (line 21) | const SUPPORTED_PLATFORMS = Object.values(PLATFORMS);
constant FILE_PATHS (line 23) | const FILE_PATHS = {
constant CONSOLE_SYMBOLS (line 31) | const CONSOLE_SYMBOLS = {
constant REGEX_PATTERNS (line 48) | const REGEX_PATTERNS = {
function safeReadFile (line 64) | function safeReadFile(filePath, description) {
function safeExecSync (line 79) | function safeExecSync(command, description) {
function validatePlatform (line 107) | function validatePlatform(platform) {
function displayUsageAndExit (line 114) | function displayUsageAndExit() {
function getDeploymentMethod (line 158) | function getDeploymentMethod() {
function getMainVersion (line 178) | function getMainVersion() {
function getIOSVersion (line 193) | function getIOSVersion() {
function getAndroidVersion (line 224) | function getAndroidVersion() {
function getVersionJsonData (line 249) | function getVersionJsonData() {
function getTimeAgo (line 265) | function getTimeAgo(timestamp) {
function getCurrentVersions (line 287) | function getCurrentVersions() {
function getCurrentBranch (line 304) | function getCurrentBranch() {
function hasUncommittedChanges (line 315) | function hasUncommittedChanges() {
function displayDeploymentHeader (line 326) | function displayDeploymentHeader(platform) {
function displayDeploymentMethod (line 336) | function displayDeploymentMethod(deploymentMethod) {
function displayPlatformVersions (line 351) | function displayPlatformVersions(platform, versions) {
function displayWarningsAndGitStatus (line 419) | function displayWarningsAndGitStatus() {
function displayFullConfirmation (line 441) | function displayFullConfirmation(platform, versions, deploymentMethod) {
function promptConfirmation (line 460) | function promptConfirmation() {
function performYarnReinstall (line 481) | function performYarnReinstall() {
function getFastlaneCommands (line 499) | function getFastlaneCommands(platform) {
function executeLocalFastlaneDeployment (line 547) | async function executeLocalFastlaneDeployment(platform) {
function executeGithubRunnerDeployment (line 601) | async function executeGithubRunnerDeployment(platform) {
function executeDeployment (line 639) | async function executeDeployment(platform, deploymentMethod) {
function main (line 652) | async function main() {
FILE: app/scripts/run-ios-simulator.cjs
constant APP_ROOT (line 8) | const APP_ROOT = path.resolve(__dirname, '..');
constant DEVICE_PRIORITY (line 10) | const DEVICE_PRIORITY = [
function normalizeRuntimeVersion (line 17) | function normalizeRuntimeVersion(runtime) {
function extractRuntimeVersion (line 21) | function extractRuntimeVersion(runtime) {
function compareRuntimeVersions (line 31) | function compareRuntimeVersions(left, right) {
function selectDevice (line 48) | function selectDevice(devicesJson) {
function runCommand (line 119) | function runCommand(command, args, options = {}) {
function sleep (line 127) | function sleep(milliseconds) {
function main (line 131) | function main() {
FILE: app/scripts/setup-private-modules.cjs
constant SCRIPT_DIR (line 10) | const SCRIPT_DIR = __dirname;
constant APP_DIR (line 11) | const APP_DIR = path.dirname(SCRIPT_DIR);
constant ANDROID_DIR (line 12) | const ANDROID_DIR = path.join(APP_DIR, 'android');
constant GITHUB_ORG (line 14) | const GITHUB_ORG = 'selfxyz';
constant BRANCH (line 15) | const BRANCH = 'main';
constant PRIVATE_MODULES (line 17) | const PRIVATE_MODULES = [
function shouldSetupAndroidModule (line 39) | function shouldSetupAndroidModule() {
function log (line 69) | function log(message, type = 'info') {
function runCommand (line 82) | function runCommand(command, options = {}) {
function sanitizeCommandForLogging (line 108) | function sanitizeCommandForLogging(command) {
function removeExistingModule (line 116) | function removeExistingModule(modulePath, repoName) {
function usingHTTPSGitAuth (line 134) | function usingHTTPSGitAuth() {
function clonePrivateRepo (line 150) | function clonePrivateRepo(repoName, localPath, commit) {
function validateSetup (line 233) | function validateSetup(modulePath, validationFiles, repoName) {
function isExistingModuleReusable (line 244) | function isExistingModuleReusable(module) {
function setupPrivateModule (line 343) | function setupPrivateModule(module) {
function setupAndroidPassportReader (line 378) | function setupAndroidPassportReader() {
function scrubGitRemoteUrl (line 417) | function scrubGitRemoteUrl(modulePath, repoName) {
FILE: app/scripts/tag.cjs
function getVersion (line 11) | function getVersion() {
function isWorkingDirectoryClean (line 19) | function isWorkingDirectoryClean() {
function createEmptyCommit (line 30) | function createEmptyCommit(version) {
function createTag (line 41) | function createTag(version) {
function pushTag (line 52) | function pushTag(version) {
function removeTag (line 63) | function removeTag(version) {
function main (line 75) | function main() {
FILE: app/scripts/test-tree-shaking.cjs
constant TEST_CONFIGS (line 19) | const TEST_CONFIGS = [
function formatBytes (line 56) | function formatBytes(bytes) {
function createTestApp (line 63) | function createTestApp(config, testDir, commonPackagePath) {
function createWebpackConfig (line 93) | function createWebpackConfig(appDir) {
function runTest (line 128) | function runTest(config, testDir, commonPackagePath) {
function generateReport (line 175) | function generateReport(results) {
function main (line 250) | async function main() {
FILE: app/scripts/tests/aliasImports.test.cjs
function createTempDir (line 24) | function createTempDir() {
function writeFileEnsured (line 29) | function writeFileEnsured(filePath, content) {
FILE: app/scripts/tests/cleanupIosBuild.test.cjs
constant SCRIPT (line 13) | const SCRIPT = resolve(__dirname, '../cleanup-ios-build.sh');
FILE: app/scripts/tests/mobileDeployConfirm.test.cjs
constant MOCK_IOS_INFO_PLIST (line 10) | const MOCK_IOS_INFO_PLIST = `<?xml version="1.0" encoding="UTF-8"?>
constant MOCK_IOS_PROJECT_FILE (line 21) | const MOCK_IOS_PROJECT_FILE = `// !$*UTF8*$!
constant MOCK_ANDROID_BUILD_GRADLE (line 36) | const MOCK_ANDROID_BUILD_GRADLE = `android {
constant REGEX_PATTERNS (line 50) | const REGEX_PATTERNS = {
function extractIOSVersion (line 59) | function extractIOSVersion(infoPlistContent) {
function extractIOSBuild (line 65) | function extractIOSBuild(projectFileContent) {
function extractAndroidVersion (line 71) | function extractAndroidVersion(buildGradleContent) {
function extractAndroidVersionCode (line 77) | function extractAndroidVersionCode(buildGradleContent) {
FILE: app/scripts/upload_to_play_store.py
function get_credentials (line 24) | def get_credentials():
function should_hold_for_manual_review (line 70) | def should_hold_for_manual_review(track):
function upload_to_internal_app_sharing (line 82) | def upload_to_internal_app_sharing(aab_path, package_name, credentials):
function upload_to_play_store (line 132) | def upload_to_play_store(aab_path, package_name, track, credentials):
function main (line 209) | def main():
FILE: app/scripts/version-manager.cjs
constant APP_DIR (line 30) | const APP_DIR = path.resolve(__dirname, '..');
constant VERSION_MANAGED_RELATIVE_PATHS (line 31) | const VERSION_MANAGED_RELATIVE_PATHS = [
constant PACKAGE_JSON_PATH (line 43) | const PACKAGE_JSON_PATH = path.join(APP_DIR, PACKAGE_JSON_REL_PATH);
constant VERSION_JSON_PATH (line 44) | const VERSION_JSON_PATH = path.join(APP_DIR, VERSION_JSON_REL_PATH);
constant ANDROID_GRADLE_PATH (line 45) | const ANDROID_GRADLE_PATH = path.join(APP_DIR, ANDROID_GRADLE_REL_PATH);
constant IOS_PBXPROJ_PATH (line 46) | const IOS_PBXPROJ_PATH = path.join(APP_DIR, IOS_PBXPROJ_REL_PATH);
function getVersionManagedFiles (line 51) | function getVersionManagedFiles() {
function readPackageJson (line 58) | function readPackageJson() {
function readVersionJson (line 73) | function readVersionJson() {
function writePackageJson (line 88) | function writePackageJson(data) {
function writeVersionJson (line 99) | function writeVersionJson(data) {
function updateFileWithRegex (line 110) | function updateFileWithRegex(filePath, regex, replacement) {
function getVersionInfo (line 134) | function getVersionInfo() {
function bumpSemanticVersion (line 150) | function bumpSemanticVersion(currentVersion, bumpType) {
function bumpVersion (line 190) | function bumpVersion(bumpType, platform = 'both') {
function applyVersions (line 258) | function applyVersions(
function main (line 382) | function main() {
FILE: app/scripts/version-manager.test.cjs
function setupMocks (line 48) | function setupMocks() {
function restoreMocks (line 72) | function restoreMocks() {
FILE: app/scripts/version.cjs
constant VERSION_FILE (line 9) | const VERSION_FILE = join(__dirname, '..', 'version.json');
constant PACKAGE_JSON (line 10) | const PACKAGE_JSON = join(__dirname, '..', 'package.json');
function readVersionFile (line 12) | function readVersionFile() {
function writeVersionFile (line 22) | function writeVersionFile(data) {
function getPackageVersion (line 31) | function getPackageVersion() {
function bumpBuild (line 41) | function bumpBuild(platform = 'both') {
function setDeploymentTime (line 67) | function setDeploymentTime(platform) {
function getCurrentInfo (line 91) | function getCurrentInfo() {
FILE: app/src/components/AlertModal.tsx
type AlertModalParams (line 33) | interface AlertModalParams {
type AlertModalProps (line 45) | interface AlertModalProps {
FILE: app/src/components/Disclosures.tsx
type DisclosureProps (line 18) | interface DisclosureProps {
function Disclosures (line 22) | function Disclosures({ disclosures }: DisclosureProps) {
type DisclosureItemProps (line 45) | interface DisclosureItemProps {
FILE: app/src/components/ErrorBoundary.tsx
type Props (line 12) | interface Props {
type State (line 16) | interface State {
class ErrorBoundary (line 20) | class ErrorBoundary extends Component<Props, State> {
method constructor (line 21) | constructor(props: Props) {
method getDerivedStateFromError (line 26) | static getDerivedStateFromError(_: Error): State {
method componentDidCatch (line 30) | componentDidCatch(error: Error, info: ErrorInfo) {
method render (line 43) | render() {
FILE: app/src/components/FeedbackModal.tsx
type FeedbackModalProps (line 20) | interface FeedbackModalProps {
FILE: app/src/components/InputField.tsx
type InputFieldProps (line 29) | interface InputFieldProps {
type InputFieldType (line 39) | type InputFieldType = 'alphanumeric' | 'date-of-birth' | 'expiry-date';
FILE: app/src/components/LoadingUI.tsx
type LoadingUIProps (line 26) | interface LoadingUIProps {
FILE: app/src/components/Mnemonic.tsx
type MnemonicProps (line 22) | interface MnemonicProps {
type WordPill (line 26) | interface WordPill {
constant REDACTED (line 51) | const REDACTED = new Array(24)
FILE: app/src/components/PointHistoryList.tsx
type Section (line 33) | type Section = {
type PointHistoryListProps (line 38) | type PointHistoryListProps = {
constant TIME_PERIODS (line 46) | const TIME_PERIODS = {
FILE: app/src/components/SystemBars.tsx
type SystemBarsProps (line 11) | type SystemBarsProps = React.ComponentProps<typeof EdgeToEdgeSystemBars>;
FILE: app/src/components/Tips.tsx
type TipProps (line 11) | interface TipProps {
function Tip (line 17) | function Tip({ title, body, icon }: TipProps) {
function Tips (line 54) | function Tips({ items }: { items: TipProps[] }) {
FILE: app/src/components/WebViewFooter.tsx
type WebViewFooterProps (line 13) | interface WebViewFooterProps {
FILE: app/src/components/documents/IDSelectorItem.tsx
type IDSelectorItemProps (line 20) | interface IDSelectorItemProps {
type IDSelectorState (line 29) | type IDSelectorState = 'active' | 'verified' | 'expired' | 'mock';
function getSubtitleText (line 31) | function getSubtitleText(state: IDSelectorState): string {
function getSubtitleColor (line 44) | function getSubtitleColor(state: IDSelectorState): string {
function isDisabledState (line 136) | function isDisabledState(state: IDSelectorState): boolean {
FILE: app/src/components/documents/IDSelectorSheet.tsx
type IDSelectorDocument (line 22) | interface IDSelectorDocument {
type IDSelectorSheetProps (line 28) | interface IDSelectorSheetProps {
FILE: app/src/components/homescreen/CardBottomContent.tsx
type Badge (line 14) | interface Badge {
type CardBottomContentProps (line 20) | interface CardBottomContentProps {
FILE: app/src/components/homescreen/CardHeader.tsx
type CardHeaderProps (line 21) | interface CardHeaderProps {
FILE: app/src/components/homescreen/EmptyIdCard.tsx
type EmptyIdCardProps (line 25) | interface EmptyIdCardProps {
FILE: app/src/components/homescreen/IdAttribute.tsx
type IdAttributeProps (line 13) | interface IdAttributeProps {
FILE: app/src/components/homescreen/IdCard.tsx
constant CARD_BACKGROUNDS (line 51) | const CARD_BACKGROUNDS = [
constant DEV_LOGO_BG (line 61) | const DEV_LOGO_BG = '#52525B';
constant DEV_BODY_COLOR (line 62) | const DEV_BODY_COLOR = '#1E1B4B';
type IdCardLayoutAttributes (line 64) | interface IdCardLayoutAttributes {
FILE: app/src/components/homescreen/IdCardRevealed.tsx
type IdCardRevealedProps (line 52) | interface IdCardRevealedProps {
FILE: app/src/components/homescreen/KycIdCard.tsx
type KycIdCardProps (line 36) | interface KycIdCardProps {
function getKycDocTitle (line 46) | function getKycDocTitle(idType: string): string {
function formatKycDate (line 61) | function formatKycDate(date: string): string {
FILE: app/src/components/homescreen/PendingIdCard.tsx
type PendingIdCardProps (line 27) | interface PendingIdCardProps {
FILE: app/src/components/homescreen/SvgXmlWrapper.native.tsx
type Props (line 9) | type Props = ComponentProps<typeof RNSvgXml>;
FILE: app/src/components/homescreen/SvgXmlWrapper.web.tsx
type Props (line 13) | type Props = {
FILE: app/src/components/homescreen/UnregisteredIdCard.tsx
type UnregisteredIdCardProps (line 24) | interface UnregisteredIdCardProps {
FILE: app/src/components/homescreen/cardSecurityBadge.ts
type SecurityLevel (line 9) | type SecurityLevel = 'HI-SECURITY' | 'LOW-SECURITY' | 'STANDARD';
function getSecurityLevel (line 20) | function getSecurityLevel(
FILE: app/src/components/native/PassportCamera.tsx
type NativePassportOCRViewProps (line 14) | interface NativePassportOCRViewProps {
type PassportCameraProps (line 49) | interface PassportCameraProps {
FILE: app/src/components/native/PassportCamera.web.tsx
type PassportCameraProps (line 12) | interface PassportCameraProps {
FILE: app/src/components/native/QRCodeScanner.tsx
type QRCodeScannerViewProps (line 13) | interface QRCodeScannerViewProps {
FILE: app/src/components/native/QRCodeScanner.web.tsx
type QRCodeScannerViewProps (line 8) | interface QRCodeScannerViewProps {
function QRCodeScannerView (line 13) | function QRCodeScannerView({
FILE: app/src/components/native/RCTFragment.tsx
type FragmentProps (line 12) | interface FragmentProps {
type RCTFragmentViewManagerProps (line 16) | interface RCTFragmentViewManagerProps {
function dispatchCommand (line 33) | function dispatchCommand(
FILE: app/src/components/navbar/BaseNavBar.tsx
type NavBarProps (line 20) | interface NavBarProps extends ViewProps {
type LeftActionProps (line 25) | interface LeftActionProps extends ViewProps {
type RightActionProps (line 30) | interface RightActionProps extends ViewProps {
type NavBarTitleProps (line 34) | interface NavBarTitleProps extends React.ComponentProps<typeof Title> {
FILE: app/src/components/navbar/WebViewNavBar.tsx
type WebViewNavBarProps (line 16) | interface WebViewNavBarProps {
FILE: app/src/components/proof-request/BottomActionBar.tsx
type BottomActionBarProps (line 20) | interface BottomActionBarProps {
FILE: app/src/components/proof-request/BottomVerifyBar.tsx
type BottomVerifyBarProps (line 13) | interface BottomVerifyBarProps {
FILE: app/src/components/proof-request/ConnectedWalletBadge.tsx
type ConnectedWalletBadgeProps (line 14) | interface ConnectedWalletBadgeProps {
function truncateAddress (line 96) | function truncateAddress(
FILE: app/src/components/proof-request/DisclosureItem.tsx
type DisclosureItemProps (line 17) | interface DisclosureItemProps {
FILE: app/src/components/proof-request/ProofMetadataBar.tsx
type ProofMetadataBarProps (line 13) | interface ProofMetadataBarProps {
function formatTimestamp (line 81) | function formatTimestamp(date: Date): string {
FILE: app/src/components/proof-request/ProofRequestCard.tsx
type ProofRequestCardProps (line 28) | interface ProofRequestCardProps {
FILE: app/src/components/proof-request/ProofRequestHeader.tsx
type ProofRequestHeaderProps (line 17) | interface ProofRequestHeaderProps {
FILE: app/src/components/proof-request/WalletAddressModal.tsx
type WalletAddressModalProps (line 15) | interface WalletAddressModalProps {
FILE: app/src/components/proof-request/icons.tsx
type IconProps (line 8) | interface IconProps {
FILE: app/src/components/referral/CopyReferralButton.tsx
type CopyReferralButtonProps (line 20) | interface CopyReferralButtonProps {
FILE: app/src/components/referral/ReferralHeader.tsx
type ReferralHeaderProps (line 15) | interface ReferralHeaderProps {
FILE: app/src/components/referral/ReferralInfo.tsx
type ReferralInfoProps (line 16) | interface ReferralInfoProps {
FILE: app/src/components/referral/ShareButton.tsx
type ShareButtonProps (line 12) | interface ShareButtonProps {
FILE: app/src/components/starfall/StarfallPIN.tsx
type StarfallPINProps (line 11) | interface StarfallPINProps {
FILE: app/src/components/support/SupportUuidRow.tsx
type SupportUuidRowProps (line 19) | interface SupportUuidRowProps {
FILE: app/src/config/remoteConfig.shared.ts
type FeatureFlagInfo (line 5) | interface FeatureFlagInfo {
type FeatureFlagValue (line 15) | type FeatureFlagValue = string | boolean | number;
type LocalOverride (line 17) | interface LocalOverride {
type RemoteConfigBackend (line 21) | interface RemoteConfigBackend {
type RemoteConfigValue (line 29) | interface RemoteConfigValue {
type StorageBackend (line 36) | interface StorageBackend {
constant LOCAL_OVERRIDES_KEY (line 42) | const LOCAL_OVERRIDES_KEY = 'feature_flag_overrides';
FILE: app/src/config/remoteConfig.web.ts
class MockFirebaseRemoteConfig (line 40) | class MockFirebaseRemoteConfig implements RemoteConfigBackend {
method setDefaults (line 44) | setDefaults(defaults: Record<string, FeatureFlagValue>) {
method setConfigSettings (line 48) | setConfigSettings(settings: Record<string, unknown>) {
method fetchAndActivate (line 52) | async fetchAndActivate(): Promise<boolean> {
method getValue (line 58) | getValue(key: string) {
method getAll (line 84) | getAll(): Record<string, RemoteConfigValue> {
FILE: app/src/config/segment.ts
class DisableTrackingPlugin (line 19) | class DisableTrackingPlugin extends EventPlugin {
method execute (line 22) | execute(event: SegmentEvent): SegmentEvent {
FILE: app/src/config/sentry.ts
constant ALLOWED_TAG_KEYS (line 28) | const ALLOWED_TAG_KEYS = new Set([
method beforeSend (line 211) | beforeSend(event) {
type LogLevel (line 286) | type LogLevel = 'info' | 'warn' | 'error';
type LogCategory (line 287) | type LogCategory = 'proof' | 'nfc';
FILE: app/src/config/sentry.web.ts
type BaseContext (line 18) | interface BaseContext {
constant ALLOWED_TAG_KEYS (line 26) | const ALLOWED_TAG_KEYS = new Set([
type NFCScanContext (line 92) | interface NFCScanContext extends BaseContext, Record<string, unknown> {
type ProofContext (line 96) | interface ProofContext extends BaseContext, Record<string, unknown> {
method beforeSend (line 168) | beforeSend(event) {
type LogLevel (line 254) | type LogLevel = 'info' | 'warn' | 'error';
type LogCategory (line 255) | type LogCategory = 'proof' | 'nfc';
FILE: app/src/consts/recoveryPrompts.ts
type RecoveryPromptAllowedRoute (line 5) | type RecoveryPromptAllowedRoute =
constant RECOVERY_PROMPT_ALLOWED_ROUTES (line 8) | const RECOVERY_PROMPT_ALLOWED_ROUTES = ['Home'] as const;
FILE: app/src/devtools/mocks/index.ts
constant TURNKEY_OAUTH_REDIRECT_URI_ANDROID (line 11) | const TURNKEY_OAUTH_REDIRECT_URI_ANDROID =
constant TURNKEY_OAUTH_REDIRECT_URI_IOS (line 14) | const TURNKEY_OAUTH_REDIRECT_URI_IOS = turnkeyOAuthRedirectIosUri;
FILE: app/src/devtools/mocks/react-native-community-blur.ts
type BlurViewProps (line 8) | type BlurViewProps = React.HTMLAttributes<HTMLDivElement> & {
FILE: app/src/devtools/mocks/react-native-safe-area-context.js
function SafeAreaProvider (line 17) | function SafeAreaProvider({ children }) {
function SafeAreaView (line 21) | function SafeAreaView(props) {
function useSafeAreaFrame (line 40) | function useSafeAreaFrame() {
function useSafeAreaInsets (line 44) | function useSafeAreaInsets() {
FILE: app/src/devtools/testing/utils.ts
function clearDocumentCatalogForMigrationTesting (line 15) | async function clearDocumentCatalogForMigrationTesting(): Promise<void> {
FILE: app/src/hooks/useCardDimensions.ts
constant CARD_WIDTH_FACTOR (line 7) | const CARD_WIDTH_FACTOR = 0.95;
constant CARD_HORIZONTAL_OFFSET (line 8) | const CARD_HORIZONTAL_OFFSET = 16;
constant FIGMA_CARD_WIDTH (line 11) | const FIGMA_CARD_WIDTH = 353;
constant FIGMA_CARD_HEIGHT (line 12) | const FIGMA_CARD_HEIGHT = 224;
constant FIGMA_HEADER_HEIGHT (line 13) | const FIGMA_HEADER_HEIGHT = 67;
constant FIGMA_PADDING (line 14) | const FIGMA_PADDING = 14;
constant FIGMA_LOGO_SIZE (line 15) | const FIGMA_LOGO_SIZE = 32;
constant FIGMA_HEADER_GAP (line 16) | const FIGMA_HEADER_GAP = 12;
constant FIGMA_HEADER_FONT_SIZE (line 17) | const FIGMA_HEADER_FONT_SIZE = 20;
constant FIGMA_SUBTITLE_FONT_SIZE (line 18) | const FIGMA_SUBTITLE_FONT_SIZE = 7;
constant FIGMA_BADGE_FONT_SIZE (line 19) | const FIGMA_BADGE_FONT_SIZE = 10;
constant FIGMA_BOTTOM_LABEL_FONT_SIZE (line 20) | const FIGMA_BOTTOM_LABEL_FONT_SIZE = 15;
constant FIGMA_BOTTOM_ID_FONT_SIZE (line 21) | const FIGMA_BOTTOM_ID_FONT_SIZE = 10;
constant FIGMA_BUTTON_FONT_SIZE (line 22) | const FIGMA_BUTTON_FONT_SIZE = 16;
constant FIGMA_BORDER_RADIUS (line 23) | const FIGMA_BORDER_RADIUS = 12;
type CardDimensions (line 25) | interface CardDimensions {
type CardFontSizes (line 39) | interface CardFontSizes {
function useCardDimensions (line 48) | function useCardDimensions(selected = true): CardDimensions {
FILE: app/src/hooks/useConnectionModal.ts
function useConnectionModal (line 34) | function useConnectionModal() {
FILE: app/src/hooks/useEarnPointsFlow.ts
type UseEarnPointsFlowParams (line 22) | type UseEarnPointsFlowParams = {
FILE: app/src/hooks/useErrorInjection.ts
function useErrorInjection (line 15) | function useErrorInjection() {
FILE: app/src/hooks/useFeedbackModal.ts
type FeedbackType (line 15) | type FeedbackType = 'button' | 'widget' | 'custom';
FILE: app/src/hooks/useHapticNavigation.ts
type NavigationAction (line 16) | type NavigationAction = 'default' | 'cancel' | 'confirm';
type ExtendedNavigation (line 18) | type ExtendedNavigation = NavigationProp<RootStackParamList> & {
FILE: app/src/hooks/useKycLauncher.ts
type UseKycLauncherOptions (line 19) | interface UseKycLauncherOptions {
FILE: app/src/hooks/useKycWebSocket.ts
type UseKycWebSocketOptions (line 20) | interface UseKycWebSocketOptions {
function useKycWebSocket (line 32) | function useKycWebSocket(options: UseKycWebSocketOptions = {}) {
FILE: app/src/hooks/useMnemonic.ts
function useMnemonic (line 10) | function useMnemonic() {
FILE: app/src/hooks/useNetInfo.web.ts
function useNetInfo (line 5) | function useNetInfo() {
FILE: app/src/hooks/usePendingKycRecovery.ts
type RecoveryVerification (line 11) | type RecoveryVerification = {
function getRecoveryIdentifier (line 19) | function getRecoveryIdentifier(verification: RecoveryVerification) {
function usePendingKycRecovery (line 36) | function usePendingKycRecovery() {
FILE: app/src/hooks/useProofDisclosureStalenessCheck.ts
function useProofDisclosureStalenessCheck (line 20) | function useProofDisclosureStalenessCheck(
FILE: app/src/hooks/useRecoveryPrompts.ts
constant DEFAULT_ALLOWED_ROUTES (line 15) | const DEFAULT_ALLOWED_ROUTES = RECOVERY_PROMPT_ALLOWED_ROUTES;
type UseRecoveryPromptsOptions (line 17) | type UseRecoveryPromptsOptions = {
function useRecoveryPrompts (line 21) | function useRecoveryPrompts({
FILE: app/src/hooks/useReferralConfirmation.ts
type UseReferralConfirmationParams (line 13) | type UseReferralConfirmationParams = {
FILE: app/src/hooks/useReferralMessage.ts
type ReferralMessageResult (line 11) | interface ReferralMessageResult {
FILE: app/src/hooks/useSelfAppData.ts
function useSelfAppData (line 18) | function useSelfAppData(selfApp: SelfApp | null) {
FILE: app/src/hooks/useSupportUuid.ts
type UseSupportUuidResult (line 15) | interface UseSupportUuidResult {
function useSupportUuid (line 24) | function useSupportUuid(): UseSupportUuidResult {
FILE: app/src/hooks/useTestReferralFlow.ts
constant TEST_REFERRER (line 10) | const TEST_REFERRER = '0x1234567890123456789012345678901234567890';
FILE: app/src/integrations/keychain/index.ts
type AdaptiveSecurityConfig (line 19) | interface AdaptiveSecurityConfig {
type GetSecureOptions (line 25) | interface GetSecureOptions {
type SecurityCapabilities (line 35) | interface SecurityCapabilities {
function checkBiometricsAvailable (line 45) | async function checkBiometricsAvailable(): Promise<boolean> {
function checkPasscodeAvailable (line 62) | async function checkPasscodeAvailable(): Promise<boolean> {
function createKeychainOptions (line 82) | async function createKeychainOptions(
function detectSecurityCapabilities (line 121) | async function detectSecurityCapabilities(): Promise<SecurityCapabilitie...
function getAdaptiveSecurityConfig (line 144) | async function getAdaptiveSecurityConfig(
function getMaxSecurityLevel (line 195) | async function getMaxSecurityLevel(): Promise<SECURITY_LEVEL> {
function logSecurityConfig (line 209) | function logSecurityConfig(
FILE: app/src/integrations/kyc/kycService.ts
type KycLaunchConfig (line 13) | interface KycLaunchConfig {
constant FETCH_TIMEOUT_MS (line 18) | const FETCH_TIMEOUT_MS = 30000;
FILE: app/src/integrations/kyc/types.ts
type ApplicantInfoSerialized (line 5) | interface ApplicantInfoSerialized {
type KycVerificationResult (line 11) | interface KycVerificationResult {
type SessionResponse (line 26) | interface SessionResponse {
FILE: app/src/integrations/nfc/nfcScanner.ts
type Inputs (line 18) | interface Inputs {
type DataGroupHash (line 33) | interface DataGroupHash {
FILE: app/src/integrations/nfc/passportReader.ts
type ScanOptions (line 7) | type ScanOptions = {
type AndroidScanResponse (line 22) | interface AndroidScanResponse {
type AndroidPassportReaderModule (line 39) | type AndroidPassportReaderModule = {
type IOSPassportReaderModule (line 49) | type IOSPassportReaderModule = {
type PassportReaderModule (line 69) | type PassportReaderModule =
FILE: app/src/integrations/qrScanner.ts
type QRScannerBridge (line 5) | interface QRScannerBridge {
FILE: app/src/integrations/turnkey.ts
function useTurnkeyUtils (line 11) | function useTurnkeyUtils() {
FILE: app/src/layouts/AppLayout.tsx
type ConnectedAppLayoutProps (line 9) | type ConnectedAppLayoutProps = PropsWithChildren;
function ConnectedAppLayout (line 11) | function ConnectedAppLayout({
FILE: app/src/layouts/SimpleScrolledTitleLayout.tsx
type DetailListProps (line 19) | type DetailListProps = PropsWithChildren<{
function SimpleScrolledTitleLayout (line 28) | function SimpleScrolledTitleLayout({
FILE: app/src/navigation/deeplinks.ts
constant VALIDATION_PATTERNS (line 18) | const VALIDATION_PATTERNS = {
type ValidatedParams (line 30) | type ValidatedParams = {
type MockDataDeepLinkRawParams (line 43) | type MockDataDeepLinkRawParams = {
FILE: app/src/navigation/index.tsx
type BaseRootStackParamList (line 57) | type BaseRootStackParamList = StaticParamList<typeof AppNavigation>;
type RootStackParamList (line 61) | type RootStackParamList = Omit<
type RootStackScreenProps (line 67) | type RootStackScreenProps<T extends keyof RootStackParamList> =
type RootParamList (line 78) | interface RootParamList extends RootStackParamList {}
FILE: app/src/navigation/shared.ts
type ScreenName (line 16) | type ScreenName = keyof SharedRoutesParamList;
type ScreenConfig (line 18) | type ScreenConfig<Name extends ScreenName> = {
FILE: app/src/navigation/types.ts
type AadhaarRoutesParamList (line 15) | type AadhaarRoutesParamList = {
type AccountRoutesParamList (line 29) | type AccountRoutesParamList = {
type AppRoutesParamList (line 56) | type AppRoutesParamList = {
type DevRoutesParamList (line 73) | type DevRoutesParamList = {
type DocumentRoutesParamList (line 83) | type DocumentRoutesParamList = {
type ExplicitRouteParams (line 123) | type ExplicitRouteParams = AadhaarRoutesParamList &
type HomeRoutesParamList (line 137) | type HomeRoutesParamList = {
type OmittedRouteKeys (line 154) | type OmittedRouteKeys = keyof ExplicitRouteParams;
type OnboardingRoutesParamList (line 159) | type OnboardingRoutesParamList = {
type RegistrationRoutesParamList (line 185) | type RegistrationRoutesParamList = {
type SharedRoutesParamList (line 197) | type SharedRoutesParamList = {
type VerificationRoutesParamList (line 208) | type VerificationRoutesParamList = {
FILE: app/src/providers/authProvider.tsx
constant SERVICE_NAME (line 35) | const SERVICE_NAME = 'secret';
type SignedPayload (line 37) | type SignedPayload<T> = { signature: string; data: T };
type KeychainOptions (line 38) | type KeychainOptions = {
function checkBiometricsAvailable (line 110) | async function checkBiometricsAvailable(): Promise<boolean> {
function restoreFromMnemonic (line 126) | async function restoreFromMnemonic(
function loadOrCreateMnemonic (line 160) | async function loadOrCreateMnemonic(
type AuthProviderProps (line 262) | interface AuthProviderProps extends PropsWithChildren {
type IAuthContext (line 265) | interface IAuthContext {
function _generateAddressFromMnemonic (line 382) | function _generateAddressFromMnemonic(mnemonic: string, index: number): ...
function generateAndStorePointsAddress (line 391) | async function generateAndStorePointsAddress(
function getOrGeneratePointsAddress (line 405) | async function getOrGeneratePointsAddress(
function getPrivateKeyFromMnemonic (line 431) | function getPrivateKeyFromMnemonic(mnemonic: string) {
function hasSecretStored (line 436) | async function hasSecretStored() {
function migrateToSecureKeychain (line 447) | async function migrateToSecureKeychain(): Promise<boolean> {
function setKeychainCryptoFailureCallback (line 501) | function setKeychainCryptoFailureCallback(
function unsafe_clearSecrets (line 507) | async function unsafe_clearSecrets() {
function unsafe_getPointsPrivateKey (line 517) | async function unsafe_getPointsPrivateKey(
function unsafe_getPrivateKey (line 539) | async function unsafe_getPrivateKey(keychainOptions?: KeychainOptions) {
FILE: app/src/providers/authProvider.web.tsx
type SignedPayload (line 24) | type SignedPayload<T> = { signature: string; data: T };
type AndroidBridge (line 27) | interface AndroidBridge {
type Window (line 32) | interface Window {
function checkBiometricsAvailable (line 119) | async function checkBiometricsAvailable(): Promise<boolean> {
function restoreFromMnemonic (line 126) | async function restoreFromMnemonic(_mnemonic: string): Promise<string | ...
function loadOrCreateMnemonic (line 135) | async function loadOrCreateMnemonic(): Promise<string | false> {
type AuthProviderProps (line 141) | interface AuthProviderProps extends PropsWithChildren {
type IAuthContext (line 145) | interface IAuthContext {
function hasSecretStored (line 266) | async function hasSecretStored() {
function migrateToSecureKeychain (line 271) | async function migrateToSecureKeychain(): Promise<boolean> {
function unsafe_clearSecrets (line 276) | async function unsafe_clearSecrets() {
function unsafe_getPrivateKey (line 287) | async function unsafe_getPrivateKey() {
FILE: app/src/providers/feedbackProvider.tsx
type FeedbackContextType (line 14) | interface FeedbackContextType {
type FeedbackProviderProps (line 64) | interface FeedbackProviderProps {
FILE: app/src/providers/loggerProvider.tsx
type LoggerContextType (line 24) | type LoggerContextType = {
FILE: app/src/providers/passportDataProvider.tsx
function setPassportKeychainErrorCallback (line 83) | function setPassportKeychainErrorCallback(
function notifyKeychainFailure (line 89) | function notifyKeychainFailure(type: KeychainErrorType) {
function handleKeychainReadError (line 95) | function handleKeychainReadError({
type DocumentChangeCallback (line 164) | type DocumentChangeCallback = (isMock: boolean) => void;
function __resetPassportProviderTestState (line 191) | function __resetPassportProviderTestState() {
function checkAndUpdateRegistrationStates (line 312) | async function checkAndUpdateRegistrationStates(
function checkIfAnyDocumentsNeedMigration (line 321) | async function checkIfAnyDocumentsNeedMigration(): Promise<boolean> {
function clearDocumentCatalogForMigrationTesting (line 331) | async function clearDocumentCatalogForMigrationTesting() {
function clearSpecificPassportData (line 360) | async function clearSpecificPassportData(documentType: string) {
function deleteDocumentDirectlyFromKeychain (line 371) | async function deleteDocumentDirectlyFromKeychain(
function deleteDocument (line 377) | async function deleteDocument(documentId: string): Promise<void> {
function getAvailableDocumentTypes (line 402) | async function getAvailableDocumentTypes(): Promise<string[]> {
function getCurrentDocumentType (line 408) | async function getCurrentDocumentType(): Promise<string | null> {
function getServiceNameForDocumentType (line 420) | function getServiceNameForDocumentType(documentType: string): string {
function initializeNativeModules (line 440) | async function initializeNativeModules(
function loadAllPassportData (line 483) | async function loadAllPassportData(selfClient: SelfClient): Promise<{
function loadDocumentByIdDirectlyFromKeychain (line 498) | async function loadDocumentByIdDirectlyFromKeychain(
function loadDocumentCatalogDirectlyFromKeychain (line 533) | async function loadDocumentCatalogDirectlyFromKeychain(): Promise<Docume...
function loadPassportData (line 575) | async function loadPassportData() {
function loadPassportDataAndSecret (line 617) | async function loadPassportDataAndSecret() {
function loadSelectedDocumentDirectlyFromKeychain (line 629) | async function loadSelectedDocumentDirectlyFromKeychain(): Promise<{
function loadSelectedPassportData (line 672) | async function loadSelectedPassportData(): Promise<string | false> {
function loadSelectedPassportDataAndSecret (line 683) | async function loadSelectedPassportDataAndSecret() {
type PassportProviderProps (line 695) | interface PassportProviderProps extends PropsWithChildren {
type IPassportContext (line 698) | interface IPassportContext {
function migrateFromLegacyStorage (line 740) | async function migrateFromLegacyStorage(): Promise<void> {
function reStorePassportDataWithRightCSCA (line 775) | async function reStorePassportDataWithRightCSCA(
function saveDocumentCatalogDirectlyToKeychain (line 819) | async function saveDocumentCatalogDirectlyToKeychain(
function setDefaultDocumentTypeIfNeeded (line 830) | async function setDefaultDocumentTypeIfNeeded() {
function setSelectedDocument (line 838) | async function setSelectedDocument(documentId: string): Promise<void> {
function storeDocumentDirectlyToKeychain (line 850) | async function storeDocumentDirectlyToKeychain(
function storeDocumentWithDeduplication (line 863) | async function storeDocumentWithDeduplication(
function storePassportData (line 934) | async function storePassportData(passportData: IDDocument) {
function updateDocumentRegistrationState (line 938) | async function updateDocumentRegistrationState(
FILE: app/src/providers/remoteConfigProvider.tsx
type RemoteConfigContextValue (line 10) | interface RemoteConfigContextValue {
FILE: app/src/providers/selfClientProvider.tsx
type GlobalCrypto (line 49) | type GlobalCrypto = { crypto?: { subtle?: Crypto['subtle'] } };
function navigateIfReady (line 58) | function navigateIfReady<RouteName extends keyof RootStackParamList>(
method hash (line 145) | async hash(
method sign (line 160) | async sign(_data: Uint8Array, _keyRef: string): Promise<Uint8Array> {
method generateKey (line 165) | async generateKey(_keyRef: string): Promise<{ keyRef: string }> {
method getPublicKey (line 170) | async getPublicKey(_keyRef: string): Promise<Uint8Array> {
function disableKeychainErrorModal (line 465) | function disableKeychainErrorModal() {
function enableKeychainErrorModal (line 472) | function enableKeychainErrorModal() {
function showKeychainErrorModal (line 477) | function showKeychainErrorModal(
FILE: app/src/proving/loadingScreenStateText.ts
type LoadingScreenText (line 10) | interface LoadingScreenText {
function getLoadingScreenText (line 17) | function getLoadingScreenText(
function getProvingTimeEstimate (line 156) | function getProvingTimeEstimate(
FILE: app/src/proving/validateDocument.ts
function checkAndUpdateRegistrationStates (line 35) | async function checkAndUpdateRegistrationStates(
function getAlternativeCSCA (line 201) | function getAlternativeCSCA(
type MigratedPassportData (line 219) | type MigratedPassportData = Omit<PassportData, 'documentCategory' | 'moc...
function migratePassportData (line 224) | function migratePassportData(passportData: PassportData): PassportData {
FILE: app/src/screens/account/recovery/AccountRecoveryChoiceScreen.tsx
method getCommitmentTree (line 115) | getCommitmentTree(docCategory) {
method getAltCSCA (line 118) | getAltCSCA(docCategory) {
FILE: app/src/screens/account/recovery/RecoverWithPhraseScreen.tsx
type RecoveryError (line 42) | type RecoveryError =
constant ERROR_MESSAGES (line 48) | const ERROR_MESSAGES: Record<RecoveryError, string> = {
method getCommitmentTree (line 124) | getCommitmentTree(docCategory) {
method getAltCSCA (line 127) | getAltCSCA(docCategory) {
FILE: app/src/screens/account/settings/CloudBackupScreen.tsx
type NextScreen (line 38) | type NextScreen = keyof Pick<RootStackParamList, 'SaveRecoveryPhrase'>;
type CloudBackupScreenProps (line 40) | type CloudBackupScreenProps = StaticScreenProps<
type BackupMethod (line 48) | type BackupMethod = 'icloud' | 'turnkey' | null;
function BottomButton (line 357) | function BottomButton({
FILE: app/src/screens/account/settings/SecurityAndBackupScreen.tsx
type MinimalRootStackParamList (line 27) | type MinimalRootStackParamList = Record<string, object | undefined>;
type MenuButtonProps (line 29) | interface MenuButtonProps extends PropsWithChildren {
FILE: app/src/screens/account/settings/SettingsScreen.tsx
type MinimalRootStackParamList (line 54) | type MinimalRootStackParamList = Record<string, object | undefined>;
type MenuButtonProps (line 56) | interface MenuButtonProps extends PropsWithChildren {
type SocialButtonProps (line 60) | interface SocialButtonProps {
constant CURRENT_PLATFORM (line 73) | const CURRENT_PLATFORM: SettingsPlatform =
constant ROUTE_ICONS (line 76) | const ROUTE_ICONS: Record<SettingsRouteKey, React.FC<SvgProps>> = {
FILE: app/src/screens/account/settings/ShowRecoveryPhraseScreen.tsx
function useCopyRecoveryPhrase (line 21) | function useCopyRecoveryPhrase(mnemonic: string[] | undefined) {
FILE: app/src/screens/account/settings/settingsMenu.ts
type SettingsEntry (line 5) | type SettingsEntry = {
type SettingsGatingContext (line 10) | type SettingsGatingContext = {
type SettingsPlatform (line 17) | type SettingsPlatform = 'ios' | 'android' | 'web';
type SettingsRouteKey (line 19) | type SettingsRouteKey =
constant DEBUG_SETTINGS_ENTRY (line 28) | const DEBUG_SETTINGS_ENTRY: SettingsEntry = {
constant SETTINGS_ENTRIES_NATIVE (line 33) | const SETTINGS_ENTRIES_NATIVE: readonly SettingsEntry[] = [
constant SETTINGS_ENTRIES_WEB (line 41) | const SETTINGS_ENTRIES_WEB: readonly SettingsEntry[] = [
constant TROUBLESHOOTING_ENTRY (line 47) | const TROUBLESHOOTING_ENTRY: SettingsEntry = {
FILE: app/src/screens/app/GratificationScreen.tsx
type GratificationScreenProps (line 34) | type GratificationScreenProps = StaticScreenProps<{
FILE: app/src/screens/app/LoadingScreen.tsx
type LoadingScreenParams (line 34) | type LoadingScreenParams = {
type LoadingScreenProps (line 40) | type LoadingScreenProps = StaticScreenProps<LoadingScreenParams>;
FILE: app/src/screens/app/ModalScreen.tsx
type ModalNavigationParams (line 38) | interface ModalNavigationParams extends Omit<
type ModalParams (line 45) | interface ModalParams extends Record<string, unknown> {
type ModalScreenProps (line 55) | type ModalScreenProps = StaticScreenProps<ModalNavigationParams>;
FILE: app/src/screens/app/SplashScreen.tsx
constant INIT_TIMEOUT_MS (line 48) | const INIT_TIMEOUT_MS = 30_000;
FILE: app/src/screens/app/startupRouting.ts
type StartupNavigationTarget (line 7) | type StartupNavigationTarget = {
type StartupRoutingParams (line 12) | type StartupRoutingParams = {
function getStartupNavigationTarget (line 19) | function getStartupNavigationTarget(
function hasStartupRecoverySignal (line 51) | function hasStartupRecoverySignal(params: {
FILE: app/src/screens/dev/CreateMockScreen.tsx
type FormSectionProps (line 132) | type FormSectionProps = {
FILE: app/src/screens/dev/DevFeatureFlagsScreen.tsx
type FeatureFlag (line 26) | interface FeatureFlag {
FILE: app/src/screens/dev/SocialLoginDemoScreen.tsx
type SocialUser (line 31) | type SocialUser = {
FILE: app/src/screens/dev/components/LogLevelSelector.tsx
type LogLevelSelectorProps (line 23) | interface LogLevelSelectorProps {
FILE: app/src/screens/dev/components/ParameterSection.tsx
type ParameterSectionProps (line 22) | interface ParameterSectionProps extends PropsWithChildren {
function ParameterSection (line 31) | function ParameterSection({
FILE: app/src/screens/dev/components/TopicToggleButton.tsx
type TopicToggleButtonProps (line 16) | interface TopicToggleButtonProps {
FILE: app/src/screens/dev/sections/DangerZoneSection.tsx
type DangerZoneSectionProps (line 19) | interface DangerZoneSectionProps {
FILE: app/src/screens/dev/sections/DebugShortcutsSection.tsx
type DebugShortcutsSectionProps (line 21) | interface DebugShortcutsSectionProps {
type ShortcutRowProps (line 25) | interface ShortcutRowProps {
FILE: app/src/screens/dev/sections/DevTogglesSection.tsx
type DevTogglesSectionProps (line 12) | interface DevTogglesSectionProps {
FILE: app/src/screens/dev/sections/PushNotificationsSection.tsx
type PushNotificationsSectionProps (line 12) | interface PushNotificationsSectionProps {
FILE: app/src/screens/documents/aadhaar/AadhaarUploadErrorScreen.tsx
type AadhaarUploadErrorRouteParams (line 36) | type AadhaarUploadErrorRouteParams = {
type AadhaarUploadErrorRoute (line 40) | type AadhaarUploadErrorRoute = RouteProp<
FILE: app/src/screens/documents/management/DocumentDataInfoScreen.tsx
type DocumentMetadata (line 24) | type DocumentMetadata =
FILE: app/src/screens/documents/scanning/DataConfirmationScreen.tsx
type DocumentData (line 35) | interface DocumentData {
FILE: app/src/screens/documents/scanning/DocumentNFCMethodSelectionScreen.tsx
type NFCParams (line 26) | type NFCParams = {
constant NFC_METHODS (line 35) | const NFC_METHODS = [
FILE: app/src/screens/documents/scanning/DocumentNFCScanScreen.tsx
type DocumentNFCScanRouteParams (line 96) | type DocumentNFCScanRouteParams = {
type DocumentNFCScanRoute (line 106) | type DocumentNFCScanRoute = RouteProp<
FILE: app/src/screens/documents/scanning/RegistrationFallbackMRZScreen.tsx
type RegistrationFallbackMRZRouteParams (line 39) | type RegistrationFallbackMRZRouteParams = {
type RegistrationFallbackMRZRoute (line 43) | type RegistrationFallbackMRZRoute = RouteProp<
FILE: app/src/screens/documents/scanning/RegistrationFallbackNFCScreen.tsx
type RegistrationFallbackNFCRouteParams (line 41) | type RegistrationFallbackNFCRouteParams = {
type RegistrationFallbackNFCRoute (line 45) | type RegistrationFallbackNFCRoute = RouteProp<
FILE: app/src/screens/documents/selection/ConfirmBelongingScreen.tsx
type ConfirmBelongingScreenProps (line 20) | type ConfirmBelongingScreenProps = StaticScreenProps<Record<string, neve...
FILE: app/src/screens/documents/selection/CountryPickerScreen.tsx
type CountryPickerScreenComponent (line 10) | type CountryPickerScreenComponent = React.FC & {
FILE: app/src/screens/documents/selection/IDPickerScreen.tsx
type IDPickerScreenRouteProp (line 18) | type IDPickerScreenRouteProp = RouteProp<RootStackParamList, 'IDPicker'>;
FILE: app/src/screens/documents/selection/LogoConfirmationScreen.tsx
type LogoConfirmationScreenRouteProp (line 41) | type LogoConfirmationScreenRouteProp = RouteProp<
FILE: app/src/screens/home/PointsInfoScreen.tsx
type PointsInfoScreenProps (line 30) | type PointsInfoScreenProps = StaticScreenProps<
type EarnPointsItemProps (line 38) | interface EarnPointsItemProps {
constant EARN_POINTS_ITEMS (line 68) | const EARN_POINTS_ITEMS = [
FILE: app/src/screens/home/ProofHistoryDetailScreen.tsx
type ProofHistoryDetailScreenProps (line 32) | type ProofHistoryDetailScreenProps = {
type DisclosureType (line 40) | enum DisclosureType {
FILE: app/src/screens/home/ProofHistoryList.tsx
type Section (line 37) | type Section = {
constant TIME_PERIODS (line 42) | const TIME_PERIODS = {
type ProofHistoryListProps (line 52) | interface ProofHistoryListProps {
FILE: app/src/screens/home/ProofHistoryScreen.tsx
type Section (line 38) | type Section = {
constant TIME_PERIODS (line 43) | const TIME_PERIODS = {
FILE: app/src/screens/kyc/KycFailureScreen.tsx
type KycFailureRouteParams (line 29) | type KycFailureRouteParams = {
type KycFailureRoute (line 34) | type KycFailureRoute = RouteProp<Record<string, KycFailureRouteParams>, ...
FILE: app/src/screens/kyc/KycSuccessScreen.tsx
type KycSuccessRouteParams (line 35) | type KycSuccessRouteParams = StaticScreenProps<
FILE: app/src/screens/shared/ComingSoonScreen.tsx
type ComingSoonScreenProps (line 36) | type ComingSoonScreenProps = NativeStackScreenProps<
FILE: app/src/screens/shared/WebViewScreen.tsx
type WebViewScreenParams (line 40) | interface WebViewScreenParams {
type WebViewScreenProps (line 48) | type WebViewScreenProps = NativeStackScreenProps<
FILE: app/src/screens/starfall/StarfallPushCodeScreen.tsx
constant DASH_CODE (line 31) | const DASH_CODE = '----';
FILE: app/src/screens/verification/DocumentSelectorForProvingScreen.tsx
function getDocumentDisplayName (line 52) | function getDocumentDisplayName(
function determineDocumentState (line 92) | function determineDocumentState(
FILE: app/src/screens/verification/ProofRequestStatusScreen.tsx
constant PREREQ_CHECK_TIMEOUT_MS (line 48) | const PREREQ_CHECK_TIMEOUT_MS = 3000;
constant PROVING_STALL_TIMEOUT_MS (line 52) | const PROVING_STALL_TIMEOUT_MS = 90_000;
constant PROOF_TIMEOUT_ERROR_CODE (line 53) | const PROOF_TIMEOUT_ERROR_CODE = 'proof_timeout';
constant PROOF_TIMEOUT_REASON (line 54) | const PROOF_TIMEOUT_REASON = 'timed_out_after_90s';
constant STALL_TIMEOUT_STATES (line 55) | const STALL_TIMEOUT_STATES = new Set([
function cancelDeeplinkCallbackRedirect (line 193) | function cancelDeeplinkCallbackRedirect() {
function cancelCountdown (line 197) | function cancelCountdown() {
function getTitle (line 458) | function getTitle(currentState: string) {
function getUserFacingErrorMessage (line 472) | function getUserFacingErrorMessage(
function Info (line 497) | function Info({
FILE: app/src/screens/verification/ProveScreen.tsx
function onVerify (line 405) | function onVerify() {
FILE: app/src/services/analytics.ts
constant MIXPANEL_AUTO_FLUSH_THRESHOLD (line 20) | const MIXPANEL_AUTO_FLUSH_THRESHOLD = 5;
constant MAX_EVENT_QUEUE_SIZE (line 21) | const MAX_EVENT_QUEUE_SIZE = 100;
function coerceToJsonValue (line 43) | function coerceToJsonValue(
function cleanParams (line 82) | function cleanParams(params: Record<string, unknown>): JsonMap {
function validateParams (line 95) | function validateParams(
function withSupportUuid (line 115) | function withSupportUuid(
function _track (line 135) | function _track(
FILE: app/src/services/cloud-backup/google.ts
function createGDrive (line 39) | async function createGDrive() {
function googleSignIn (line 50) | async function googleSignIn(): Promise<AuthorizeResult | null> {
FILE: app/src/services/cloud-backup/helpers.ts
constant ENCRYPTED_FILE_PATH (line 12) | const ENCRYPTED_FILE_PATH = `/${folder}/encrypted-private-key`;
constant FILE_NAME (line 13) | const FILE_NAME = 'encrypted-private-key';
constant FOLDER (line 14) | const FOLDER = folder;
FILE: app/src/services/cloud-backup/index.ts
constant STORAGE_NAME (line 23) | const STORAGE_NAME = Platform.OS === 'ios' ? 'iCloud' : 'Google Drive';
function isDriveFile (line 25) | function isDriveFile(file: unknown): file is { id: string } {
function disableBackup (line 33) | async function disableBackup() {
function download (line 59) | async function download() {
function upload (line 92) | async function upload(mnemonic: Mnemonic) {
function useBackupMnemonic (line 116) | function useBackupMnemonic() {
FILE: app/src/services/cloud-backup/ios.ts
function disableBackup (line 12) | async function disableBackup() {
function download (line 16) | async function download() {
function upload (line 35) | async function upload(mnemonic: Mnemonic) {
FILE: app/src/services/logging/index.ts
type RootLogger (line 42) | type RootLogger = typeof Logger;
type LoggerExtension (line 43) | type LoggerExtension = ReturnType<RootLogger['extend']>;
FILE: app/src/services/logging/logger/consoleInterceptor.ts
type LoggerMethods (line 14) | type LoggerMethods = {
FILE: app/src/services/logging/logger/lokiTransport.ts
type LokiLogEntry (line 19) | interface LokiLogEntry {
type LokiStream (line 25) | interface LokiStream {
type LokiPayload (line 30) | interface LokiPayload {
constant BATCH_SIZE (line 40) | const BATCH_SIZE = 100;
constant BATCH_TIMEOUT (line 41) | const BATCH_TIMEOUT = 5000;
type LokiTransportOptions (line 172) | type LokiTransportOptions = Record<string, never>;
FILE: app/src/services/logging/logger/nativeLoggerBridge.ts
type NativeLogEvent (line 12) | interface NativeLogEvent {
FILE: app/src/services/notifications/notificationService.shared.ts
type DeviceTokenRegistration (line 7) | interface DeviceTokenRegistration {
type RemoteMessage (line 13) | interface RemoteMessage {
constant API_URL (line 23) | const API_URL = notificationApiUrl;
constant API_URL_STAGING (line 25) | const API_URL_STAGING = notificationApiStagingUrl;
FILE: app/src/services/notifications/notificationService.ts
constant SELF_UUID_NAMESPACE (line 17) | const SELF_UUID_NAMESPACE = '00000000-0000-8000-8000-531f00000000';
constant REGISTER_TOKEN_TIMEOUT_MS (line 19) | const REGISTER_TOKEN_TIMEOUT_MS = 10000;
constant REGISTER_TOKEN_MAX_ATTEMPTS (line 20) | const REGISTER_TOKEN_MAX_ATTEMPTS = 3;
constant REGISTER_TOKEN_BACKOFF_MS (line 21) | const REGISTER_TOKEN_BACKOFF_MS = 500;
function fetchRegisterToken (line 27) | async function fetchRegisterToken(
function getFCMToken (line 77) | async function getFCMToken(): Promise<string | null> {
function isNotificationSystemReady (line 101) | async function isNotificationSystemReady(): Promise<{
function isTopicSubscribed (line 152) | async function isTopicSubscribed(topic: string): Promise<boolean> {
function registerDeviceToken (line 165) | async function registerDeviceToken(
function requestNotificationPermission (line 214) | async function requestNotificationPermission(): Promise<boolean> {
function setupNotifications (line 241) | function setupNotifications(): () => void {
function subscribeToTopics (line 266) | async function subscribeToTopics(topics: string[]): Promise<{
function unsubscribeFromTopics (line 329) | async function unsubscribeFromTopics(topics: string[]): Promise<{
FILE: app/src/services/notifications/notificationService.web.ts
function getFCMToken (line 12) | async function getFCMToken(): Promise<string | null> {
function isNotificationSystemReady (line 45) | async function isNotificationSystemReady(): Promise<{
function registerDeviceToken (line 85) | async function registerDeviceToken(
function requestNotificationPermission (line 146) | async function requestNotificationPermission(): Promise<boolean> {
function setupNotifications (line 174) | function setupNotifications(): () => void {
function subscribeToTopics (line 197) | async function subscribeToTopics(topics: string[]): Promise<{
function unsubscribeFromTopics (line 221) | async function unsubscribeFromTopics(topics: string[]): Promise<{
FILE: app/src/services/points/api.ts
type ApiResponse (line 14) | type ApiResponse<T = unknown> = {
type SignatureData (line 21) | interface SignatureData {
constant SUCCESSFUL_STATUS_CODES (line 29) | const SUCCESSFUL_STATUS_CODES = [200, 202] as const;
FILE: app/src/services/points/constants.ts
constant POINTS_API_BASE_URL (line 7) | const POINTS_API_BASE_URL = pointsApiBaseUrl;
constant POINTS_API_ROUTES (line 8) | const POINTS_API_ROUTES = {
constant POINTS_SELF_APP_ENDPOINT (line 19) | const POINTS_SELF_APP_ENDPOINT =
constant POINTS_SELF_APP_NAME (line 21) | const POINTS_SELF_APP_NAME = '✨ Self Points';
constant POINTS_SELF_APP_SCOPE (line 22) | const POINTS_SELF_APP_SCOPE = 'minimal-disclosure-quest';
constant POINTS_TOKEN_CONTRACT_ADDRESS (line 23) | const POINTS_TOKEN_CONTRACT_ADDRESS =
FILE: app/src/services/points/eventPolling.ts
function pollEventProcessingStatus (line 12) | async function pollEventProcessingStatus(
function sleep (line 42) | function sleep(ms: number): Promise<void> {
FILE: app/src/services/points/jobStatus.ts
type JobStatusResponse (line 10) | type JobStatusResponse = {
function checkEventProcessingStatus (line 15) | async function checkEventProcessingStatus(
FILE: app/src/services/points/registerEvents.ts
type VerifyActionResponse (line 8) | type VerifyActionResponse = {
FILE: app/src/services/points/types.ts
type IncomingPoints (line 5) | type IncomingPoints = {
type PointEvent (line 10) | type PointEvent = {
type PointEventStatus (line 19) | type PointEventStatus = 'pending' | 'completed' | 'failed';
type PointEventType (line 21) | type PointEventType = 'refer' | 'notification' | 'backup' | 'disclosure';
constant POINT_VALUES (line 23) | const POINT_VALUES = {
FILE: app/src/services/points/utils.ts
type WhitelistedContract (line 20) | type WhitelistedContract = {
constant NULLIFIER_ALREADY_USED_ERROR_PREFIX (line 26) | const NULLIFIER_ALREADY_USED_ERROR_PREFIX = '0xdc215c0a';
FILE: app/src/services/starfall/pushCodeService.ts
constant REQUEST_TIMEOUT_MS (line 10) | const REQUEST_TIMEOUT_MS = 30000;
function fetchPushCode (line 20) | async function fetchPushCode(walletAddress: string): Promise<string> {
FILE: app/src/services/support.ts
constant SUPPORT_FORM_BUTTON_TEXT (line 11) | const SUPPORT_FORM_BUTTON_TEXT = 'Send feedback';
constant SUPPORT_FORM_COMING_SOON_BUTTON_TEXT (line 13) | const SUPPORT_FORM_COMING_SOON_BUTTON_TEXT = 'Let us know';
constant SUPPORT_FORM_COMING_SOON_MESSAGE (line 15) | const SUPPORT_FORM_COMING_SOON_MESSAGE =
constant SUPPORT_FORM_MESSAGE (line 18) | const SUPPORT_FORM_MESSAGE = 'Have feedback? Please fill out our form.';
constant SUPPORT_FORM_TIP_MESSAGE (line 20) | const SUPPORT_FORM_TIP_MESSAGE = 'Have feedback? Let us know.';
FILE: app/src/stores/database.ts
constant PAGE_SIZE (line 10) | const PAGE_SIZE = 20;
constant DB_NAME (line 11) | const DB_NAME = 'proof_history.db';
constant TABLE_NAME (line 12) | const TABLE_NAME = 'proof_history';
constant STALE_PROOF_TIMEOUT_MS (line 13) | const STALE_PROOF_TIMEOUT_MS = 10 * 60 * 1000;
function openDatabase (line 20) | async function openDatabase() {
method insertProof (line 109) | async insertProof(proof: Omit<ProofHistory, 'id' | 'timestamp'>) {
method updateProofStatus (line 201) | async updateProofStatus(
function addDocumentIdColumn (line 217) | async function addDocumentIdColumn() {
function addEndpointColumn (line 224) | async function addEndpointColumn() {
FILE: app/src/stores/database.web.ts
constant DB_NAME (line 8) | const DB_NAME = 'proof_history_db';
constant STORE_NAME (line 9) | const STORE_NAME = 'proof_history';
constant DB_VERSION (line 10) | const DB_VERSION = 1;
constant PAGE_SIZE (line 11) | const PAGE_SIZE = 20;
class IndexedDBDatabase (line 13) | class IndexedDBDatabase implements ProofDB {
method openDatabase (line 16) | private async openDatabase(): Promise<IDBDatabase> {
method updateStaleProofs (line 49) | async updateStaleProofs(
method getPendingProofs (line 83) | async getPendingProofs(): Promise<ProofDBResult> {
method getHistory (line 99) | async getHistory(page: number = 1): Promise<ProofDBResult> {
method init (line 152) | async init(): Promise<void> {
method insertProof (line 157) | async insertProof(
method updateProofStatus (line 216) | async updateProofStatus(
FILE: app/src/stores/errorInjectionStore.ts
type InjectedErrorType (line 11) | type InjectedErrorType =
constant ERROR_GROUPS (line 24) | const ERROR_GROUPS = {
constant ERROR_LABELS (line 37) | const ERROR_LABELS: Record<InjectedErrorType, string> = {
type ErrorInjectionState (line 51) | interface ErrorInjectionState {
FILE: app/src/stores/pendingKycStore.ts
constant VERIFICATION_TIMEOUT_MS (line 14) | const VERIFICATION_TIMEOUT_MS = 48 * 60 * 60 * 1000;
type PendingKycState (line 16) | interface PendingKycState {
FILE: app/src/stores/pointEventStore.ts
type PointEventState (line 21) | interface PointEventState {
constant STORAGE_KEY (line 49) | const STORAGE_KEY = '@point_events';
constant DESIRED_EVENT_TYPES (line 51) | const DESIRED_EVENT_TYPES = ['refer', 'notification', 'backup', 'disclos...
FILE: app/src/stores/proofHistoryStore.ts
type ProofHistoryState (line 14) | interface ProofHistoryState {
constant SYNC_THROTTLE_MS (line 33) | const SYNC_THROTTLE_MS = 30 * 1000;
FILE: app/src/stores/proofTypes.ts
type ProofDB (line 7) | interface ProofDB {
type ProofDBResult (line 25) | interface ProofDBResult {
type ProofHistory (line 32) | interface ProofHistory {
type ProofStatus (line 49) | enum ProofStatus {
FILE: app/src/stores/settingStore.ts
type LoggingSeverity (line 9) | type LoggingSeverity = 'debug' | 'info' | 'warn' | 'error';
type PersistedSettingsState (line 11) | interface PersistedSettingsState {
type NonPersistedSettingsState (line 52) | interface NonPersistedSettingsState {
type SettingsState (line 63) | type SettingsState = PersistedSettingsState & NonPersistedSettingsState;
constant SETTING_STORE_VERSION (line 65) | const SETTING_STORE_VERSION = 1;
function waitForSettingStoreHydration (line 223) | function waitForSettingStoreHydration(): Promise<void> {
FILE: app/src/stores/userStore.ts
type UserState (line 9) | interface UserState {
FILE: app/src/types/mnemonic.ts
type Mnemonic (line 5) | interface Mnemonic {
FILE: app/src/types/react-native-keychain.d.ts
type ExtendedSetOptions (line 11) | type ExtendedSetOptions = SetOptions & {
FILE: app/src/types/reactNativePassportReader.d.ts
type ScanOptions (line 6) | interface ScanOptions {
type PassportReader (line 17) | interface PassportReader {
FILE: app/src/types/vite-env.d.ts
type ImportMetaEnv (line 5) | interface ImportMetaEnv {
type ImportMeta (line 13) | interface ImportMeta {
FILE: app/src/utils/cameraPermission.ts
constant CAMERA_PERMISSION (line 14) | const CAMERA_PERMISSION =
function safeCheck (line 17) | async function safeCheck(): Promise<string> {
function safeRequest (line 25) | async function safeRequest(): Promise<string> {
function openAppSettings (line 33) | function openAppSettings(): void {
function showBlockedAlert (line 39) | function showBlockedAlert(onFallback?: () => void): void {
function showUnavailableAlert (line 61) | function showUnavailableAlert(onFallback?: () => void): void {
function ensureCameraForPassportScan (line 80) | async function ensureCameraForPassportScan(opts?: {
FILE: app/src/utils/cardBackgroundSelector.ts
constant BACKGROUND_COUNT (line 13) | const BACKGROUND_COUNT = 6;
function getBackgroundIndex (line 20) | function getBackgroundIndex(document: IDDocument): number {
FILE: app/src/utils/countryDemonyms.ts
constant COUNTRY_DEMONYMS (line 6) | const COUNTRY_DEMONYMS: Record<string, string> = {
constant COUNTRY_ADJECTIVES (line 232) | const COUNTRY_ADJECTIVES: Record<string, string> = {
FILE: app/src/utils/crypto/ethers.ts
function randomBytes (line 12) | function randomBytes(length: number): Uint8Array {
function computeHmac (line 19) | function computeHmac(
function pbkdf2 (line 28) | function pbkdf2(
function sha256 (line 39) | function sha256(data: Uint8Array): Uint8Array {
function sha512 (line 43) | function sha512(data: Uint8Array): Uint8Array {
FILE: app/src/utils/crypto/mnemonic.ts
function getRecoveryPhraseWarningMessage (line 15) | function getRecoveryPhraseWarningMessage(): string {
function isMnemonic (line 25) | function isMnemonic(obj: unknown): obj is Mnemonic {
function parseMnemonic (line 48) | function parseMnemonic(mnemonicString: string): Mnemonic {
FILE: app/src/utils/devUtils.ts
constant IS_DEV_MODE (line 19) | const IS_DEV_MODE = typeof __DEV__ !== 'undefined' && __DEV__;
constant IS_EUCLID_ENABLED (line 20) | const IS_EUCLID_ENABLED = false;
constant TEST_DOCUMENTS (line 27) | const TEST_DOCUMENTS = [
function clearAllDocuments (line 83) | async function clearAllDocuments(): Promise<void> {
function generateTestDocuments (line 103) | async function generateTestDocuments(): Promise<number> {
FILE: app/src/utils/diffCalculator.ts
type FirstDifference (line 5) | interface FirstDifference {
function calculateFirstDifference (line 10) | function calculateFirstDifference(
FILE: app/src/utils/disclosureUtils.ts
function listToString (line 9) | function listToString(list: string[]): string {
function countriesToSentence (line 18) | function countriesToSentence(countries: Country3LetterCode[]): string {
constant ORDERED_DISCLOSURE_KEYS (line 22) | const ORDERED_DISCLOSURE_KEYS: Array<keyof SelfAppDisclosureConfig> = [
function getDisclosureItems (line 35) | function getDisclosureItems(
function getDisclosureText (line 59) | function getDisclosureText(
FILE: app/src/utils/documentAttributes.ts
type DocumentAttributes (line 24) | interface DocumentAttributes {
function checkDocumentExpiration (line 43) | function checkDocumentExpiration(dateOfExpiry: string): boolean {
function formatDateFromYYMMDD (line 75) | function formatDateFromYYMMDD(
function getDocumentAttributes (line 102) | function getDocumentAttributes(
function getKycAttributes (line 130) | function getKycAttributes(document: KycData): DocumentAttributes {
function getAadhaarAttributes (line 225) | function getAadhaarAttributes(document: AadhaarData): DocumentAttributes {
function getPassportAttributes (line 265) | function getPassportAttributes(
function getDocumentScanPrompt (line 324) | function getDocumentScanPrompt(
function getDocumentTypeName (line 331) | function getDocumentTypeName(documentType: string | undefined): string {
function getNameAndSurname (line 348) | function getNameAndSurname(nameSlice: string): {
FILE: app/src/utils/documentUtils.ts
function getDocumentTypeName (line 9) | function getDocumentTypeName(
FILE: app/src/utils/formatUserId.ts
function formatUserId (line 11) | function formatUserId(
FILE: app/src/utils/jsonUtils.ts
function safeJsonParse (line 13) | function safeJsonParse<T>(
function safeJsonStringify (line 37) | function safeJsonStringify<T>(
FILE: app/src/utils/keychainErrors.ts
type KeychainErrorIdentity (line 5) | type KeychainErrorIdentity = {
type KeychainError (line 10) | type KeychainError = {
type KeychainErrorType (line 16) | type KeychainErrorType = 'user_cancelled' | 'crypto_failed';
function getKeychainErrorIdentity (line 18) | function getKeychainErrorIdentity(
function isKeychainCryptoError (line 25) | function isKeychainCryptoError(error: unknown): boolean {
function isUserCancellation (line 39) | function isUserCancellation(error: unknown): boolean {
FILE: app/src/utils/modalCallbackRegistry.ts
type ModalCallbacks (line 5) | type ModalCallbacks = {
function getModalCallbacks (line 13) | function getModalCallbacks(id: number): ModalCallbacks | undefined {
function registerModalCallbacks (line 17) | function registerModalCallbacks(callbacks: ModalCallbacks): number {
function unregisterModalCallbacks (line 23) | function unregisterModalCallbacks(id: number): void {
FILE: app/src/utils/retry.ts
function withRetries (line 15) | async function withRetries<T>(
FILE: app/src/utils/styleUtils.ts
function normalizeBorderWidth (line 20) | function normalizeBorderWidth(borderWidth: unknown): number | undefined {
FILE: app/src/utils/webview.ts
type WebViewRequestWithIosProps (line 11) | interface WebViewRequestWithIosProps {
constant ALWAYS_OPEN_EXTERNALLY (line 26) | const ALWAYS_OPEN_EXTERNALLY = Object.freeze([
constant DISALLOWED_SCHEMES (line 35) | const DISALLOWED_SCHEMES = Object.freeze([
constant TRUSTED_DOMAINS (line 59) | const TRUSTED_DOMAINS = Object.freeze([
FILE: app/src/utils/yymmdd.ts
constant MONTHS (line 5) | const MONTHS = [
FILE: app/tamagui.config.ts
function makeFont (line 48) | function makeFont(family: string, weight: Record<number, string>) {
type AppConfig (line 72) | type AppConfig = typeof appConfig;
type TamaguiCustomConfig (line 80) | interface TamaguiCustomConfig extends AppConfig {}
FILE: app/tests/__setup__/@env.js
constant DEFAULT_DOB (line 5) | const DEFAULT_DOB = undefined;
constant DEFAULT_DOE (line 7) | const DEFAULT_DOE = undefined;
constant DEFAULT_PNUMBER (line 9) | const DEFAULT_PNUMBER = undefined;
constant ENABLE_DEBUG_LOGS (line 11) | const ENABLE_DEBUG_LOGS = false;
constant GOOGLE_SIGNIN_ANDROID_CLIENT_ID (line 13) | const GOOGLE_SIGNIN_ANDROID_CLIENT_ID = 'mock-google-client-id';
constant GOOGLE_SIGNIN_IOS_CLIENT_ID (line 15) | const GOOGLE_SIGNIN_IOS_CLIENT_ID = 'mock-google-ios-client-id';
constant GOOGLE_SIGNIN_WEB_CLIENT_ID (line 17) | const GOOGLE_SIGNIN_WEB_CLIENT_ID = 'mock-google-web-client-id';
constant IS_TEST_BUILD (line 19) | const IS_TEST_BUILD = false;
constant MIXPANEL_NFC_PROJECT_TOKEN (line 20) | const MIXPANEL_NFC_PROJECT_TOKEN = undefined;
constant SEGMENT_KEY (line 21) | const SEGMENT_KEY = 'mock-segment-key';
constant SENTRY_DSN (line 22) | const SENTRY_DSN = 'mock-sentry-dsn';
FILE: app/tests/src/integrations/nfc/nfcScanner.test.ts
method OS (line 27) | get OS() {
FILE: app/tests/src/providers/selfClientProvider.test.tsx
class MockSocket (line 128) | class MockSocket {
method constructor (line 130) | constructor(url: string) {
method addEventListener (line 133) | addEventListener() {}
method send (line 134) | send() {}
method close (line 135) | close() {}
FILE: app/tests/src/proving/validateDocument.test.ts
function buildModuleState (line 121) | function buildModuleState(alternative: Record<string, unknown> = {}) {
function buildState (line 130) | function buildState(params?: {
FILE: app/tests/src/screens/WebViewScreen.test.tsx
type IntrinsicElements (line 24) | interface IntrinsicElements {
FILE: app/tests/src/screens/account/recovery/RecoverWithPhraseScreen.test.tsx
type IntrinsicElements (line 12) | interface IntrinsicElements {
FILE: app/tests/src/screens/documents/management/ManageDocumentsScreen.test.tsx
type IntrinsicElements (line 14) | interface IntrinsicElements {
FILE: app/tests/src/screens/documents/scanning/DataConfirmationScreen.test.tsx
function changeDocumentNumber (line 128) | function changeDocumentNumber(value: string) {
FILE: app/tests/src/screens/verification/DocumentSelectorForProvingScreen.test.tsx
type MockDocumentEntry (line 79) | type MockDocumentEntry = {
FILE: app/tests/src/screens/verification/ProofRequestStatusScreen.test.tsx
type IntrinsicElements (line 20) | interface IntrinsicElements {
FILE: app/tests/src/screens/verification/ProvingScreenRouter.test.tsx
type MockDocumentEntry (line 70) | type MockDocumentEntry = {
FILE: app/tests/src/services/cloud-backup.test.ts
type SupportedPlatforms (line 14) | type SupportedPlatforms = 'ios' | 'android';
FILE: app/tests/src/services/logging/lokiTransport.test.ts
method supportUuidEnabled (line 39) | get supportUuidEnabled() {
method supportUuid (line 42) | get supportUuid() {
FILE: app/tests/src/services/supportUuid.test.ts
method supportUuidEnabled (line 36) | get supportUuidEnabled() {
method supportUuid (line 39) | get supportUuid() {
FILE: app/tests/src/utils/cardBackgroundSelector.test.ts
constant BACKGROUND_COUNT (line 10) | const BACKGROUND_COUNT = 6;
function createKycDocument (line 12) | function createKycDocument(serializedApplicantInfo: string): IDDocument {
FILE: app/vite.config.ts
method transform (line 68) | transform(code, id) {
FILE: circuits/circuits/gcp_jwt_verifier/prepare.ts
constant MAX_CERT_LENGTH (line 18) | const MAX_CERT_LENGTH = 2048;
constant MAX_EAT_NONCE_B64_LENGTH (line 19) | const MAX_EAT_NONCE_B64_LENGTH = 99;
constant MAX_IMAGE_DIGEST_LENGTH (line 20) | const MAX_IMAGE_DIGEST_LENGTH = 71;
type CertificateInfo (line 22) | interface CertificateInfo {
function parseCertificate (line 34) | function parseCertificate(certDer: Buffer): CertificateInfo {
function pubkeyToChunks (line 124) | function pubkeyToChunks(publicKey: forge.pki.rsa.PublicKey): string[] {
function signatureToChunks (line 145) | function signatureToChunks(signature: Buffer): string[] {
function rechunkSignatureToK35 (line 165) | function rechunkSignatureToK35(signatureChunks: string[]): string[] {
function bufferToByteArray (line 190) | function bufferToByteArray(buffer: Buffer, maxLength: number): string[] {
function getCurrentDateDigitsYYMMDDHHMMSS (line 198) | function getCurrentDateDigitsYYMMDDHHMMSS(): string[] {
function main (line 210) | async function main() {
FILE: circuits/src/index.ts
constant CIRCUITS_VERSION (line 5) | const CIRCUITS_VERSION = '0.0.1';
constant SUPPORTED_SIGNATURE_ALGORITHMS (line 8) | const SUPPORTED_SIGNATURE_ALGORITHMS = [
type SupportedSignatureAlgorithm (line 21) | type SupportedSignatureAlgorithm = (typeof SUPPORTED_SIGNATURE_ALGORITHM...
FILE: circuits/tests/disclose/vc_and_disclose_aadhaar.test.ts
function createAadhaarDoc (line 48) | function createAadhaarDoc(opts?: {
function getPackedRevealData (line 93) | function getPackedRevealData(revealedData: any): string[] {
FILE: circuits/tests/other_circuits/is_older_than.test.ts
function generateRandomDate (line 40) | function generateRandomDate(yearStart, yearEnd) {
function genDateStr (line 158) | function genDateStr(currentDate: { year: number; month: number; day: num...
function getAgeFromDates (line 165) | function getAgeFromDates(
FILE: circuits/tests/other_circuits/is_valid.test.ts
function generateRandomDate (line 31) | function generateRandomDate(yearStart, yearEnd) {
function genDateStr (line 152) | function genDateStr(currentDate: { year: number; month: number; day: num...
function getAgeFromDates (line 159) | function getAgeFromDates(
FILE: circuits/tests/register/register_aadhaar.test.ts
function createAadhaarDoc (line 33) | function createAadhaarDoc(opts?: {
FILE: circuits/tests/register/test_cases.ts
type TestCase (line 2) | interface TestCase {
FILE: circuits/tests/register_id/test_cases.ts
type TestCase (line 2) | interface TestCase {
FILE: circuits/tests/utils/aadhaar/utils.ts
function stringToAsciiArray (line 1) | function stringToAsciiArray(str: string) {
FILE: circuits/tests/utils/ecdsa.test.ts
function sign (line 258) | function sign(message: Uint8Array, curve: string, hash: string, n: numbe...
function signOverflow (line 285) | function signOverflow(
FILE: common/scripts/certificates/concatCertificates.ts
function readFile (line 16) | function readFile(dir: string, filename: string): string | null {
FILE: common/scripts/postBuild.mjs
constant DIST (line 8) | const DIST = path.resolve(__dirname, '..', 'dist');
function createShim (line 39) | function createShim(shimPath, targetPath, name) {
FILE: common/scripts/testExports.js
constant BUILD_DIR (line 16) | const BUILD_DIR = join(__dirname, '..', 'dist', 'esm');
function verifyBuildDirectory (line 27) | function verifyBuildDirectory() {
function safeImport (line 38) | async function safeImport(modulePath, description) {
function testExport (line 55) | async function testExport(modulePath, exportName, description) {
function testModuleExports (line 78) | async function testModuleExports(modulePath, description) {
function testDirectoryExports (line 110) | async function testDirectoryExports(dirPath, categoryName) {
function testReExports (line 134) | async function testReExports() {
FILE: common/scripts/validateExports.js
constant BUILD_DIR (line 16) | const BUILD_DIR = join(__dirname, '..', 'dist', 'esm');
constant PACKAGE_JSON_PATH (line 17) | const PACKAGE_JSON_PATH = join(__dirname, '..', 'package.json');
function loadPackageExports (line 29) | function loadPackageExports() {
function getAvailableModules (line 40) | function getAvailableModules() {
function validatePackageExports (line 66) | function validatePackageExports() {
function findMissingExports (line 100) | function findMissingExports() {
function generateExportSuggestions (line 145) | function generateExportSuggestions() {
function runValidation (line 153) | async function runValidation() {
FILE: common/src/constants/constants.ts
type Country3LetterCode (line 1) | type Country3LetterCode = keyof typeof countryCodes;
type document_type (line 2) | type document_type = 'passport' | 'id_card';
type hashAlgosTypes (line 3) | type hashAlgosTypes = 'sha512' | 'sha384' | 'sha256' | 'sha224' | 'sha1';
constant AADHAAR_ATTESTATION_ID (line 4) | const AADHAAR_ATTESTATION_ID = '3';
constant API_URL (line 5) | const API_URL = 'https://api.self.xyz';
constant API_URL_STAGING (line 6) | const API_URL_STAGING = 'https://api.staging.self.xyz';
constant CHAIN_NAME (line 8) | const CHAIN_NAME = 'celo';
constant CIRCUIT_CONSTANTS (line 11) | const CIRCUIT_CONSTANTS = {
constant CIRCUIT_TYPES (line 32) | const CIRCUIT_TYPES = ['dsc', 'register', 'vc_and_disclose'];
constant COMMITMENT_TREE_DEPTH (line 34) | const COMMITMENT_TREE_DEPTH = 33;
constant CSCA_TREE_DEPTH (line 36) | const CSCA_TREE_DEPTH = 12;
constant CSCA_TREE_URL (line 38) | const CSCA_TREE_URL = 'https://tree.self.xyz/csca';
constant CSCA_TREE_URL_ID_CARD (line 40) | const CSCA_TREE_URL_ID_CARD = 'https://tree.self.xyz/csca-id';
constant CSCA_TREE_URL_STAGING (line 42) | const CSCA_TREE_URL_STAGING = 'https://tree.staging.self.xyz/csca';
constant CSCA_TREE_URL_STAGING_ID_CARD (line 44) | const CSCA_TREE_URL_STAGING_ID_CARD = 'https://tree.staging.self.xyz/csc...
constant KYC_ATTESTATION_ID (line 46) | const KYC_ATTESTATION_ID = '4';
constant DEFAULT_MAJORITY (line 49) | const DEFAULT_MAJORITY = '18';
constant DEFAULT_RPC_URL (line 51) | const DEFAULT_RPC_URL = 'https://mainnet.optimism.io';
constant DEFAULT_USER_ID_TYPE (line 53) | const DEFAULT_USER_ID_TYPE = 'uuid';
constant DEVELOPMENT_MODE (line 55) | const DEVELOPMENT_MODE = true;
constant DSC_TREE_DEPTH (line 57) | const DSC_TREE_DEPTH = 21;
constant DSC_TREE_URL (line 59) | const DSC_TREE_URL = 'https://tree.self.xyz/dsc';
constant DSC_TREE_URL_ID_CARD (line 61) | const DSC_TREE_URL_ID_CARD = 'https://tree.self.xyz/dsc-id';
constant DSC_TREE_URL_STAGING (line 63) | const DSC_TREE_URL_STAGING = 'https://tree.staging.self.xyz/dsc';
constant DSC_TREE_URL_STAGING_ID_CARD (line 65) | const DSC_TREE_URL_STAGING_ID_CARD = 'https://tree.staging.self.xyz/dsc-...
type DscVerifierId (line 67) | enum DscVerifierId {
constant ECDSA_K_LENGTH_FACTOR (line 90) | const ECDSA_K_LENGTH_FACTOR = 2;
constant IDENTITY_TREE_URL (line 92) | const IDENTITY_TREE_URL = 'https://tree.self.xyz/identity';
constant IDENTITY_TREE_URL_ID_CARD (line 95) | const IDENTITY_TREE_URL_ID_CARD = 'https://tree.self.xyz/identity-id';
constant IDENTITY_TREE_URL_STAGING (line 97) | const IDENTITY_TREE_URL_STAGING = 'https://tree.staging.self.xyz/identity';
constant IDENTITY_TREE_URL_STAGING_ID_CARD (line 99) | const IDENTITY_TREE_URL_STAGING_ID_CARD = 'https://tree.staging.self.xyz...
constant IDENTITY_VERIFICATION_HUB_ADDRESS (line 101) | const IDENTITY_VERIFICATION_HUB_ADDRESS = '0xe57F4773bd9c9d8b6Cd70431117...
constant IDENTITY_VERIFICATION_HUB_ADDRESS_STAGING (line 103) | const IDENTITY_VERIFICATION_HUB_ADDRESS_STAGING =
constant ID_CARD_ATTESTATION_ID (line 106) | const ID_CARD_ATTESTATION_ID = '2';
constant MAX_BYTES_IN_FIELD (line 108) | const MAX_BYTES_IN_FIELD = 31;
constant MAX_CERT_BYTES (line 110) | const MAX_CERT_BYTES: Partial<Record<keyof typeof SignatureAlgorithmInde...
constant MAX_DATAHASHES_LEN (line 128) | const MAX_DATAHASHES_LEN = 320;
constant MAX_FORBIDDEN_COUNTRIES_LIST_LENGTH (line 130) | const MAX_FORBIDDEN_COUNTRIES_LIST_LENGTH = 40;
constant MAX_PADDED_ECONTENT_LEN (line 132) | const MAX_PADDED_ECONTENT_LEN: Partial<Record<(typeof hashAlgos)[number]...
constant MAX_PADDED_SIGNED_ATTR_LEN (line 140) | const MAX_PADDED_SIGNED_ATTR_LEN: Record<(typeof hashAlgos)[number], num...
constant MAX_PADDED_SIGNED_ATTR_LEN_FOR_TESTS (line 148) | const MAX_PADDED_SIGNED_ATTR_LEN_FOR_TESTS: Record<(typeof hashAlgos)[nu...
constant MAX_PUBKEY_DSC_BYTES (line 158) | const MAX_PUBKEY_DSC_BYTES = 525;
constant OFAC_TREE_LEVELS (line 160) | const OFAC_TREE_LEVELS = 64;
constant PASSPORT_ATTESTATION_ID (line 163) | const PASSPORT_ATTESTATION_ID = '1';
constant PCR0_MANAGER_ADDRESS (line 165) | const PCR0_MANAGER_ADDRESS = '0xE36d4EE5Fd3916e703A46C21Bb3837dB7680C8B8';
constant REDIRECT_URL (line 167) | const REDIRECT_URL = 'https://redirect.self.xyz';
constant REGISTER_CONTRACT_ADDRESS (line 169) | const REGISTER_CONTRACT_ADDRESS = '0x3F346FFdC5d583e4126AF01A02Ac5b9CdB3...
constant RPC_URL (line 171) | const RPC_URL = 'https://forno.celo.org';
type RegisterVerifierId (line 173) | enum RegisterVerifierId {
constant SBT_CONTRACT_ADDRESS (line 228) | const SBT_CONTRACT_ADDRESS = '0x601Fd54FD11C5E77DE84d877e55B829aff20f0A6';
type SignatureAlgorithmIndex (line 230) | enum SignatureAlgorithmIndex {
constant TREE_TRACKER_URL (line 266) | const TREE_TRACKER_URL = 'https://tree.self.xyz';
constant TREE_URL (line 268) | const TREE_URL = 'https://tree.self.xyz';
constant TREE_URL_STAGING (line 269) | const TREE_URL_STAGING = 'https://tree.staging.self.xyz';
constant WS_DB_RELAYER (line 271) | const WS_DB_RELAYER = 'wss://websocket.self.xyz';
constant WS_DB_RELAYER_STAGING (line 273) | const WS_DB_RELAYER_STAGING = 'wss://websocket.staging.self.xyz';
constant WS_RPC_URL_VC_AND_DISCLOSE (line 275) | const WS_RPC_URL_VC_AND_DISCLOSE = 'ws://disclose.proving.self.xyz:8888/';
function getCountryCode (line 582) | function getCountryCode(countryName: string): string {
FILE: common/src/constants/countries.ts
type Country3LetterCode (line 1) | type Country3LetterCode = (typeof countries)[keyof typeof countries];
function alpha2ToAlpha3 (line 3) | function alpha2ToAlpha3(key: string): Country3LetterCode | undefined {
function alpha3ToAlpha2 (line 7) | function alpha3ToAlpha2(key: string) {
constant ALPHA2_TO_ALPHA3 (line 526) | const ALPHA2_TO_ALPHA3 = {
constant ALPHA3_TO_ALPHA2 (line 778) | const ALPHA3_TO_ALPHA2 = Object.fromEntries(
function getCountryISO2 (line 785) | function getCountryISO2(key: string) {
FILE: common/src/constants/skiPem.ts
constant SKI_PEM (line 3) | const SKI_PEM: Record<string, string> = {
constant SKI_PEM_DEV (line 524) | const SKI_PEM_DEV: Record<string, string> = {
FILE: common/src/mock_certificates/aadhaar/mockAadhaarCert.ts
constant AADHAAR_MOCK_PRIVATE_KEY_PEM (line 4) | const AADHAAR_MOCK_PRIVATE_KEY_PEM = `-----BEGIN PRIVATE KEY-----
constant AADHAAR_MOCK_PUBLIC_KEY_PEM (line 34) | const AADHAAR_MOCK_PUBLIC_KEY_PEM = `-----BEGIN CERTIFICATE-----
FILE: common/src/polyfills/crypto.ts
function createHash (line 18) | function createHash(algorithm: string) {
function createHmac (line 78) | function createHmac(algorithm: string, key: string | Uint8Array) {
function randomBytes (line 143) | function randomBytes(size: number): Uint8Array | Buffer {
function pbkdf2Sync (line 159) | function pbkdf2Sync(
FILE: common/src/scripts/addCertificatesInTs.py
function read_certificate_content (line 4) | def read_certificate_content(file_path):
function read_private_key_content (line 26) | def read_private_key_content(file_path):
function format_variable_name (line 52) | def format_variable_name(dir_name):
function generate_typescript_file (line 60) | def generate_typescript_file():
FILE: common/src/scripts/addSkiPemToTs.py
function read_json_file (line 5) | def read_json_file(json_path: str) -> dict:
function generate_typescript_from_ski_json (line 15) | def generate_typescript_from_ski_json():
FILE: common/src/utils/aadhaar/build_aadhaar_ofac_smt.ts
function build_aadhaar_ofac_smt (line 5) | async function build_aadhaar_ofac_smt() {
FILE: common/src/utils/aadhaar/constants.ts
constant MAX_FIELD_BYTE_SIZE (line 2) | const MAX_FIELD_BYTE_SIZE = 31;
constant NAME_MAX_LENGTH (line 3) | const NAME_MAX_LENGTH = 2 * MAX_FIELD_BYTE_SIZE;
constant TOTAL_REVEAL_DATA_LENGTH (line 4) | const TOTAL_REVEAL_DATA_LENGTH = 119;
constant AADHAAR_PUBLIC_SIGNAL_INDICES (line 7) | const AADHAAR_PUBLIC_SIGNAL_INDICES = {
type AadhaarPublicSignal (line 42) | type AadhaarPublicSignal = keyof typeof AADHAAR_PUBLIC_SIGNAL_INDICES;
function getPublicSignalValue (line 44) | function getPublicSignalValue(
function getRevealDataPackedChunks (line 55) | function getRevealDataPackedChunks(publicSignals: string[]): string[] {
function getForbiddenCountriesListPackedChunks (line 62) | function getForbiddenCountriesListPackedChunks(publicSignals: string[]):...
constant FIELD_LENGTHS (line 70) | const FIELD_LENGTHS = {
constant REVEAL_DATA_INDICES (line 85) | const REVEAL_DATA_INDICES = {
constant REVEAL_DATA_END_INDICES (line 103) | const REVEAL_DATA_END_INDICES = {
constant REVEAL_DATA_RANGES (line 123) | const REVEAL_DATA_RANGES = {
constant SELECTOR_BITS (line 163) | const SELECTOR_BITS = {
type AadhaarField (line 179) | type AadhaarField = keyof typeof FIELD_LENGTHS;
function extractField (line 187) | function extractField(unpackedData: string[], field: AadhaarField): stri...
function createSelector (line 211) | function createSelector(fieldsToReveal: AadhaarField[]): bigint {
constant COMMON_FIELD_COMBINATIONS (line 237) | const COMMON_FIELD_COMBINATIONS = {
FILE: common/src/utils/aadhaar/mockData.ts
function computePaddedName (line 37) | function computePaddedName(name: string): number[] {
function computeUppercasePaddedName (line 44) | function computeUppercasePaddedName(name: string): number[] {
function computeCommitment (line 53) | function computeCommitment(
function computePackedCommitment (line 64) | function computePackedCommitment(
function convertByteArrayToBigInt (line 77) | function convertByteArrayToBigInt(byteArray: Uint8Array | number[]): big...
type SharedQRData (line 85) | interface SharedQRData {
function nullifierHash (line 98) | function nullifierHash(extractedFields: ReturnType<typeof extractQRDataF...
function prepareAadhaarDiscloseData (line 111) | function prepareAadhaarDiscloseData(
function prepareAadhaarDiscloseTestData (line 245) | function prepareAadhaarDiscloseTestData(
function prepareAadhaarRegisterData (line 366) | async function prepareAadhaarRegisterData(qrData: string, secret: string...
function prepareAadhaarRegisterTestData (line 444) | function prepareAadhaarRegisterTestData(
function processQRData (line 522) | function processQRData(
function processQRDataSimple (line 557) | function processQRDataSimple(qrData: string) {
FILE: common/src/utils/aadhaar/utils.ts
type ExtractedQRData (line 18) | interface ExtractedQRData {
constant FIELD_POSITIONS (line 31) | const FIELD_POSITIONS = {
function calculateAge (line 64) | function calculateAge(
function extractQRDataFields (line 245) | function extractQRDataFields(qrData: string | Uint8Array): ExtractedQRDa...
function getAadharRegistrationWindow (line 382) | async function getAadharRegistrationWindow() {
function returnNewDateString (line 400) | function returnNewDateString(timestamp?: string): string {
function asciiArrayToString (line 420) | function asciiArrayToString(asciiArray: number[]): string {
function extractFieldData (line 427) | function extractFieldData(
function stringToAsciiArray (line 448) | function stringToAsciiArray(str: string) {
FILE: common/src/utils/appType.ts
type DeferredLinkingTokenResponse (line 9) | interface DeferredLinkingTokenResponse {
type EndpointType (line 14) | type EndpointType = 'https' | 'celo' | 'staging_celo' | 'staging_https';
type Mode (line 16) | type Mode = 'register' | 'dsc' | 'vc_and_disclose';
type SelfApp (line 18) | interface SelfApp {
type SelfAppDisclosureConfig (line 37) | interface SelfAppDisclosureConfig {
class SelfAppBuilder (line 52) | class SelfAppBuilder {
method constructor (line 55) | constructor(config: Partial<SelfApp>) {
method build (line 124) | build(): SelfApp {
function getUniversalLink (line 129) | function getUniversalLink(selfApp: SelfApp): string {
FILE: common/src/utils/arrays.ts
function arraysAreEqual (line 1) | function arraysAreEqual(array1: number[], array2: number[]) {
function findSubarrayIndex (line 5) | function findSubarrayIndex(arr: number[], subArr: number[]): number {
FILE: common/src/utils/attest.ts
constant GCP_ROOT_CERT (line 6) | const GCP_ROOT_CERT = `
function base64UrlDecodeToBytes (line 46) | function base64UrlDecodeToBytes(input: string): string {
function base64UrlDecodeToString (line 52) | function base64UrlDecodeToString(input: string): string {
type PKICertificates (line 58) | type PKICertificates = {
function extractCertificates (line 64) | function extractCertificates(x5c: string[]): PKICertificates {
function compareCertificates (line 75) | function compareCertificates(cert1: forge.pki.Certificate, cert2: forge....
function verifyCertificateChain (line 89) | function verifyCertificateChain({ leaf, intermediate, root }: PKICertifi...
function checkPCR0Mapping (line 111) | async function checkPCR0Mapping(imageHashHex: string): Promise<boolean> {
function validatePKIToken (line 140) | function validatePKIToken(
FILE: common/src/utils/bytes.ts
function bigIntToChunkedBytes (line 3) | function bigIntToChunkedBytes(
function bytesToBigDecimal (line 16) | function bytesToBigDecimal(arr: number[]): string {
function computeIntChunkLength (line 24) | function computeIntChunkLength(byteLength: number) {
function derToBytes (line 34) | function derToBytes(derValue: string) {
function hexStringToSignedIntArray (line 42) | function hexStringToSignedIntArray(hexString: string) {
function hexToBin (line 51) | function hexToBin(n: string): string {
function hexToDecimal (line 59) | function hexToDecimal(hex: string): string {
function hexToSignedBytes (line 63) | function hexToSignedBytes(hexString: string): number[] {
function num2Bits (line 72) | function num2Bits(n: number, inValue: bigint): bigint[] {
function packBytes (line 94) | function packBytes(unpacked: number[]) {
function packBytesArray (line 110) | function packBytesArray(unpacked: number[]) {
function splitToWords (line 140) | function splitToWords(number: bigint, wordsize: number, numberElement: n...
function toSigned (line 160) | function toSigned(byte: number) {
function toUnsigned (line 163) | function toUnsigned(byte: number) {
function toUnsignedByte (line 166) | function toUnsignedByte(signedByte: number) {
FILE: common/src/utils/certificate_parsing/curves.ts
type StandardCurve (line 1) | interface StandardCurve {
function getCurveForElliptic (line 11) | function getCurveForElliptic(curveName: string): string {
function getECDSACurveBits (line 30) | function getECDSACurveBits(curveName: string): string {
function identifyCurve (line 48) | function identifyCurve(params: any): string {
function normalizeHex (line 74) | function normalizeHex(hex: string): string {
FILE: common/src/utils/certificate_parsing/dataStructure.ts
type CertificateData (line 3) | interface CertificateData {
type PublicKeyDetailsECDSA (line 26) | interface PublicKeyDetailsECDSA {
type PublicKeyDetailsRSA (line 34) | interface PublicKeyDetailsRSA {
type PublicKeyDetailsRSAPSS (line 40) | interface PublicKeyDetailsRSAPSS extends PublicKeyDetailsRSA {
FILE: common/src/utils/certificate_parsing/elliptic.ts
function initElliptic (line 4) | function initElliptic(): typeof elliptic {
FILE: common/src/utils/certificate_parsing/oids.ts
function extractHashFunction (line 1) | function extractHashFunction(friendlyName: string): string {
function getFriendlyName (line 19) | function getFriendlyName(oid: string): string {
function getSecpFromNist (line 23) | function getSecpFromNist(nist: string): string {
function getFriendlyNameSecpCurves (line 37) | function getFriendlyNameSecpCurves(friendlyName: string): string {
FILE: common/src/utils/certificate_parsing/parseCertificate.ts
function parseCertificate (line 4) | async function parseCertificate(pem: string, fileName: string): Promise<...
FILE: common/src/utils/certificate_parsing/parseCertificateNode.ts
function addOpenSslInfo (line 6) | function addOpenSslInfo(
FILE: common/src/utils/certificate_parsing/parseCertificateSimple.ts
function getParamsRSA (line 44) | function getParamsRSA(cert: Certificate): PublicKeyDetailsRSA {
function getParamsRSAPSS (line 59) | function getParamsRSAPSS(cert: Certificate): PublicKeyDetailsRSAPSS {
function getCertificateFromPem (line 93) | function getCertificateFromPem(pemContent: string): Certificate {
function getHashAlgorithm (line 161) | function getHashAlgorithm(rawSignatureAlgorithm: string) {
function getParamsECDSA (line 176) | function getParamsECDSA(cert: Certificate): PublicKeyDetailsECDSA {
function getTBSBytesForge (line 297) | function getTBSBytesForge(certificate: Certificate): number[] {
function parseCertificateSimple (line 301) | function parseCertificateSimple(pem: string): CertificateData {
FILE: common/src/utils/certificate_parsing/utils.ts
function getIssuerCountryCode (line 27) | function getIssuerCountryCode(cert: Certificate): string {
FILE: common/src/utils/circuits/circuitsName.ts
function getCircuitNameFromPassportData (line 3) | function getCircuitNameFromPassportData(
function getDSCircuitNameFromPassportData (line 14) | function getDSCircuitNameFromPassportData(passportData: IDDocument) {
function getRegisterNameFromPassportData (line 87) | function getRegisterNameFromPassportData(passportData: IDDocument) {
FILE: common/src/utils/circuits/formatInputs.ts
function formatCountriesList (line 12) | function formatCountriesList(countries: string[]) {
function reverseBytes (line 54) | function reverseBytes(input: string): string {
function reverseCountryBytes (line 64) | function reverseCountryBytes(input: string): string {
FILE: common/src/utils/circuits/formatOutputs.ts
function formatAndUnpackForbiddenCountriesList (line 4) | function formatAndUnpackForbiddenCountriesList(
function trimu0000 (line 26) | function trimu0000(unpackedReveal: string[]): string[] {
function formatAndUnpackReveal (line 30) | function formatAndUnpackReveal(
function formatForbiddenCountriesListFromCircuitOutput (line 54) | function formatForbiddenCountriesListFromCircuitOutput(
function getAttributeFromUnpackedReveal (line 71) | function getAttributeFromUnpackedReveal(
function getOlderThanFromCircuitOutput (line 87) | function getOlderThanFromCircuitOutput(olderThan: string[]): number {
function revealBitmapFromAttributes (line 93) | function revealBitmapFromAttributes(
function revealBitmapFromMapping (line 109) | function revealBitmapFromMapping(attributeToReveal: { [key: string]: str...
function unpackReveal (line 121) | function unpackReveal(
FILE: common/src/utils/circuits/generateInputs.ts
function findIndexInTree (line 45) | function findIndexInTree(tree: LeanIMT, commitment: bigint): number {
function formatInput (line 58) | function formatInput(input: any) {
function generateCircuitInputsCountryVerifier (line 80) | function generateCircuitInputsCountryVerifier(
function generateCircuitInputsDSC (line 98) | function generateCircuitInputsDSC(
function generateCircuitInputsOfac (line 152) | function generateCircuitInputsOfac(
function generateCircuitInputsRegister (line 204) | function generateCircuitInputsRegister(
function generateCircuitInputsRegisterForTests (line 276) | function generateCircuitInputsRegisterForTests(
function generateCircuitInputsVCandDisclose (line 348) | function generateCircuitInputsVCandDisclose(
FILE: common/src/utils/circuits/registerInputs.ts
function generateTEEInputsAadhaarDisclose (line 39) | function generateTEEInputsAadhaarDisclose(
function generateTEEInputsAadhaarRegister (line 98) | async function generateTEEInputsAadhaarRegister(
function generateTEEInputsDSC (line 120) | function generateTEEInputsDSC(
function generateTEEInputsDiscloseStateless (line 132) | function generateTEEInputsDiscloseStateless(
function getSelectorDg1 (line 223) | function getSelectorDg1(document: DocumentCategory, disclosures: SelfApp...
function getSelectorDg1Passport (line 232) | function getSelectorDg1Passport(disclosures: SelfAppDisclosureConfig) {
function getSelectorDg1IdCard (line 246) | function getSelectorDg1IdCard(disclosures: SelfAppDisclosureConfig) {
function generateTEEInputsKycDisclose (line 260) | function generateTEEInputsKycDisclose(
function generateTEEInputsRegister (line 326) | async function generateTEEInputsRegister(
FILE: common/src/utils/circuits/uuid.ts
type UserIdType (line 1) | type UserIdType = 'hex' | 'uuid';
function hexToBigInt (line 3) | function hexToBigInt(hex: string): bigint {
function checkBigInt (line 7) | function checkBigInt(bigInt: bigint) {
function uuidToBigInt (line 14) | function uuidToBigInt(uuid: string): bigint {
function bigIntToHex (line 20) | function bigIntToHex(bigInt: bigint): string {
function castFromScope (line 24) | function castFromScope(scope: string): string {
function castFromUUID (line 29) | function castFromUUID(uuid: string): string {
function castToAddress (line 35) | function castToAddress(bigInt: bigint): string {
function castToScope (line 39) | function castToScope(num: bigint): string {
function castToUUID (line 45) | function castToUUID(bigInt: bigint): string {
function checkStringLength (line 51) | function checkStringLength(str: string) {
function stringToBigInt (line 57) | function stringToBigInt(str: string): bigint {
function castToUserIdentifier (line 66) | function castToUserIdentifier(bigInt: bigint, user_identifier_type: User...
function hexToUUID (line 75) | function hexToUUID(hex: string): string {
function stringToAsciiBigIntArray (line 79) | function stringToAsciiBigIntArray(str: string): bigint[] {
function validateUserId (line 87) | function validateUserId(userId: string, type: UserIdType): boolean {
FILE: common/src/utils/contracts/forbiddenCountries.ts
function getPackedForbiddenCountries (line 4) | function getPackedForbiddenCountries(
FILE: common/src/utils/contracts/formatCallData.ts
function formatCallData_disclose (line 1) | function formatCallData_disclose(parsedCallData: any[]) {
function formatCallData_dsc (line 22) | function formatCallData_dsc(parsedCallData: any[]) {
function formatCallData_register (line 32) | function formatCallData_register(parsedCallData: any[]) {
function formatProof (line 44) | function formatProof(proof: any, publicSignals: any) {
function packForbiddenCountriesList (line 56) | function packForbiddenCountriesList(forbiddenCountries: string[]) {
FILE: common/src/utils/cose.ts
constant AWS_ROOT_PEM (line 58) | const AWS_ROOT_PEM = `
FILE: common/src/utils/csca.ts
function findOIDPosition (line 4) | function findOIDPosition(
function findStartIndex (line 73) | function findStartIndex(modulus: string, messagePaddedNumber: number[]):...
function findStartIndexEC (line 102) | function findStartIndexEC(point: string, messagePadded: number[]): [numb...
function getCSCAFromSKI (line 124) | function getCSCAFromSKI(ski: string, skiPem: any = null): string {
function getSKIPEM (line 153) | async function getSKIPEM(
FILE: common/src/utils/date.ts
function getCurrentDateYYMMDD (line 1) | function getCurrentDateYYMMDD(dayDiff: number = 0): number[] {
function getTimestampBytesFromYearFraction (line 15) | function getTimestampBytesFromYearFraction(yearFraction: number): number...
function unixTimestampToYYMMDD (line 41) | function unixTimestampToYYMMDD(timestamp: number): string {
function yearFractionToYYMMDD (line 58) | function yearFractionToYYMMDD(yearFraction: number): string {
function yymmddToByteArray (line 77) | function yymmddToByteArray(yymmdd: string): number[] {
FILE: common/src/utils/hash.ts
function calculateUserIdentifierHash (line 28) | function calculateUserIdentifierHash(
function customHasher (line 44) | function customHasher(pubKeyFormatted: string[]) {
function flexiblePoseidon (line 69) | function flexiblePoseidon(inputs: bigint[]): bigint {
function getHashLen (line 108) | function getHashLen(hashFunction: string) {
function getSolidityPackedUserContextData (line 126) | function getSolidityPackedUserContextData(
function hash (line 144) | function hash(
function packBytesAndPoseidon (line 185) | function packBytesAndPoseidon(unpacked: number[]) {
FILE: common/src/utils/kyc/api.ts
function deserializeApplicantInfo (line 34) | function deserializeApplicantInfo(
function deserializeSignature (line 94) | function deserializeSignature(signature: string): { R: Point<bigint>; s:...
FILE: common/src/utils/kyc/constants.ts
constant KYC_COUNTRY_INDEX (line 4) | const KYC_COUNTRY_INDEX = 0;
constant KYC_COUNTRY_LENGTH (line 5) | const KYC_COUNTRY_LENGTH = 3;
constant KYC_ID_TYPE_INDEX (line 7) | const KYC_ID_TYPE_INDEX = KYC_COUNTRY_INDEX + KYC_COUNTRY_LENGTH;
constant KYC_ID_TYPE_LENGTH (line 8) | const KYC_ID_TYPE_LENGTH = 27;
constant KYC_ID_NUMBER_INDEX (line 10) | const KYC_ID_NUMBER_INDEX = KYC_ID_TYPE_INDEX + KYC_ID_TYPE_LENGTH;
constant KYC_ID_NUMBER_LENGTH (line 11) | const KYC_ID_NUMBER_LENGTH = 32;
constant KYC_ISSUANCE_DATE_INDEX (line 13) | const KYC_ISSUANCE_DATE_INDEX = KYC_ID_NUMBER_INDEX + KYC_ID_NUMBER_LENGTH;
constant KYC_ISSUANCE_DATE_LENGTH (line 14) | const KYC_ISSUANCE_DATE_LENGTH = 8;
constant KYC_EXPIRY_DATE_INDEX (line 16) | const KYC_EXPIRY_DATE_INDEX = KYC_ISSUANCE_DATE_INDEX + KYC_ISSUANCE_DAT...
constant KYC_EXPIRY_DATE_LENGTH (line 17) | const KYC_EXPIRY_DATE_LENGTH = 8;
constant KYC_FULL_NAME_INDEX (line 19) | const KYC_FULL_NAME_INDEX = KYC_EXPIRY_DATE_INDEX + KYC_EXPIRY_DATE_LENGTH;
constant KYC_FULL_NAME_LENGTH (line 20) | const KYC_FULL_NAME_LENGTH = 64;
constant KYC_DOB_INDEX (line 22) | const KYC_DOB_INDEX = KYC_FULL_NAME_INDEX + KYC_FULL_NAME_LENGTH;
constant KYC_DOB_LENGTH (line 23) | const KYC_DOB_LENGTH = 8;
constant KYC_PHOTO_HASH_INDEX (line 25) | const KYC_PHOTO_HASH_INDEX = KYC_DOB_INDEX + KYC_DOB_LENGTH;
constant KYC_PHOTO_HASH_LENGTH (line 26) | const KYC_PHOTO_HASH_LENGTH = 32;
constant KYC_PHONE_NUMBER_INDEX (line 28) | const KYC_PHONE_NUMBER_INDEX = KYC_PHOTO_HASH_INDEX + KYC_PHOTO_HASH_LEN...
constant KYC_PHONE_NUMBER_LENGTH (line 29) | const KYC_PHONE_NUMBER_LENGTH = 12;
constant KYC_GENDER_INDEX (line 31) | const KYC_GENDER_INDEX = KYC_PHONE_NUMBER_INDEX + KYC_PHONE_NUMBER_LENGTH;
constant KYC_GENDER_LENGTH (line 32) | const KYC_GENDER_LENGTH = 1;
constant KYC_ADDRESS_INDEX (line 34) | const KYC_ADDRESS_INDEX = KYC_GENDER_INDEX + KYC_GENDER_LENGTH;
constant KYC_ADDRESS_LENGTH (line 35) | const KYC_ADDRESS_LENGTH = 100;
constant KYC_MAX_LENGTH (line 37) | const KYC_MAX_LENGTH = KYC_ADDRESS_INDEX + KYC_ADDRESS_LENGTH;
constant KYC_FIELD_LENGTHS (line 42) | const KYC_FIELD_LENGTHS = {
type KycField (line 56) | type KycField = keyof typeof KYC_FIELD_LENGTHS;
constant KYC_REVEAL_DATA_INDICES (line 61) | const KYC_REVEAL_DATA_INDICES = {
constant KYC_SELECTOR_BITS (line 78) | const KYC_SELECTOR_BITS = {
constant KYC_PUBLIC_SIGNALS_ATTESTATION_ID (line 122) | const KYC_PUBLIC_SIGNALS_ATTESTATION_ID = 0;
constant KYC_PUBLIC_SIGNALS_REVEALED_DATA_PACKED (line 123) | const KYC_PUBLIC_SIGNALS_REVEALED_DATA_PACKED = 1;
constant KYC_PUBLIC_SIGNALS_REVEALED_DATA_PACKED_LENGTH (line 124) | const KYC_PUBLIC_SIGNALS_REVEALED_DATA_PACKED_LENGTH = 9;
constant KYC_PUBLIC_SIGNALS_FORBIDDEN_COUNTRIES_PACKED (line 125) | const KYC_PUBLIC_SIGNALS_FORBIDDEN_COUNTRIES_PACKED = 10;
constant KYC_PUBLIC_SIGNALS_FORBIDDEN_COUNTRIES_PACKED_LENGTH (line 126) | const KYC_PUBLIC_SIGNALS_FORBIDDEN_COUNTRIES_PACKED_LENGTH = 4;
constant KYC_PUBLIC_SIGNALS_NULLIFIER (line 127) | const KYC_PUBLIC_SIGNALS_NULLIFIER = 14;
constant KYC_PUBLIC_SIGNALS_SCOPE (line 128) | const KYC_PUBLIC_SIGNALS_SCOPE = 15;
constant KYC_PUBLIC_SIGNALS_USER_IDENTIFIER (line 129) | const KYC_PUBLIC_SIGNALS_USER_IDENTIFIER = 16;
constant KYC_PUBLIC_SIGNALS_CURRENT_DATE (line 130) | const KYC_PUBLIC_SIGNALS_CURRENT_DATE = 17;
constant KYC_PUBLIC_SIGNALS_CURRENT_DATE_LENGTH (line 131) | const KYC_PUBLIC_SIGNALS_CURRENT_DATE_LENGTH = 8;
constant KYC_PUBLIC_SIGNALS_OFAC_NAME_DOB_SMT_ROOT (line 132) | const KYC_PUBLIC_SIGNALS_OFAC_NAME_DOB_SMT_ROOT = 25;
constant KYC_PUBLIC_SIGNALS_OFAC_NAME_YOB_SMT_ROOT (line 133) | const KYC_PUBLIC_SIGNALS_OFAC_NAME_YOB_SMT_ROOT = 26;
function createKycSelector (line 139) | function createKycSelector(fieldsToReveal: KycField[]): [bigint, bigint] {
FILE: common/src/utils/kyc/ecdsa/ecdsa.ts
function buffer2bits (line 9) | function buffer2bits(buff) {
function signEdDSA (line 23) | function signEdDSA(key: bigint, msg: number[]): [Signature, Point<bigint...
function verifyEffECDSA (line 110) | function verifyEffECDSA(
FILE: common/src/utils/kyc/ecdsa/utils.ts
function bigintTo64bitLimbs (line 7) | function bigintTo64bitLimbs(x: bigint): bigint[] {
function getEffECDSAArgs (line 34) | function getEffECDSAArgs(
function modInv (line 49) | function modInv(a: bigint, m: bigint): bigint {
FILE: common/src/utils/kyc/generateInputs.ts
constant NON_OFAC_DUMMY_INPUT (line 22) | const NON_OFAC_DUMMY_INPUT: KycData = {
constant OFAC_DUMMY_INPUT (line 40) | const OFAC_DUMMY_INPUT: KycData = {
FILE: common/src/utils/kyc/types.ts
type KycData (line 5) | type KycData = {
type KycDiscloseInput (line 23) | type KycDiscloseInput = {
type KycDisclosePublicInput (line 45) | type KycDisclosePublicInput = {
type KycRegisterInput (line 57) | type KycRegisterInput = {
type Signature (line 65) | type Signature = {
FILE: common/src/utils/ofac.ts
type OfacVariant (line 8) | type OfacVariant = 'passport' | 'id_card';
FILE: common/src/utils/passportData.ts
function getLocalPassportData (line 7) | function getLocalPassportData(): PassportData {
FILE: common/src/utils/passports/dg1.ts
function genDG1 (line 4) | function genDG1(idDocInput: IdDocInput) {
function genDG1IdCard (line 13) | function genDG1IdCard(idDocInput: IdDocInput) {
function genDG1Passport (line 54) | function genDG1Passport(idDocInput: IdDocInput) {
FILE: common/src/utils/passports/format.ts
function formatAndConcatenateDataHashes (line 3) | function formatAndConcatenateDataHashes(
function formatDG1Attribute (line 86) | function formatDG1Attribute(index: number[], value: string) {
function formatDg2Hash (line 96) | function formatDg2Hash(dg2Hash: number[]) {
function formatMrz (line 105) | function formatMrz(mrz: string) {
function formatName (line 125) | function formatName(firstName: string, lastName: string, targetLength: n...
function generateSignedAttr (line 143) | function generateSignedAttr(messageDigest: number[]) {
FILE: common/src/utils/passports/genMockIdDoc.ts
type IdDocInput (line 29) | interface IdDocInput {
function genMockAadhaarDoc (line 64) | function genMockAadhaarDoc(input: IdDocInput): AadhaarData {
function genMockIdDoc (line 112) | function genMockIdDoc(
function genMockIdDocAndInitDataParsing (line 161) | function genMockIdDocAndInitDataParsing(userInput: Partial<IdDocInput> =...
function generateMockDSC (line 167) | async function generateMockDSC(
function generateRandomName (line 188) | function generateRandomName(): string {
function generateRandomBytes (line 203) | function generateRandomBytes(length: number): number[] {
function generateDataGroupHashes (line 208) | function generateDataGroupHashes(mrzHash: number[], hashLen: number): [n...
function sign (line 226) | function sign(
FILE: common/src/utils/passports/genMockPassportData.ts
function generateRandomBytes (line 18) | function generateRandomBytes(length: number): number[] {
function generateDataGroupHashes (line 23) | function generateDataGroupHashes(mrzHash: number[], hashLen: number): [n...
function genAndInitMockPassportData (line 42) | function genAndInitMockPassportData(
function genMockPassportData (line 68) | function genMockPassportData(
function sign (line 143) | function sign(
FILE: common/src/utils/passports/getMockDSC.ts
function getMockDSC (line 4) | function getMockDSC(signatureType: SignatureAlgorithm) {
FILE: common/src/utils/passports/passport.ts
function calculateContentHash (line 46) | function calculateContentHash(passportData: IDDocument): string {
function extractRSFromSignature (line 73) | function extractRSFromSignature(signatureBytes: number[]): { r: string; ...
function extractSignatureFromDSC (line 91) | function extractSignatureFromDSC(dscCertificate: string) {
function findStartPubKeyIndex (line 97) | function findStartPubKeyIndex(
function formatCertificatePubKeyDSC (line 117) | function formatCertificatePubKeyDSC(
function formatSignatureDSCCircuit (line 137) | function formatSignatureDSCCircuit(
function generateCommitment (line 159) | function generateCommitment(
function getPassportSignature (line 190) | function getPassportSignature(passportData: PassportData, n: number, k: ...
function generateNullifier (line 206) | function generateNullifier(passportData: IDDocument) {
function getCertificatePubKey (line 238) | function getCertificatePubKey(
function getNAndK (line 261) | function getNAndK(sigAlg: SignatureAlgorithm) {
function getNAndKCSCA (line 302) | function getNAndKCSCA(sigAlg: 'rsa' | 'ecdsa' | 'rsapss') {
function getPassportSignatureInfos (line 310) | function getPassportSignatureInfos(passportData: PassportData) {
function getSignatureAlgorithmFullName (line 332) | function getSignatureAlgorithmFullName(
function inferDocumentCategory (line 346) | function inferDocumentCategory(documentType: string): DocumentCategory {
function initPassportDataParsing (line 360) | function initPassportDataParsing(passportData: PassportData, skiPem: any...
function pad (line 372) | function pad(hashFunction: (typeof hashAlgos)[number]) {
function padWithZeroes (line 378) | function padWithZeroes(bytes: number[], length: number) {
FILE: common/src/utils/passports/passport_parsing/brutForceDscSignature.ts
function brutforceSignatureAlgorithmDsc (line 14) | function brutforceSignatureAlgorithmDsc(dsc: CertificateData, csca: Cert...
function brutforceHashAlgorithmDsc (line 45) | function brutforceHashAlgorithmDsc(
function verifySignature (line 61) | function verifySignature(
function verifyECDSA (line 78) | function verifyECDSA(dsc: CertificateData, csca: CertificateData, hashAl...
function verifyRSA (line 106) | function verifyRSA(dsc: CertificateData, csca: CertificateData, hashAlgo...
function verifyRSAPSS (line 133) | function verifyRSAPSS(
function getTBSHash (line 169) | function getTBSHash(
FILE: common/src/utils/passports/passport_parsing/brutForcePassportSignature.ts
function brutforceSignatureAlgorithm (line 13) | function brutforceSignatureAlgorithm(passportData: PassportData) {
function brutforceHashAlgorithm (line 53) | function brutforceHashAlgorithm(
function verifySignature (line 66) | function verifySignature(
function verifyECDSA (line 82) | function verifyECDSA(passportData: PassportData, hashAlgorithm: string) {
function verifyRSA (line 104) | function verifyRSA(passportData: PassportData, hashAlgorithm: string) {
function verifyRSAPSS (line 117) | function verifyRSAPSS(passportData: PassportData, hashAlgorithm: string,...
FILE: common/src/utils/passports/passport_parsing/parseDscCertificateData.ts
type DscCertificateMetaData (line 7) | interface DscCertificateMetaData {
function parseDscCertificateData (line 19) | function parseDscCertificateData(
FILE: common/src/utils/passports/passport_parsing/parsePassportData.ts
type PassportMetadata (line 16) | interface PassportMetadata {
function findHashSizeOfEContent (line 43) | function findHashSizeOfEContent(eContent: number[], signedAttr: number[]) {
function findDG1HashInEContent (line 54) | function findDG1HashInEContent(
function getDgPaddingBytes (line 71) | function getDgPaddingBytes(passportData: PassportData, dg1HashFunction: ...
function getCountryCodeFromMrz (line 82) | function getCountryCodeFromMrz(mrz: string): string {
function getCurveOrExponent (line 86) | function getCurveOrExponent(certData: CertificateData): string {
function parsePassportData (line 93) | function parsePassportData(
FILE: common/src/utils/passports/validate.ts
type AlternativeCSCA (line 40) | type AlternativeCSCA = Record<string, string>;
function validateRegistrationCircuit (line 42) | function validateRegistrationCircuit(
function validateDscCircuit (line 60) | function validateDscCircuit(
type PassportSupportStatus (line 72) | type PassportSupportStatus =
function checkDocumentSupported (line 79) | async function checkDocumentSupported(
function checkIfPassportDscIsInTree (line 132) | async function checkIfPassportDscIsInTree(
type AadhaarPublicKeys (line 146) | type AadhaarPublicKeys = null | Array<string>;
function generateCommitmentInApp (line 148) | function generateCommitmentInApp(
function generateCommitmentInAppAadhaar (line 197) | function generateCommitmentInAppAadhaar(
function isDocumentNullified (line 240) | async function isDocumentNullified(passportData: IDDocument) {
function isUserRegistered (line 278) | async function isUserRegistered(
function isUserRegisteredWithAlternativeCSCA (line 319) | async function isUserRegisteredWithAlternativeCSCA(
function formatCSCAPem (line 406) | function formatCSCAPem(cscaPem: string): string {
FILE: common/src/utils/proving.ts
type TEEPayload (line 11) | type TEEPayload = TEEPayloadBase & {
type TEEPayloadBase (line 16) | type TEEPayloadBase = {
type TEEPayloadDisclose (line 23) | type TEEPayloadDisclose = TEEPayloadBase & {
type RegisterSuffixes (line 37) | type RegisterSuffixes = '' | '_id' | '_aadhaar' | '_kyc';
type DscSuffixes (line 38) | type DscSuffixes = '' | '_id';
type DiscloseSuffixes (line 39) | type DiscloseSuffixes = '' | '_id' | '_aadhaar' | '_kyc';
type ProofTypes (line 40) | type ProofTypes = 'register' | 'dsc' | 'disclose';
type RegisterProofType (line 41) | type RegisterProofType = `${Extract<ProofTypes, 'register'>}${RegisterSu...
type DscProofType (line 42) | type DscProofType = `${Extract<ProofTypes, 'dsc'>}${DscSuffixes}`;
type DiscloseProofType (line 43) | type DiscloseProofType = `${Extract<ProofTypes, 'disclose'>}${DiscloseSu...
function encryptAES256GCM (line 47) | function encryptAES256GCM(plaintext: string, key: forge.util.ByteStringB...
function bigIntReplacer (line 62) | function bigIntReplacer(_key: string, value: unknown): unknown {
function getPayload (line 66) | function getPayload(
function getWSDbRelayerUrl (line 119) | function getWSDbRelayerUrl(endpointType: EndpointType) {
FILE: common/src/utils/scope.ts
function bigIntToString (line 5) | function bigIntToString(bigInt: bigint): string {
function formatEndpoint (line 20) | function formatEndpoint(endpoint: string): string {
function hashEndpointWithScope (line 30) | function hashEndpointWithScope(endpoint: string, scope: string): string {
function stringToBigInt (line 48) | function stringToBigInt(str: string): bigint {
FILE: common/src/utils/selfAttestation.ts
type SelfVerificationResult (line 3) | interface SelfVerificationResult {
function parsePublicSignalsDisclose (line 39) | function parsePublicSignalsDisclose(publicSignals) {
FILE: common/src/utils/shaPad.ts
function assert (line 1) | function assert(cond: boolean, errorMessage: string) {
function int64toBytes (line 8) | function int64toBytes(num: number): Uint8Array {
function int128toBytes (line 16) | function int128toBytes(x: number): Uint8Array {
function int8toBytes (line 29) | function int8toBytes(num: number): Uint8Array {
function mergeUInt8Arrays (line 36) | function mergeUInt8Arrays(a1: Uint8Array, a2: Uint8Array): Uint8Array {
function sha384_512Pad (line 44) | function sha384_512Pad(
function shaPad (line 86) | function shaPad(prehash_prepad_m_array: number[], maxShaBytes: number): ...
FILE: common/src/utils/trees.ts
function buildAadhaarSMT (line 45) | function buildAadhaarSMT(field: any[], treetype: string): [number, numbe...
function buildSMT (line 93) | function buildSMT(field: any[], treetype: string): [number, number, SMT] {
function formatRoot (line 153) | function formatRoot(root: string): string {
function generateMerkleProof (line 158) | function generateMerkleProof(imt: LeanIMT, _index: number, maxleaf_depth...
function generateSMTProof (line 176) | function generateSMTProof(smt: SMT, leaf: bigint) {
function getCountryLeaf (line 227) | function getCountryLeaf(
function getCscaTreeInclusionProof (line 244) | function getCscaTreeInclusionProof(leaf: string, _serialized_csca_tree: ...
function getCscaTreeRoot (line 259) | function getCscaTreeRoot(serialized_csca_tree: any[][]) {
function getDobLeaf (line 265) | function getDobLeaf(dobMrz: (bigint | number)[], i?: number): bigint {
function getDscTreeInclusionProof (line 278) | function getDscTreeInclusionProof(
function getLeaf (line 293) | function getLeaf(parsed: CertificateData, type: 'dsc' | 'csca'): string {
function buildKycSMT (line 314) | function buildKycSMT(field: any[], treetype: string): [number, number, S...
function processPassportNoAndNationality (line 360) | function processPassportNoAndNationality(
function generateSmallKey (line 413) | function generateSmallKey(input: bigint): bigint {
function processNameAndDob (line 417) | function processNameAndDob(entry: any, i: number, docType: 'passport' | ...
function processNameAndYob (line 437) | function processNameAndYob(entry: any, i: number, docType: 'passport' | ...
function processYear (line 455) | function processYear(year: string, i: number): bigint {
function getYearLeaf (line 465) | function getYearLeaf(yearArr: (bigint | number)[]): bigint {
function processName (line 478) | function processName(
function processDob (line 517) | function processDob(day: string, month: string, year: string, i: number)...
function processCountry (line 556) | function processCountry(country1: string, country2: string, i: number) {
function getLeafCscaTree (line 568) | function getLeafCscaTree(csca_parsed: CertificateData): string {
function getLeafDscTree (line 572) | function getLeafDscTree(dsc_parsed: CertificateData, csca_parsed: Certif...
function getLeafDscTreeFromDscCertificateMetadata (line 578) | function getLeafDscTreeFromDscCertificateMetadata(
function getLeafDscTreeFromParsedDsc (line 587) | function getLeafDscTreeFromParsedDsc(dscParsed: CertificateData): string {
function getNameDobLeaf (line 591) | function getNameDobLeaf(
function getNameLeaf (line 692) | function getNameLeaf(nameMrz: (bigint | number)[], i?: number): bigint {
function getNameYobLeaf (line 727) | function getNameYobLeaf(
function getPassportNumberAndNationalityLeaf (line 821) | function getPassportNumberAndNationalityLeaf(
FILE: common/src/utils/types.ts
type BaseIDData (line 7) | interface BaseIDData {
type AadhaarData (line 16) | interface AadhaarData extends BaseIDData {
type DeployedCircuits (line 25) | type DeployedCircuits = {
type DocumentCatalog (line 34) | interface DocumentCatalog {
type DocumentCategory (line 39) | type DocumentCategory = 'passport' | 'id_card' | 'aadhaar' | 'kyc';
type DocumentMetadata (line 41) | interface DocumentMetadata {
type DocumentType (line 53) | type DocumentType =
type Environment (line 62) | type Environment = 'prod' | 'stg';
type IDDocument (line 64) | type IDDocument = AadhaarData | KycData | PassportData;
type KycData (line 66) | interface KycData extends BaseIDData {
type OfacTree (line 73) | type OfacTree = {
type PassportData (line 80) | interface PassportData extends BaseIDData {
type PendingKycStatus (line 96) | type PendingKycStatus = 'pending' | 'processing' | 'failed';
type PendingKycVerification (line 98) | interface PendingKycVerification {
type Proof (line 107) | type Proof = {
type SignatureAlgorithm (line 117) | type SignatureAlgorithm =
type AttestationIdHex (line 173) | enum AttestationIdHex {
function castCSCAProof (line 181) | function castCSCAProof(proof: any): Proof {
function isAadhaarDocument (line 192) | function isAadhaarDocument(passportData: IDDocument): passportData is Aa...
function isKycDocument (line 196) | function isKycDocument(passportData: IDDocument): passportData is KycData {
function isMRZDocument (line 200) | function isMRZDocument(passportData: IDDocument): passportData is Passpo...
FILE: common/tests/genMockPassportData.test.ts
function verify (line 32) | function verify(
FILE: contracts/hardhat.config.ts
constant DUMMY_PRIVATE_KEY (line 15) | const DUMMY_PRIVATE_KEY = "0x0000000000000000000000000000000000000000000...
constant PRIVATE_KEY (line 16) | const PRIVATE_KEY = process.env.PRIVATE_KEY || DUMMY_PRIVATE_KEY;
FILE: contracts/ignition/modules/hub/deployHub.ts
function getHubInitializeData (line 6) | function getHubInitializeData() {
FILE: contracts/ignition/modules/hub/deployHubV2.ts
function getHubImplV2InitializeData (line 10) | function getHubImplV2InitializeData() {
FILE: contracts/ignition/modules/hub/updateRegistries.ts
function updateHubRegistries (line 30) | function updateHubRegistries(m: IgnitionModuleBuilder, hubAddress: strin...
FILE: contracts/ignition/modules/hub/updateVerifiers.ts
function updateHubVerifiers (line 56) | function updateHubVerifiers(m: IgnitionModuleBuilder, hubAddress: string...
FILE: contracts/ignition/modules/registry/deployAadhaarRegistry.ts
function getRegistryInitializeData (line 40) | function getRegistryInitializeData() {
FILE: contracts/ignition/modules/registry/deployIdCardRegistry.ts
function getRegistryInitializeData (line 26) | function getRegistryInitializeData() {
FILE: contracts/ignition/modules/registry/deployRegistry.ts
function getRegistryInitializeData (line 40) | function getRegistryInitializeData() {
FILE: contracts/ignition/modules/registry/updateRegistries.ts
function getImplementationName (line 49) | function getImplementationName(registryModule: string): string {
function handleRegistryDeployment (line 69) | function handleRegistryDeployment(
FILE: contracts/ignition/modules/upgrade/deployNewHubAndUpgrade.ts
function getHubImplV2InitializeData (line 7) | function getHubImplV2InitializeData() {
FILE: contracts/ignition/modules/upgrade/deployNewRegistryAndUpgrade.ts
function getTestRegistryInitializeData (line 7) | function getTestRegistryInitializeData() {
FILE: contracts/ignition/modules/verifiers/deployAllVerifiers.ts
type CircuitName (line 4) | type CircuitName =
FILE: contracts/scripts/constants.ts
constant ATTESTATION_ID (line 4) | const ATTESTATION_ID = {
constant ATTESTATION_TO_REGISTRY (line 9) | const ATTESTATION_TO_REGISTRY = {
constant NETWORK_TO_CHAIN_ID (line 14) | const NETWORK_TO_CHAIN_ID: Record<string, string> = {
constant CHAIN_ID_TO_SAVED_REPO (line 23) | const CHAIN_ID_TO_SAVED_REPO: Record<string, string> = {
function getContractAddress (line 48) | function getContractAddress(exactName: string, deployedAddresses: any): ...
FILE: contracts/scripts/deleteDscKeyCommitment.ts
function initializeTree (line 43) | function initializeTree() {
function main (line 52) | async function main() {
FILE: contracts/scripts/findErrorSelectors.ts
type CustomError (line 5) | interface CustomError {
type CliOptions (line 13) | interface CliOptions {
type SelectorCollision (line 18) | interface SelectorCollision {
function findSolidityFiles (line 33) | function findSolidityFiles(dir: string): string[] {
constant ABI_PRIMITIVE_RE (line 58) | const ABI_PRIMITIVE_RE =
function canonicalizeType (line 66) | function canonicalizeType(sourceType: string): string {
function extractCustomErrors (line 84) | function extractCustomErrors(filePath: string): CustomError[] {
function buildSelectorMap (line 123) | function buildSelectorMap(errors: CustomError[]) {
function parseCliArgs (line 150) | function parseCliArgs(argv: string[]): CliOptions {
function writeGeneratedJson (line 167) | function writeGeneratedJson(filePath: string, data: unknown, check: bool...
function findAllErrorSelectors (line 191) | async function findAllErrorSelectors({ check, targetSelector }: CliOptio...
FILE: contracts/scripts/setDscKeyCommitment.ts
function getContractAddressByPartialName (line 16) | function getContractAddressByPartialName(partialName: string): string | ...
function main (line 25) | async function main() {
FILE: contracts/scripts/setHubV2.ts
constant NETWORK (line 19) | const NETWORK = process.env.NETWORK;
constant RPC_URL (line 20) | const RPC_URL = process.env.RPC_URL;
constant PRIVATE_KEY (line 21) | const PRIVATE_KEY = process.env.PRIVATE_KEY;
function main (line 37) | async function main() {
FILE: contracts/scripts/setRegistry.ts
constant NETWORK (line 11) | const NETWORK = process.env.NETWORK || "localhost";
constant RPC_URL_KEY (line 12) | const RPC_URL_KEY = NETWORK === "celo" ? "CELO_RPC_URL" : "CELO_SEPOLIA_...
constant PRIVATE_KEY (line 13) | const PRIVATE_KEY = process.env.PRIVATE_KEY;
constant SKIP_CSCA_UPDATE (line 14) | const SKIP_CSCA_UPDATE = process.env.SKIP_CSCA_UPDATE === "true";
constant CSCA_ROOT (line 15) | const CSCA_ROOT = process.env.CSCA_ROOT;
constant NETWORK_TO_CHAIN_ID (line 18) | const NETWORK_TO_CHAIN_ID: Record<string, string> = {
constant CHAIN_ID (line 29) | const CHAIN_ID = getChainId(NETWORK);
function getContractAddressByExactName (line 59) | function getContractAddressByExactName(exactName: string): string | unkn...
function main (line 66) | async function main() {
FILE: contracts/scripts/setRegistryId.ts
constant NETWORK (line 11) | const NETWORK = process.env.NETWORK || "localhost";
constant RPC_URL_KEY (line 12) | const RPC_URL_KEY = NETWORK === "celo" ? "CELO_RPC_URL" : "CELO_SEPOLIA_...
constant PRIVATE_KEY (line 13) | const PRIVATE_KEY = process.env.PRIVATE_KEY;
constant SKIP_CSCA_UPDATE (line 14) | const SKIP_CSCA_UPDATE = process.env.SKIP_CSCA_UPDATE === "true";
constant CSCA_ROOT (line 15) | const CSCA_ROOT = process.env.CSCA_ROOT;
constant NETWORK_TO_CHAIN_ID (line 18) | const NETWORK_TO_CHAIN_ID: Record<string, string> = {
constant CHAIN_ID (line 29) | const CHAIN_ID = getChainId(NETWORK);
function getContractAddressByExactName (line 59) | function getContractAddressByExactName(exactName: string): string | unkn...
function main (line 66) | async function main() {
FILE: contracts/scripts/setVerifiers.ts
function getContractAddressByPartialName (line 41) | function getContractAddressByPartialName(partialName: string): string | ...
function main (line 50) | async function main() {
FILE: contracts/scripts/setVerifiersV2.ts
constant NETWORK (line 24) | const NETWORK = process.env.NETWORK;
constant RPC_URL (line 25) | const RPC_URL = process.env.RPC_URL;
constant PRIVATE_KEY (line 26) | const PRIVATE_KEY = process.env.PRIVATE_KEY;
function getContractAddressByPartialName (line 41) | function getContractAddressByPartialName(partialName: string): string | ...
function main (line 54) | async function main() {
FILE: contracts/scripts/showRegistryAddresses.ts
function showRegistryAddresses (line 4) | async function showRegistryAddresses() {
FILE: contracts/scripts/updateRegistryOfacRoot.ts
constant NETWORK (line 20) | const NETWORK = process.env.NETWORK;
constant RPC_URL (line 21) | const RPC_URL = process.env.RPC_URL;
constant PRIVATE_KEY (line 22) | const PRIVATE_KEY = process.env.PRIVATE_KEY;
function main (line 37) | async function main() {
FILE: contracts/tasks/upgrade/history.ts
type HistoryTaskArgs (line 11) | interface HistoryTaskArgs {
FILE: contracts/tasks/upgrade/prepare.ts
type PrepareTaskArgs (line 41) | interface PrepareTaskArgs {
FILE: contracts/tasks/upgrade/propose.ts
function getChainPrefix (line 27) | function getChainPrefix(network: SupportedNetwork): string {
type ProposeTaskArgs (line 37) | interface ProposeTaskArgs {
FILE: contracts/tasks/upgrade/status.ts
type StatusTaskArgs (line 20) | interface StatusTaskArgs {
FILE: contracts/tasks/upgrade/types.ts
constant SUPPORTED_NETWORKS (line 5) | const SUPPORTED_NETWORKS = ["celo", "celo-sepolia", "sepolia", "localhos...
type SupportedNetwork (line 6) | type SupportedNetwork = (typeof SUPPORTED_NETWORKS)[number];
constant CONTRACT_IDS (line 9) | const CONTRACT_IDS = [
type ContractId (line 19) | type ContractId = (typeof CONTRACT_IDS)[number];
FILE: contracts/tasks/upgrade/upgrade.ts
function promptYesNo (line 49) | async function promptYesNo(question: string): Promise<boolean> {
constant CHAIN_CONFIG (line 66) | const CHAIN_CONFIG: Record<SupportedNetwork, { chainId: number; safePref...
function getChainId (line 73) | function getChainId(network: SupportedNetwork): number {
function getChainPrefix (line 77) | function getChainPrefix(network: SupportedNetwork): string {
function checkOwnerAndPropose (line 86) | async function checkOwnerAndPropose(
type UpgradeTaskArgs (line 212) | interface UpgradeTaskArgs {
function outputManualSubmissionData (line 980) | function outputManualSubmissionData(
FILE: contracts/tasks/upgrade/utils.ts
type ContractDefinition (line 16) | interface ContractDefinition {
type NetworkDeployment (line 22) | interface NetworkDeployment {
type GovernanceConfig (line 29) | interface GovernanceConfig {
type NetworkConfig (line 36) | interface NetworkConfig {
type VersionDeployment (line 42) | interface VersionDeployment {
type VersionInfo (line 49) | interface VersionInfo {
type DeploymentRegistry (line 57) | interface DeploymentRegistry {
function getRegistryPath (line 101) | function getRegistryPath(): string {
function readRegistry (line 108) | function readRegistry(): DeploymentRegistry {
function writeRegistry (line 119) | function writeRegistry(registry: DeploymentRegistry): void {
function getContractDefinition (line 128) | function getContractDefinition(contractId: string): ContractDefinition {
function getNetworkConfig (line 140) | function getNetworkConfig(network: SupportedNetwork): NetworkConfig {
function getNetworkDeployment (line 152) | function getNetworkDeployment(contractId: string, network: SupportedNetw...
function getProxyAddress (line 160) | function getProxyAddress(contractId: string, network: SupportedNetwork):...
function getCurrentVersion (line 171) | function getCurrentVersion(contractId: string, network: SupportedNetwork...
function getGovernanceConfig (line 179) | function getGovernanceConfig(network: SupportedNetwork): GovernanceConfig {
function getVersionInfo (line 187) | function getVersionInfo(contractId: string, version: string): VersionInf...
function getLatestVersionInfo (line 195) | function getLatestVersionInfo(contractId: string): { version: string; in...
function addVersion (line 209) | function addVersion(
function updateVersionGitCommit (line 252) | function updateVersionGitCommit(
function setProxyAddress (line 271) | function setProxyAddress(contractId: string, network: SupportedNetwork, ...
function getGitCommit (line 292) | function getGitCommit(): string {
function getGitCommitShort (line 303) | function getGitCommitShort(): string {
function getGitBranch (line 314) | function getGitBranch(): string {
function hasUncommittedChanges (line 325) | function hasUncommittedChanges(): boolean {
function createGitTag (line 337) | function createGitTag(tag: string, message: string): void {
function parseVersion (line 344) | function parseVersion(version: string): { major: number; minor: number; ...
function compareVersions (line 359) | function compareVersions(a: string, b: string): number {
function incrementVersion (line 372) | function incrementVersion(version: string, type: "major" | "minor" | "pa...
function suggestNextVersion (line 387) | function suggestNextVersion(currentVersion: string): {
function validateVersionIncrement (line 403) | function validateVersionIncrement(
function readContractVersion (line 441) | function readContractVersion(contractPath: string): string | null {
function readReinitializerVersion (line 456) | function readReinitializerVersion(contractPath: string): number | null {
function validateReinitializerVersion (line 488) | function validateReinitializerVersion(
function updateContractVersion (line 516) | function updateContractVersion(contractPath: string, newVersion: string)...
function getContractFilePath (line 542) | function getContractFilePath(contractId: string): string | null {
function gitCommit (line 567) | function gitCommit(message: string): boolean {
function shortenAddress (line 579) | function shortenAddress(address: string): string {
function getSafeApiUrl (line 587) | function getSafeApiUrl(network: SupportedNetwork): string {
function getExplorerUrl (line 601) | function getExplorerUrl(network: SupportedNetwork): string {
function getContractIds (line 614) | function getContractIds(): string[] {
function isDeployedOnNetwork (line 622) | function isDeployedOnNetwork(contractId: string, network: SupportedNetwo...
FILE: contracts/test/unit/GCPJWTHelper.test.ts
function packStringToFieldElements (line 6) | function packStringToFieldElements(str: string): [bigint, bigint, bigint] {
FILE: contracts/test/unit/formatter.test.ts
function toHexString (line 427) | function toHexString(bytes: Uint8Array): string {
FILE: contracts/test/utils/constants.ts
constant ATTESTATION_ID (line 1) | const ATTESTATION_ID = {
constant FIELD_PRIME (line 7) | const FIELD_PRIME = BigInt("21888242871839275222246405745257275088548364...
FILE: contracts/test/utils/contractUtils.ts
type Country3LetterCode (line 3) | type Country3LetterCode = string;
function getPackedForbiddenCountries (line 5) | function getPackedForbiddenCountries(forbiddenCountriesList: Array<Count...
function packForbiddenCountriesList (line 48) | function packForbiddenCountriesList(forbiddenCountries: string[]) {
function formatCallData_disclose (line 89) | function formatCallData_disclose(parsedCallData: any[]) {
function formatCallData_dsc (line 111) | function formatCallData_dsc(parsedCallData: any[]) {
function formatCallData_register (line 121) | function formatCallData_register(parsedCallData: any[]) {
function formatProof (line 133) | function formatProof(proof: any, publicSignals: any) {
FILE: contracts/test/utils/deploymentV2.ts
function deploySystemFixturesV2 (line 22) | async function deploySystemFixturesV2(): Promise<DeployedActorsV2> {
FILE: contracts/test/utils/example/balance-tree.ts
class BalanceTree (line 5) | class BalanceTree {
method constructor (line 7) | constructor(balances: { account: string; amount: bigint }[]) {
method verifyProof (line 15) | public static verifyProof(
method toNode (line 31) | public static toNode(index: number | bigint, account: string, amount: ...
method getHexRoot (line 38) | public getHexRoot(): string {
method getProof (line 43) | public getProof(index: number | bigint, account: string, amount: bigin...
FILE: contracts/test/utils/example/merkle-tree.ts
class MerkleTree (line 3) | class MerkleTree {
method constructor (line 8) | constructor(elements: Buffer[]) {
method getLayers (line 24) | getLayers(elements: Buffer[]): Buffer[][] {
method getNextLayer (line 40) | getNextLayer(elements: Buffer[]): Buffer[] {
method combinedHash (line 51) | static combinedHash(first: Buffer, second: Buffer): Buffer {
method getRoot (line 62) | getRoot(): Buffer {
method getHexRoot (line 66) | getHexRoot(): string {
method getProof (line 70) | getProof(el: Buffer) {
method getHexProof (line 90) | getHexProof(el: Buffer): string[] {
method getPairElement (line 96) | private static getPairElement(idx: number, layer: Buffer[]): Buffer | ...
method bufDedup (line 106) | private static bufDedup(elements: Buffer[]): Buffer[] {
method bufArrToHexArr (line 112) | private static bufArrToHexArr(arr: Buffer[]): string[] {
method sortAndConcat (line 120) | private static sortAndConcat(...args: Buffer[]): Buffer {
FILE: contracts/test/utils/formatter.ts
class Formatter (line 1) | class Formatter {
method formatName (line 4) | static formatName(input: string): [string, string] {
method formatDate (line 31) | static formatDate(date: string): string {
method numAsciiToUint (line 59) | static numAsciiToUint(numAscii: number): number {
method fieldElementsToBytes (line 66) | static fieldElementsToBytes(publicSignals: [bigint, bigint, bigint]): ...
method bytesToHexString (line 82) | static bytesToHexString(bytes: Uint8Array): string {
method extractForbiddenCountriesFromPacked (line 91) | static extractForbiddenCountriesFromPacked(
method proofDateToUnixTimestamp (line 112) | static proofDateToUnixTimestamp(dateNum: number[]): number {
method dateToUnixTimestamp (line 123) | static dateToUnixTimestamp(date: string): number {
method substring (line 136) | static substring(str: string, startIndex: number, endIndex: number): s...
method parseDatePart (line 140) | static parseDatePart(value: string): number {
method toTimestamp (line 152) | static toTimestamp(year: number, month: number, day: number): number {
method isLeapYear (line 166) | static isLeapYear(year: number): boolean {
class CircuitAttributeHandler (line 179) | class CircuitAttributeHandler {
method getIssuingState (line 199) | static getIssuingState(input: string | Uint8Array): string {
method getName (line 204) | static getName(input: string | Uint8Array): [string, string] {
method getPassportNumber (line 210) | static getPassportNumber(input: string | Uint8Array): string {
method getNationality (line 215) | static getNationality(input: string | Uint8Array): string {
method getDateOfBirth (line 220) | static getDateOfBirth(input: string | Uint8Array): string {
method getGender (line 226) | static getGender(input: string | Uint8Array): string {
method getExpiryDate (line 231) | static getExpiryDate(input: string | Uint8Array): string {
method getOlderThan (line 237) | static getOlderThan(input: string | Uint8Array): number {
method getPassportNoOfac (line 244) | static getPassportNoOfac(input: string | Uint8Array): number {
method getNameAndDobOfac (line 249) | static getNameAndDobOfac(input: string | Uint8Array): number {
method getNameAndYobOfac (line 254) | static getNameAndYobOfac(input: string | Uint8Array): number {
method compareOlderThan (line 259) | static compareOlderThan(input: string | Uint8Array, olderThan: number)...
method compareOfac (line 274) | static compareOfac(
method normalizeInput (line 288) | private static normalizeInput(input: string | Uint8Array): Uint8Array {
method extractStringAttribute (line 303) | static extractStringAttribute(input: string | Uint8Array, start: numbe...
FILE: contracts/test/utils/generateProof.ts
function generateRegisterProof (line 93) | async function generateRegisterProof(secret: string, passportData: Passp...
function generateRegisterIdProof (line 126) | async function generateRegisterIdProof(
function generateRegisterAadhaarProof (line 177) | async function generateRegisterAadhaarProof(
function generateRegisterKycProof (line 205) | async function generateRegisterKycProof(
function generateDscProof (line 233) | async function generateDscProof(passportData: PassportData): Promise<Dsc...
function generateVcAndDiscloseRawProof (line 255) | async function generateVcAndDiscloseRawProof(
function generateVcAndDiscloseProof (line 315) | async function generateVcAndDiscloseProof(
function generateVcAndDiscloseIdProof (line 395) | async function generateVcAndDiscloseIdProof(
function generateVcAndDiscloseAadhaarProof (line 502) | async function generateVcAndDiscloseAadhaarProof(
function generateVcAndDiscloseKycProof (line 528) | async function generateVcAndDiscloseKycProof(
function parseSolidityCalldata (line 553) | function parseSolidityCalldata<T>(rawCallData: string, _type: T): T {
function getSMTs (line 574) | function getSMTs() {
function importSMTFromJsonFile (line 604) | function importSMTFromJsonFile(filePath?: string): typeof SMT | null {
FILE: contracts/test/utils/types.ts
type PassportProof (line 42) | type PassportProof = IIdentityVerificationHubV1.PassportProofStruct;
type RegisterCircuitProof (line 43) | type RegisterCircuitProof = IRegisterCircuitVerifier.RegisterCircuitProo...
type RegisterAadhaarCircuitProof (line 44) | type RegisterAadhaarCircuitProof = IRegisterCircuitVerifier.RegisterAadh...
type DscCircuitProof (line 45) | type DscCircuitProof = IDscCircuitVerifier.DscCircuitProofStruct;
type VcAndDiscloseHubProof (line 46) | type VcAndDiscloseHubProof = IIdentityVerificationHubV1.VcAndDiscloseHub...
type VcAndDiscloseProof (line 47) | type VcAndDiscloseProof = IVcAndDiscloseCircuitVerifier.VcAndDisclosePro...
type VcAndDiscloseVerifier (line 50) | type VcAndDiscloseVerifier = typeof process.env.TEST_ENV extends "local"...
type VcAndDiscloseIdVerifier (line 51) | type VcAndDiscloseIdVerifier = typeof process.env.TEST_ENV extends "local"
type RegisterVerifier (line 54) | type RegisterVerifier = typeof process.env.TEST_ENV extends "local"
type IdCardRegisterVerifier (line 57) | type IdCardRegisterVerifier = typeof process.env.TEST_ENV extends "local"
type DscVerifier (line 60) | type DscVerifier = typeof process.env.TEST_ENV extends "local" ? LocalDs...
type DeployedActors (line 62) | interface DeployedActors {
type DeployedActorsV2 (line 76) | interface DeployedActorsV2 {
type CircuitArtifacts (line 120) | type CircuitArtifacts = {
FILE: contracts/test/utils/utils.ts
function generateRandomFieldElement (line 3) | function generateRandomFieldElement(): string {
function getStartOfDayTimestamp (line 11) | function getStartOfDayTimestamp(timestamp: number): number {
function splitHexFromBack (line 16) | function splitHexFromBack(hexString: string, bytesPerChunk: number = 31)...
FILE: contracts/test/v2/discloseId.test.ts
function calculateUserIdentifierHash (line 18) | function calculateUserIdentifierHash(userContextData: string): string {
FILE: contracts/test/v2/discloseKyc.test.ts
constant KYC_CURRENT_DATE_INDEX (line 20) | const KYC_CURRENT_DATE_INDEX = 21;
FILE: contracts/test/v2/disclosePassport.test.ts
function formatDateForPassport (line 17) | function formatDateForPassport(date: Date): string {
function calculateUserIdentifierHash (line 40) | function calculateUserIdentifierHash(userContextData: string): string {
FILE: contracts/test/v2/ofacProofUpdate.test.ts
function getCurrentDateDigitsYYMMDDHHMMSS (line 6) | function getCurrentDateDigitsYYMMDDHHMMSS(hoursOffset: number = 0): bigi...
function packUint256ToHexFields (line 25) | function packUint256ToHexFields(value: bigint): [bigint, bigint, bigint] {
function computeRootsHash (line 50) | function computeRootsHash(roots: bigint[]): string {
function buildPubSignals (line 129) | function buildPubSignals(roots: bigint[], hoursOffset = 0): bigint[] {
FILE: contracts/test/v2/ofacRollingWindow.test.ts
function deployRegistries (line 8) | async function deployRegistries() {
FILE: contracts/test/v2/ofacUpgradePath.test.ts
constant GCP_ROOT_CA_PUBKEY_HASH (line 20) | const GCP_ROOT_CA_PUBKEY_HASH = 2110750378176961105178592146283213342181...
function packUint256ToHexFields (line 22) | function packUint256ToHexFields(value: bigint): [bigint, bigint, bigint] {
function getCurrentDateDigitsYYMMDDHHMMSS (line 34) | function getCurrentDateDigitsYYMMDDHHMMSS(): bigint[] {
FILE: contracts/test/v2/registerKyc.test.ts
function getCurrentDateDigitsYYMMDDHHMMSS (line 9) | function getCurrentDateDigitsYYMMDDHHMMSS(hoursOffset: number = 0): bigi...
function packUint256ToHexFields (line 28) | function packUint256ToHexFields(value: bigint): [bigint, bigint, bigint] {
FILE: new-common/src/app/builder.ts
class SelfAppBuilder (line 8) | class SelfAppBuilder {
method constructor (line 11) | constructor(config: Partial<SelfApp>) {
method build (line 78) | build(): SelfApp {
function getUniversalLink (line 83) | function getUniversalLink(selfApp: SelfApp): string {
FILE: new-common/src/attestation/gcp.ts
constant GCP_ROOT_CERT (line 7) | const GCP_ROOT_CERT = `
function base64UrlDecodeToBytes (line 47) | function base64UrlDecodeToBytes(input: string): string {
function base64UrlDecodeToString (line 53) | function base64UrlDecodeToString(input: string): string {
type PKICertificates (line 59) | type PKICertificates = {
function extractCertificates (line 65) | function extractCertificates(x5c: string[]): PKICertificates {
function compareCertificates (line 76) | function compareCertificates(cert1: forge.pki.Certificate, cert2: forge....
function verifyCertificateChain (line 90) | function verifyCertificateChain({ leaf, intermediate, root }: PKICertifi...
function checkPCR0Mapping (line 106) | async function checkPCR0Mapping(imageHashHex: string): Promise<boolean> {
function validatePKIToken (line 129) | function validatePKIToken(
FILE: new-common/src/blockchain/forbiddenCountries.ts
function getPackedForbiddenCountries (line 4) | function getPackedForbiddenCountries(
FILE: new-common/src/blockchain/formatCallData.ts
function formatCallData_disclose (line 1) | function formatCallData_disclose(parsedCallData: any[]) {
function formatCallData_dsc (line 23) | function formatCallData_dsc(parsedCallData: any[]) {
function formatCallData_register (line 33) | function formatCallData_register(parsedCallData: any[]) {
function formatProof (line 45) | function formatProof(proof: any, publicSignals: any) {
function packForbiddenCountriesList (line 57) | function packForbiddenCountriesList(forbiddenCountries: string[]) {
FILE: new-common/src/blockchain/ofac.ts
type OfacVariant (line 4) | type OfacVariant = 'passport' | 'id_card';
FILE: new-common/src/blockchain/proving.ts
function bigIntReplacer (line 19) | function bigIntReplacer(_key: string, value: unknown): unknown {
function getPayload (line 23) | function getPayload(
function getWSDbRelayerUrl (line 70) | function getWSDbRelayerUrl(endpointType: EndpointType) {
FILE: new-common/src/certificates/csca.ts
function getCSCAFromSKI (line 4) | function getCSCAFromSKI(ski: string, skiPem: Record<string, string> | nu...
function getSKIPEM (line 22) | async function getSKIPEM(
FILE: new-common/src/certificates/factory.ts
class SimpleCertificateParser (line 8) | class SimpleCertificateParser implements ICertificateParser {
method parse (line 9) | parse(pem: string): CertificateData {
method getCertificateFromPem (line 13) | getCertificateFromPem(pem: string): Certificate {
method getAuthorityKeyIdentifier (line 17) | getAuthorityKeyIdentifier(cert: Certificate): string {
function createCertificateParser (line 22) | function createCertificateParser(): ICertificateParser {
FILE: new-common/src/certificates/parsing/bruteForceSignature.ts
function bruteForceSignatureAlgorithmDsc (line 11) | function bruteForceSignatureAlgorithmDsc(dsc: CertificateData, csca: Cer...
function bruteForceHashAlgorithmDsc (line 41) | function bruteForceHashAlgorithmDsc(
function verifySignature (line 55) | function verifySignature(
function verifyECDSA (line 73) | function verifyECDSA(dsc: CertificateData, csca: CertificateData, hashAl...
function verifyRSA (line 102) | function verifyRSA(dsc: CertificateData, csca: CertificateData, hashAlgo...
function verifyRSAPSS (line 129) | function verifyRSAPSS(
function getTBSHash (line 165) | function getTBSHash(
FILE: new-common/src/certificates/parsing/curves.ts
function getCurveForElliptic (line 3) | function getCurveForElliptic(curveName: string): string {
function getECDSACurveBits (line 22) | function getECDSACurveBits(curveName: string): string {
function identifyCurve (line 40) | function identifyCurve(params: StandardCurve): string {
function normalizeHex (line 66) | function normalizeHex(hex: string): string {
FILE: new-common/src/certificates/parsing/elliptic.ts
function initElliptic (line 4) | function initElliptic(): typeof elliptic {
FILE: new-common/src/certificates/parsing/oids.ts
function extractHashFunction (line 1) | function extractHashFunction(friendlyName: string): string {
function getFriendlyName (line 17) | function getFriendlyName(oid: string): string {
function getSecpFromNist (line 21) | function getSecpFromNist(nist: string): string {
function getFriendlyNameSecpCurves (line 35) | function getFriendlyNameSecpCurves(friendlyName: string): string {
FILE: new-common/src/certificates/parsing/parseCertificateSimple.ts
function getCertificateFromPem (line 22) | function getCertificateFromPem(pemContent: string): Certificate {
function getHashAlgorithm (line 76) | function getHashAlgorithm(rawSignatureAlgorithm: string) {
function getParamsRSA (line 90) | function getParamsRSA(cert: Certificate): PublicKeyDetailsRSA {
function getParamsRSAPSS (line 105) | function getParamsRSAPSS(cert: Certificate): PublicKeyDetailsRSAPSS {
function getParamsECDSA (line 136) | function getParamsECDSA(cert: Certificate): PublicKeyDetailsECDSA {
function getTBSBytesForge (line 243) | function getTBSBytesForge(certificate: Certificate): number[] {
function parseCertificateSimple (line 247) | function parseCertificateSimple(pem: string): CertificateData {
FILE: new-common/src/certificates/parsing/parseDscCertificateData.ts
type DscCertificateMetaData (line 10) | interface DscCertificateMetaData {
function getCurveOrExponent (line 22) | function getCurveOrExponent(certData: CertificateData): string {
function parseDscCertificateData (line 29) | function parseDscCertificateData(
FILE: new-common/src/certificates/parsing/utils.ts
function getIssuerCountryCode (line 27) | function getIssuerCountryCode(cert: Certificate): string {
FILE: new-common/src/certificates/pubkey.ts
function getCertificatePubKey (line 10) | function getCertificatePubKey(
function formatCertificatePubKeyDSC (line 33) | function formatCertificatePubKeyDSC(
function findStartPubKeyIndex (line 48) | function findStartPubKeyIndex(
function findStartIndex (line 65) | function findStartIndex(modulus: string, messagePaddedNumber: number[]):...
function findStartIndexEC (line 89) | function findStartIndexEC(point: string, messagePadded: number[]): [numb...
function findOIDPosition (line 111) | function findOIDPosition(
FILE: new-common/src/certificates/signature.ts
function formatInputToStrings (line 24) | function formatInputToStrings(input: string[]): string[] {
function extractRSFromSignature (line 28) | function extractRSFromSignature(signatureBytes: number[]): { r: string; ...
function extractSignatureFromDSC (line 46) | function extractSignatureFromDSC(dscCertificate: string) {
function formatSignatureDSCCircuit (line 52) | function formatSignatureDSCCircuit(
function getSignatureAlgorithmFullName (line 74) | function getSignatureAlgorithmFullName(
function getNAndK (line 88) | function getNAndK(sigAlg: SignatureAlgorithm) {
function getNAndKCSCA (line 129) | function getNAndKCSCA(sigAlg: 'rsa' | 'ecdsa' | 'rsapss') {
FILE: new-common/src/certificates/types.ts
type ICertificateParser (line 5) | interface ICertificateParser {
FILE: new-common/src/circuits/circuitName.ts
function isKycDocument (line 3) | function isKycDocument(doc: IDDocument): doc is KycData {
function getCircuitNameFromPassportData (line 7) | function getCircuitNameFromPassportData(
function getDSCircuitNameFromPassportData (line 18) | function getDSCircuitNameFromPassportData(passportData: IDDocument) {
function getRegisterNameFromPassportData (line 59) | function getRegisterNameFromPassportData(passportData: IDDocument) {
FILE: new-common/src/circuits/generator.ts
function assertPassport (line 26) | function assertPassport(doc: IDocument): PassportDocument {
function assertAadhaar (line 33) | function assertAadhaar(doc: IDocument): AadhaarDocument {
function assertKyc (line 40) | function assertKyc(doc: IDocument): KycDocument {
function assertExhaustive (line 47) | function assertExhaustive(category: never): never {
class CircuitInputGenerator (line 51) | class CircuitInputGenerator implements ICircuitInputGenerator {
method generateRegisterInputs (line 52) | generateRegisterInputs<T extends IDocument>(
method generateDscInputs (line 91) | generateDscInputs<T extends IDocument>(doc: T, serializedCscaTree: str...
method generateDiscloseInputs (line 109) | generateDiscloseInputs<T extends IDocument>(
function createCircuitInputGenerator (line 158) | function createCircuitInputGenerator(): ICircuitInputGenerator {
FILE: new-common/src/circuits/inputs/disclose-aadhaar.ts
type AadhaarDiscloseInputOpts (line 16) | interface AadhaarDiscloseInputOpts {
function computeNullifier (line 28) | function computeNullifier(fields: {
function computePackedCommitment (line 48) | function computePackedCommitment(fields: {
function generateAadhaarDiscloseInputs (line 64) | function generateAadhaarDiscloseInputs(
FILE: new-common/src/circuits/inputs/disclose-kyc.ts
type KycDiscloseInputOpts (line 20) | interface KycDiscloseInputOpts {
function generateOfacProof (line 32) | function generateOfacProof(data: KycData, smt: SMT, proofLevel: number) {
function buildKycDiscloseSelector (line 48) | function buildKycDiscloseSelector(fieldsToReveal: KycField[]): string[] {
function generateKycDiscloseInputs (line 53) | function generateKycDiscloseInputs(
function generateKycDiscloseInputFromDummy (line 135) | function generateKycDiscloseInputFromDummy(
FILE: new-common/src/circuits/inputs/disclose.ts
function findIndexInTree (line 18) | function findIndexInTree(tree: LeanIMT, commitment: bigint): number {
function generatePassportDiscloseInputs (line 29) | function generatePassportDiscloseInputs(
FILE: new-common/src/circuits/inputs/dsc.ts
function generatePassportDscInputs (line 11) | function generatePassportDscInputs(
FILE: new-common/src/circuits/inputs/format.ts
function formatInput (line 3) | function formatInput(input: any) {
function formatCountriesList (line 20) | function formatCountriesList(countries: string[]) {
function reverseBytes (line 46) | function reverseBytes(input: string): string {
function reverseCountryBytes (line 52) | function reverseCountryBytes(input: string): string {
FILE: new-common/src/circuits/inputs/ofac.ts
function generateCircuitInputsCountryVerifier (line 14) | function generateCircuitInputsCountryVerifier(
function generateCircuitInputsOfac (line 32) | function generateCircuitInputsOfac(
FILE: new-common/src/circuits/inputs/register-aadhaar.ts
type AadhaarRegisterInputOpts (line 14) | interface AadhaarRegisterInputOpts {
function computeNullifier (line 19) | function computeNullifier(fields: {
function computePackedCommitment (line 39) | function computePackedCommitment(fields: {
function generateAadhaarRegisterInputs (line 55) | function generateAadhaarRegisterInputs(
FILE: new-common/src/circuits/inputs/register-kyc.ts
function generateKycRegisterInputs (line 10) | function generateKycRegisterInputs(
function generateMockKycRegisterInputs (line 36) | function generateMockKycRegisterInputs(
FILE: new-common/src/circuits/inputs/register.ts
function generatePassportRegisterInputs (line 15) | function generatePassportRegisterInputs(
FILE: new-common/src/circuits/outputs/format.ts
function trimu0000 (line 8) | function trimu0000(unpackedReveal: string[]): string[] {
function unpackReveal (line 12) | function unpackReveal(revealedData_packed: string | string[]): string[] {
function formatAndUnpackForbiddenCountriesList (line 28) | function formatAndUnpackForbiddenCountriesList(
function formatAndUnpackReveal (line 48) | function formatAndUnpackReveal(
function formatForbiddenCountriesListFromCircuitOutput (line 66) | function formatForbiddenCountriesListFromCircuitOutput(
function getAttributeFromUnpackedReveal (line 81) | function getAttributeFromUnpackedReveal(
function getOlderThanFromCircuitOutput (line 97) | function getOlderThanFromCircuitOutput(olderThan: string[]): number {
function revealBitmapFromAttributes (line 103) | function revealBitmapFromAttributes(
function revealBitmapFromMapping (line 118) | function revealBitmapFromMapping(attributeToReveal: { [key: string]: str...
FILE: new-common/src/circuits/types.ts
type PassportRegisterOpts (line 11) | interface PassportRegisterOpts {
type PassportDiscloseOpts (line 15) | interface PassportDiscloseOpts {
type RegisterOptsFor (line 29) | type RegisterOptsFor<T extends IDocument> = T extends PassportDocument
type DiscloseOptsFor (line 35) | type DiscloseOptsFor<T extends IDocument> = T extends PassportDocument
type PassportRegisterInputs (line 45) | interface PassportRegisterInputs {
type PassportDscInputs (line 67) | interface PassportDscInputs {
type PassportDiscloseInputs (line 81) | interface PassportDiscloseInputs {
type RegisterInputsFor (line 112) | type RegisterInputsFor<T extends IDocument> = T extends PassportDocument
type DscInputsFor (line 116) | type DscInputsFor<T extends IDocument> = T extends PassportDocument
type DiscloseInputsFor (line 120) | type DiscloseInputsFor<T extends IDocument> = T extends PassportDocument
type ICircuitInputGenerator (line 126) | interface ICircuitInputGenerator {
FILE: new-common/src/circuits/userId.ts
type UserIdType (line 1) | type UserIdType = 'hex' | 'uuid';
function hexToBigInt (line 3) | function hexToBigInt(hex: string): bigint {
function checkBigInt (line 7) | function checkBigInt(bigInt: bigint) {
function uuidToBigInt (line 14) | function uuidToBigInt(uuid: string): bigint {
function checkStringLength (line 18) | function checkStringLength(str: string) {
function stringToBigInt (line 24) | function stringToBigInt(str: string): bigint {
function bigIntToHex (line 33) | function bigIntToHex(bigInt: bigint): string {
function castFromScope (line 37) | function castFromScope(scope: string): string {
function castFromUUID (line 42) | function castFromUUID(uuid: string): string {
function castToAddress (line 48) | function castToAddress(bigInt: bigint): string {
function castToScope (line 52) | function castToScope(num: bigint): string {
function castToUUID (line 58) | function castToUUID(bigInt: bigint): string {
function castToUserIdentifier (line 62) | function castToUserIdentifier(bigInt: bigint, user_identifier_type: User...
function hexToUUID (line 71) | function hexToUUID(hex: string): string {
function stringToAsciiBigIntArray (line 75) | function stringToAsciiBigIntArray(str: string): bigint[] {
function validateUserId (line 79) | function validateUserId(userId: string, type: UserIdType): boolean {
FILE: new-common/src/crypto/eddsa.ts
function getRequire (line 7) | function getRequire() {
function modulus (line 19) | function modulus(a: bigint, m: bigint): bigint {
function signEdDSA (line 23) | function signEdDSA(key: bigint, msg: number[]) {
FILE: new-common/src/crypto/encryption.ts
function encryptAES256GCM (line 4) | function encryptAES256GCM(plaintext: string, key: forge.util.ByteStringB...
FILE: new-common/src/crypto/hash/poseidon.ts
function flexiblePoseidon (line 22) | function flexiblePoseidon(inputs: bigint[]): bigint {
function customHasher (line 61) | function customHasher(pubKeyFormatted: string[]) {
function packBytesAndPoseidon (line 85) | function packBytesAndPoseidon(unpacked: number[]) {
FILE: new-common/src/crypto/hash/sha.ts
function getHashLen (line 9) | function getHashLen(hashFunction: string) {
function hash (line 27) | function hash(
function forgeDigest (line 68) | function forgeDigest(hashAlgorithm: string): forge.md.MessageDigest {
FILE: new-common/src/crypto/identity.ts
function calculateUserIdentifierHash (line 3) | function calculateUserIdentifierHash(
function getSolidityPackedUserContextData (line 19) | function getSolidityPackedUserContextData(
FILE: new-common/src/crypto/scope.ts
function bigIntToString (line 5) | function bigIntToString(bigInt: bigint): string {
function formatEndpoint (line 20) | function formatEndpoint(endpoint: string): string {
function hashEndpointWithScope (line 29) | function hashEndpointWithScope(endpoint: string, scope: string): string {
function stringToBigInt (line 47) | function stringToBigInt(str: string): bigint {
FILE: new-common/src/crypto/sha-pad.ts
function writeBigEndian64 (line 1) | function writeBigEndian64(buf: Uint8Array, offset: number, value: number) {
function writeBigEndian128 (line 7) | function writeBigEndian128(buf: Uint8Array, offset: number, value: numbe...
function mergeUInt8Arrays (line 13) | function mergeUInt8Arrays(a1: Uint8Array, a2: Uint8Array): Uint8Array {
function paddedLength (line 20) | function paddedLength(msgLen: number, lengthFieldBytes: number, blockByt...
function shaPad (line 25) | function shaPad(prehash_prepad_m_array: number[], maxShaBytes: number): ...
function sha384_512Pad (line 41) | function sha384_512Pad(
FILE: new-common/src/data/countries.ts
type Country3LetterCode (line 1) | type Country3LetterCode = (typeof countries)[keyof typeof countries];
function alpha2ToAlpha3 (line 3) | function alpha2ToAlpha3(key: string): Country3LetterCode | undefined {
function alpha3ToAlpha2 (line 7) | function alpha3ToAlpha2(key: string) {
constant ALPHA2_TO_ALPHA3 (line 526) | const ALPHA2_TO_ALPHA3 = {
constant ALPHA3_TO_ALPHA2 (line 778) | const ALPHA3_TO_ALPHA2 = Object.fromEntries(
function getCountryISO2 (line 785) | function getCountryISO2(key: string) {
FILE: new-common/src/data/skiPem.ts
constant SKI_PEM (line 3) | const SKI_PEM: Record<string, string> = {
constant SKI_PEM_DEV (line 524) | const SKI_PEM_DEV: Record<string, string> = {
Copy disabled (too large)
Download .json
Condensed preview — 3708 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (112,001K chars).
[
{
"path": ".actrc",
"chars": 136,
"preview": "--container-architecture linux/amd64\n--platform macos-latest=catthehacker/ubuntu:runner-latest\n--secret-file ./app/fastl"
},
{
"path": ".coderabbit.yaml",
"chars": 1608,
"preview": "# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json\n\nlanguage: \"en-US\"\ntone_instructions: "
},
{
"path": ".cursor/mcp.json",
"chars": 41,
"preview": "{\n \"mcpServers\": {},\n \"settings\": {}\n}\n"
},
{
"path": ".cursor/rules/compliance-verification.mdc",
"chars": 4260,
"preview": "---\ndescription: Critical compliance verification requirements for OFAC checks, age verification, and forbidden country "
},
{
"path": ".cursor/rules/test-memory-optimization.mdc",
"chars": 6955,
"preview": "---\ndescription: Critical rules for avoiding out-of-memory issues in tests, specifically preventing nested require() cal"
},
{
"path": ".cursorignore",
"chars": 5810,
"preview": "# .cursorignore - Cursor AI editor ignore file\n# This file prevents Cursor from accessing sensitive files and improves p"
},
{
"path": ".cursorrules",
"chars": 7169,
"preview": "\n# main-overview\n\n## Development Guidelines\n\n- Only modify code directly relevant to the specific request. Avoid changin"
},
{
"path": ".editorconfig",
"chars": 134,
"preview": "root = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = true\n\n[*.{js,json,yml}]\ncharset = utf-8\nindent_style = space\nin"
},
{
"path": ".eslintignore",
"chars": 189,
"preview": "node_modules\ndist\nbuild\ncoverage\nios/build\nandroid/build\nandroid/app/build\napp/vendor\ncircuits/build\ncontracts/artifacts"
},
{
"path": ".gitattributes",
"chars": 142,
"preview": "/.yarn/** linguist-vendored\n/.yarn/releases/* binary\n/.yarn/plugins/**/* binary\n/.pnp.* bina"
},
{
"path": ".gitguardian.yml",
"chars": 3035,
"preview": "# GitGuardian configuration for ggshield\n# This file configures which files and secrets to ignore during scanning\n\n# Ign"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 727,
"preview": "---\nname: Bug Report\nabout: Report a bug or unexpected behavior\ntitle: '[Bug] '\nlabels: bug\nassignees: ''\n---\n\n> **⚠️ Se"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 882,
"preview": "---\nname: Feature Request / Contribution\nabout: Suggest a new feature or propose a contribution\ntitle: '[Feature] '\nlabe"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 615,
"preview": "## Summary\n\n<!-- Brief description of changes -->\n\n## Test plan\n\n<!-- How was this tested? -->\n\n---\n\n### Native Consolid"
},
{
"path": ".github/actionlint.yaml",
"chars": 332,
"preview": "# Actionlint configuration to register custom runner labels\n# This prevents actionlint warnings about unrecognized runne"
},
{
"path": ".github/actions/cache-built-deps/action.yml",
"chars": 1127,
"preview": "name: cache-built-deps\ndescription: Cache built JS artifacts (common + mobile-sdk-alpha)\ninputs:\n cache-version:\n de"
},
{
"path": ".github/actions/cache-bundler/action.yml",
"chars": 1262,
"preview": "name: Cache Bundler\n\ndescription: Cache Ruby gems installed via Bundler.\n\ninputs:\n path:\n description: Paths to cach"
},
{
"path": ".github/actions/cache-core-sdk-build/action.yml",
"chars": 1221,
"preview": "name: Cache Core SDK Build\ndescription: Cache core SDK build artifacts (common, sdk/core)\n\ninputs:\n mode:\n descripti"
},
{
"path": ".github/actions/cache-gradle/action.yml",
"chars": 976,
"preview": "name: Cache Gradle\n\ndescription: Cache Gradle wrappers and dependencies.\n\ninputs:\n path:\n description: Paths to cach"
},
{
"path": ".github/actions/cache-mobile-sdk-build/action.yml",
"chars": 1317,
"preview": "name: Cache Mobile SDK Build\ndescription: Cache mobile SDK build artifacts (common, mobile-sdk-alpha)\n\ninputs:\n mode:\n "
},
{
"path": ".github/actions/cache-pods/action.yml",
"chars": 900,
"preview": "name: Cache Pods\n\ndescription: Cache CocoaPods dependencies.\n\ninputs:\n path:\n description: Paths to cache\n requir"
},
{
"path": ".github/actions/cache-sdk-build/action.yml",
"chars": 1119,
"preview": "name: Cache SDK Build\ndescription: Cache SDK build artifacts (common, sdk-common, qrcode)\n\ninputs:\n mode:\n descripti"
},
{
"path": ".github/actions/cache-yarn/action.yml",
"chars": 1284,
"preview": "name: Cache Yarn\n\ndescription: Cache Yarn dependencies with consistent keys and paths.\n\ninputs:\n path:\n description:"
},
{
"path": ".github/actions/cleanup-gradle-artifacts/action.yml",
"chars": 1085,
"preview": "name: Clean Up Gradle Artifacts\n\ndescription: Clean up unnecessary Gradle build artifacts to save disk space and reduce "
},
{
"path": ".github/actions/clone-android-passport-nfc-reader/action.yml",
"chars": 2171,
"preview": "name: Clone android-passport-nfc-reader\ndescription: \"Clones the android-passport-nfc-reader repository if it does not e"
},
{
"path": ".github/actions/create-version-bump-pr/action.yml",
"chars": 1993,
"preview": "name: Create Version Bump PR\ndescription: Creates a PR from staging changes onto dev branch\ninputs:\n platform:\n desc"
},
{
"path": ".github/actions/find-ios-simulator/action.yml",
"chars": 6832,
"preview": "name: Find iOS Simulator\ndescription: >-\n Finds an iPhone simulator to use for an iOS build. If a workspace and scheme\n"
},
{
"path": ".github/actions/free-disk-space/action.yml",
"chars": 1079,
"preview": "name: Free Disk Space\n\ndescription: Free up disk space on GitHub Actions runners by removing unnecessary pre-installed t"
},
{
"path": ".github/actions/generate-github-token/action.yml",
"chars": 2019,
"preview": "name: \"Generate GitHub App Token\"\ndescription: \"Generates a GitHub App token for accessing repositories in the selfxyz o"
},
{
"path": ".github/actions/get-version/action.yml",
"chars": 656,
"preview": "name: Get Version from package.json\n\ndescription: \"Gets the version from package.json and sets it as an environment vari"
},
{
"path": ".github/actions/mobile-setup/action.yml",
"chars": 3080,
"preview": "name: Setup Mobile Environment\n\ndescription: \"Sets up the environment for mobile app builds\"\n\ninputs:\n app_path:\n de"
},
{
"path": ".github/actions/push-changes/action.yml",
"chars": 2681,
"preview": "name: Push Build Version Changes\n\ndescription: \"Commits and pushes build version changes for mobile platforms\"\n\ninputs:\n"
},
{
"path": ".github/actions/yarn-install/action.yml",
"chars": 844,
"preview": "name: Yarn Install\n\ndescription: Install Yarn v4 and run yarn install.\n\ninputs:\n working_directory:\n description: Th"
},
{
"path": ".github/actions/yarnrc-hash/action.yml",
"chars": 767,
"preview": "name: Compute .yarnrc.yml hash\n\ndescription: Compute a stable hash for .yarnrc.yml to use in cache keys.\n\noutputs:\n has"
},
{
"path": ".github/workflows/block-non-dev-to-main.yml",
"chars": 350,
"preview": "name: Block non-staging PRs to main\n\non:\n pull_request:\n branches: [main]\n\njobs:\n check-source:\n runs-on: ubuntu"
},
{
"path": ".github/workflows/circuits-build.yml",
"chars": 8663,
"preview": "name: Circuits Build\non:\n pull_request:\n branches:\n - dev\n - staging\n - main\n paths:\n - \"circ"
},
{
"path": ".github/workflows/circuits.yml",
"chars": 5516,
"preview": "name: Circuits CI\non:\n pull_request:\n branches:\n - dev\n - staging\n - main\njobs:\n check_changes:\n "
},
{
"path": ".github/workflows/common-ci.yml",
"chars": 3892,
"preview": "name: Common CI\n\non:\n pull_request:\njobs:\n build:\n runs-on: ubuntu-latest\n permissions:\n contents: read\n "
},
{
"path": ".github/workflows/contracts.yml",
"chars": 3586,
"preview": "name: Contracts CI\non:\n pull_request:\n branches:\n - dev\n - staging\n - main\n\nenv:\n GH_HARDHAT_CACHE_V"
},
{
"path": ".github/workflows/core-sdk-ci.yml",
"chars": 5128,
"preview": "name: Core SDK CI\n\non:\n pull_request:\n branches:\n - dev\n - staging\n - main\n\njobs:\n check_changes:\n "
},
{
"path": ".github/workflows/gitleaks.yml",
"chars": 423,
"preview": "name: Gitleaks Scan\n\non:\n pull_request:\n\njobs:\n gitleaks:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/"
},
{
"path": ".github/workflows/kmp-ci.yml",
"chars": 7947,
"preview": "name: KMP CI\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - \"packages/kmp-sdk/**\"\n - \"packa"
},
{
"path": ".github/workflows/mobile-bundle-analysis.yml",
"chars": 6146,
"preview": "name: Mobile Bundle Analysis\n\nenv:\n RUBY_VERSION: 3.2\n JAVA_VERSION: 17\n WORKSPACE: ${{ github.workspace }}\n APP_PAT"
},
{
"path": ".github/workflows/mobile-ci.yml",
"chars": 9085,
"preview": "name: Mobile CI\nenv:\n # Build environment versions\n # Node version is read from .nvmrc during workflow execution\n RUB"
},
{
"path": ".github/workflows/mobile-deploy-auto.yml",
"chars": 5758,
"preview": "name: Mobile Auto Deploy\n\non:\n pull_request:\n types: [closed]\n branches: [staging]\n paths:\n - \"app/**\"\n "
},
{
"path": ".github/workflows/mobile-deploy.yml",
"chars": 74523,
"preview": "name: Mobile Deploy\n# Runs on:\n# 1. Manual trigger (workflow_dispatch) with configurable options\n# 2. When PRs are merge"
},
{
"path": ".github/workflows/mobile-e2e.yml",
"chars": 53854,
"preview": "name: Mobile E2E\n\nenv:\n # Build environment versions\n JAVA_VERSION: 17\n ANDROID_API_LEVEL: 34\n ANDROID_NDK_VERSION: "
},
{
"path": ".github/workflows/mobile-sdk-ci.yml",
"chars": 3628,
"preview": "name: Mobile SDK CI\n\non:\n pull_request:\n paths:\n - \"packages/mobile-sdk-alpha/**\"\n - \".github/workflows/mo"
},
{
"path": ".github/workflows/mobile-sdk-demo-ci.yml",
"chars": 897,
"preview": "name: Mobile SDK Demo CI\n\non:\n pull_request:\n paths:\n - \"packages/mobile-sdk-alpha/**\"\n - \"packages/mobile"
},
{
"path": ".github/workflows/mobile-sdk-demo-e2e.yml",
"chars": 20810,
"preview": "name: Mobile SDK Demo E2E\n\nenv:\n # Build environment versions\n JAVA_VERSION: 17\n ANDROID_API_LEVEL: 33\n ANDROID_NDK_"
},
{
"path": ".github/workflows/native-shells-ci.yml",
"chars": 2911,
"preview": "name: Native Shells CI\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - \"packages/native-shell-and"
},
{
"path": ".github/workflows/npm-publish.yml",
"chars": 18115,
"preview": "name: NPM Publish\n\non:\n push:\n branches:\n - dev\n paths:\n - \"sdk/core/package.json\"\n - \"sdk/qrcode/"
},
{
"path": ".github/workflows/qrcode-sdk-ci.yml",
"chars": 11181,
"preview": "name: QRCode SDK CI\n\nenv:\n # Build environment versions\n # Node version is read from .nvmrc during workflow execution\n"
},
{
"path": ".github/workflows/release-calendar.yml",
"chars": 15485,
"preview": "name: Release Calendar\n\n# Creates release PRs on a schedule or manually via workflow_dispatch.\n#\n# HOW IT WORKS:\n# 1. De"
},
{
"path": ".github/workflows/rn-sdk-test-app-ci.yml",
"chars": 5039,
"preview": "name: RN SDK Test App CI\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - \"packages/rn-sdk/**\"\n "
},
{
"path": ".github/workflows/swift-sdk-ci.yml",
"chars": 1491,
"preview": "name: Swift SDK CI\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - \"packages/self-sdk-swift/**\"\n "
},
{
"path": ".github/workflows/web.yml",
"chars": 557,
"preview": "name: Web CI\n\non:\n pull_request:\n branches:\n - dev\n - staging\n - main\n paths:\n - \"app/**\"\n "
},
{
"path": ".github/workflows/webview-app-ci.yml",
"chars": 2439,
"preview": "name: WebView App CI\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - \"common/**\"\n - \"package"
},
{
"path": ".github/workflows/webview-bridge-ci.yml",
"chars": 2362,
"preview": "name: WebView Bridge CI\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - \"common/**\"\n - \"pack"
},
{
"path": ".github/workflows/workspace-ci.yml",
"chars": 5827,
"preview": "name: Workspace CI\n\non:\n pull_request:\n branches:\n - dev\n - staging\n - main\n push:\n branches:\n "
},
{
"path": ".gitignore",
"chars": 1735,
"preview": "contracts/contracts/RegisterASCII.txt\nsdk/.env\n.DS_Store\n# Exception: Include mobile-sdk-alpha AAR files\n!packages/mobil"
},
{
"path": ".gitleaks.toml",
"chars": 97064,
"preview": "# This file has been auto-generated. Do not edit manually.\n# If you would like to contribute new rules, please use\n# cmd"
},
{
"path": ".gitleaksignore",
"chars": 905,
"preview": "1b461a626e0a4a93d4e1c727e7aed8c955aa728c:common/src/utils/passports/validate.test.ts:generic-api-key:54\n1b461a626e0a4a93"
},
{
"path": ".gitmodules",
"chars": 474,
"preview": "[submodule \"contracts/lib/openzeppelin-foundry-upgrades\"]\n\tpath = contracts/lib/openzeppelin-foundry-upgrades\n\turl = htt"
},
{
"path": ".husky/pre-commit",
"chars": 577,
"preview": "if ! yarn gitleaks; then\n echo \"❌ Gitleaks scan failed. Please review the output above and fix any issues.\"\n echo \"💡 T"
},
{
"path": ".nvmrc",
"chars": 8,
"preview": "22.22.0\n"
},
{
"path": ".prettierignore",
"chars": 287,
"preview": "# Root .prettierignore\n**/node_modules/**\n**/.yarn/**\n**/dist/**\n**/build/**\n.gradle-home/**\n**/coverage/**\n**/Pods/**\na"
},
{
"path": ".prettierrc",
"chars": 234,
"preview": "{\n \"arrowParens\": \"avoid\",\n \"bracketSameLine\": false,\n \"bracketSpacing\": true,\n \"singleQuote\": true,\n \"trailingComm"
},
{
"path": ".vscode/settings.json",
"chars": 3648,
"preview": "{\n // Performance Optimizations\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n "
},
{
"path": ".vscode/tasks.json",
"chars": 2159,
"preview": "{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"label\": \"Check License Headers\",\n \"type\": \"shell\",\n \"command"
},
{
"path": ".watchmanconfig",
"chars": 157,
"preview": "{\n \"ignore_dirs\": [\n \".git\",\n \".hg\",\n \"node_modules\",\n \"ios/build\",\n \"android/build\",\n \"android/app/b"
},
{
"path": "AGENTS.md",
"chars": 10001,
"preview": "# AGENTS Instructions\n\n## Package Management\n\n**Package Manager:** Yarn\n\n**Commands to use:** yarn install, yarn add, ya"
},
{
"path": "CLAUDE.md",
"chars": 11485,
"preview": "# Claude Code Instructions\n\n## Repository Overview\n\nYarn v4 monorepo for Self — identity verification using passport NFC"
},
{
"path": "LICENSE",
"chars": 168,
"preview": "This repository contains multiple packages, each with its own LICENSE file.\nRefer to the LICENSE file in each package di"
},
{
"path": "README.md",
"chars": 6191,
"preview": "\n\nMonorepo"
},
{
"path": "app/.babelrc",
"chars": 50,
"preview": "{\n \"plugins\": [[\"module:react-native-dotenv\"]]\n}\n"
},
{
"path": "app/.bundle/config",
"chars": 29,
"preview": "BUNDLE_PATH: \"vendor/bundle\"\n"
},
{
"path": "app/.codecov.yml",
"chars": 837,
"preview": "codecov:\n require_ci_to_pass: yes\n\ncoverage:\n precision: 2\n round: down\n range: \"80...100\"\n status:\n project:\n "
},
{
"path": "app/.eslintrc.cjs",
"chars": 9699,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/.gitattributes",
"chars": 142,
"preview": "/.yarn/** linguist-vendored\n/.yarn/releases/* binary\n/.yarn/plugins/**/* binary\n/.pnp.* bina"
},
{
"path": "app/.github/workflows/test-coverage.yml",
"chars": 978,
"preview": "name: Test and Coverage\n\non:\n push:\n branches: [main, dev]\n paths:\n - \"app/**\"\n - \".github/workflows/te"
},
{
"path": "app/.gitignore",
"chars": 1523,
"preview": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nios/build\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n"
},
{
"path": "app/.prettierignore",
"chars": 119,
"preview": "android/\ndeployments/\nios/\nnode_modules/\nsrc/assets/animations/\nwitnesscalc/\nvendor/\nandroid/\n.tamagui/\nweb/dist/\n*.md\n"
},
{
"path": "app/.prettierrc",
"chars": 334,
"preview": "{\n \"arrowParens\": \"avoid\",\n \"bracketSameLine\": false,\n \"bracketSpacing\": true,\n \"singleQuote\": true,\n \"trailingComm"
},
{
"path": "app/.ruby-version",
"chars": 6,
"preview": "3.2.8\n"
},
{
"path": "app/.tool-versions",
"chars": 11,
"preview": "ruby 3.2.6\n"
},
{
"path": "app/AGENTS.md",
"chars": 9979,
"preview": "# AGENTS Instructions\n\n## Prerequisites\n\n- Node.js 22.x (`nvm use`), Yarn via Corepack (`corepack enable && corepack pre"
},
{
"path": "app/App.tsx",
"chars": 4161,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/Gemfile",
"chars": 623,
"preview": "source \"https://rubygems.org\"\n\n# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version\nruby \""
},
{
"path": "app/LICENSE",
"chars": 1498,
"preview": "Business Source License 1.1\n\nParameters\n\nLicensor: Social Connect Labs, Inc.\n\nLicensed Work: The code in this folder and"
},
{
"path": "app/README.md",
"chars": 11240,
"preview": "# Self.xyz Mobile App\n\n## Quick Start\n\nRun the interactive setup script to check and install all dependencies:\n\n```bash\n"
},
{
"path": "app/android/.gitignore",
"chars": 223,
"preview": "build\n\n# Private modules cloned dynamically by setup-private-modules.cjs\nandroid-passport-nfc-reader/\nreact-native-passp"
},
{
"path": "app/android/app/build.gradle",
"chars": 9120,
"preview": "apply plugin: \"com.android.application\"\napply plugin: \"com.facebook.react\"\napply plugin: \"org.jetbrains.kotlin.android\"\n"
},
{
"path": "app/android/app/google-services.json",
"chars": 1271,
"preview": "{\n \"project_info\": {\n \"project_number\": \"260578412566\",\n \"project_id\": \"selfxyz-app\",\n \"storage_bucket\": \"self"
},
{
"path": "app/android/app/proguard-rules.pro",
"chars": 435,
"preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /u"
},
{
"path": "app/android/app/src/debug/AndroidManifest.xml",
"chars": 1016,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "app/android/app/src/debug/res/xml/network_security_config.xml",
"chars": 821,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n <!-- Debug configuration: Allow cleartext traffic f"
},
{
"path": "app/android/app/src/main/AndroidManifest.xml",
"chars": 5222,
"preview": "<manifest\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:tools=\"http://schemas.android.com/tools\"\n"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/BackupModule.kt",
"chars": 1013,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/BackupPackage.kt",
"chars": 726,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/CameraActivityPackage.java",
"chars": 948,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/MainActivity.kt",
"chars": 2235,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/MainApplication.kt",
"chars": 2714,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/NativeLoggerBridgeModule.kt",
"chars": 2689,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/PhotoPickerActivity.java",
"chars": 2753,
"preview": "// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to Apac"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/QRCodeScannerModule.java",
"chars": 10681,
"preview": "// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to Apac"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/QRCodeScannerPackage.java",
"chars": 951,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/ui/CameraMLKitFragment.kt",
"chars": 16127,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/ui/PassportOCRViewManager.kt",
"chars": 5800,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/ui/QRCodeScannerViewManager.kt",
"chars": 6023,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/ui/QrCodeScannerFragment.kt",
"chars": 13689,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/java/com/proofofpassportapp/utils/QrCodeDetectorProcessor.kt",
"chars": 8612,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/android/app/src/main/res/drawable/rn_edit_text_material.xml",
"chars": 1915,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2014 The Android Open Source Project\n\n Licensed under the "
},
{
"path": "app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 261,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <bac"
},
{
"path": "app/android/app/src/main/res/values/colors.xml",
"chars": 117,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"notification_color\">#000000</color>\n</resources>\n"
},
{
"path": "app/android/app/src/main/res/values/ic_launcher_background.xml",
"chars": 120,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"ic_launcher_background\">#F4F4F4</color>\n</resources>"
},
{
"path": "app/android/app/src/main/res/values/strings.xml",
"chars": 227,
"preview": "<resources>\n <string name=\"app_name\">Self</string>\n <string name=\"default_notification_channel_id\">self_notificati"
},
{
"path": "app/android/app/src/main/res/values/styles.xml",
"chars": 819,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <style name=\"AppTheme\" parent=\"Theme.EdgeToEdge\">\n <item na"
},
{
"path": "app/android/app/src/main/res/xml/backup_rules.xml",
"chars": 252,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<data-extraction-rules>\n <cloud-backup>\n <include domain=\"file\" path=\".\"\n "
},
{
"path": "app/android/app/src/main/res/xml/network_security_config.xml",
"chars": 399,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n <!-- Base configuration: Disallow cleartext traffic"
},
{
"path": "app/android/app/src/main/res/xml/nfc_tech_filter.xml",
"chars": 154,
"preview": "<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n <tech-list>\n <tech>android.nfc.tech.IsoDep</t"
},
{
"path": "app/android/app/src/release/java/com/awesomeproject/ReactNativeFlipper.java",
"chars": 688,
"preview": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * <p>This source code is licensed under the MIT license fo"
},
{
"path": "app/android/build.gradle",
"chars": 3724,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n e"
},
{
"path": "app/android/gradle/wrapper/gradle-wrapper.properties",
"chars": 282,
"preview": "#Mon Feb 03 16:12:34 CET 2025\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://"
},
{
"path": "app/android/gradle.properties",
"chars": 2480,
"preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
},
{
"path": "app/android/gradlew",
"chars": 8483,
"preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "app/android/gradlew.bat",
"chars": 2918,
"preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
},
{
"path": "app/android/link-assets-manifest.json",
"chars": 392,
"preview": "{\n \"migIndex\": 1,\n \"data\": [\n {\n \"path\": \"src/assets/fonts/Advercase-Regular.otf\",\n \"sha1\": \"727727cc90e1"
},
{
"path": "app/android/settings.gradle",
"chars": 1011,
"preview": "pluginManagement { includeBuild(\"../../node_modules/@react-native/gradle-plugin\") }\nplugins { id(\"com.facebook.react.set"
},
{
"path": "app/app.json",
"chars": 321,
"preview": "{\n \"name\": \"OpenPassport\",\n \"displayName\": \"Self App\",\n \"expo\": {\n \"name\": \"Self App\",\n \"slug\": \"self-app\",\n "
},
{
"path": "app/babel.config.cjs",
"chars": 1544,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/babel.config.test.cjs",
"chars": 2171,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/declarations.d.ts",
"chars": 555,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Formatter.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/3ea632a44efe50ed70fb2d82ac17a8ab.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Formatter.json",
"chars": 23416,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Formatter\",\n \"sourceName\": \"contracts/Formatter.sol\",\n \"abi\": ["
},
{
"path": "app/deployments/artifacts/Deploy_Registry#OpenPassportRegister.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/e77472367d96606e614a7779662d92b0.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#OpenPassportRegister.json",
"chars": 32558,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"OpenPassportRegister\",\n \"sourceName\": \"contracts/OpenPassportReg"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#PoseidonT3.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/3ea632a44efe50ed70fb2d82ac17a8ab.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#PoseidonT3.json",
"chars": 67967,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"PoseidonT3\",\n \"sourceName\": \"poseidon-solidity/PoseidonT3.sol\",\n"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Registry.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/e77472367d96606e614a7779662d92b0.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Registry.json",
"chars": 6295,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Registry\",\n \"sourceName\": \"contracts/Registry.sol\",\n \"abi\": [\n "
},
{
"path": "app/deployments/artifacts/Deploy_Registry#SBT.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/e77472367d96606e614a7779662d92b0.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#SBT.json",
"chars": 84681,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"SBT\",\n \"sourceName\": \"contracts/SBT.sol\",\n \"abi\": [\n {\n "
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_disclose.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/647e8fcb1d7cece75d58056820b67f5f.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_disclose.json",
"chars": 11316,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Verifier_disclose\",\n \"sourceName\": \"contracts/Verifier_disclose."
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_dsc_4096.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/8ea09ebed9f522c8b9c97ac3e733e067.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_dsc_4096.json",
"chars": 6778,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Verifier_dsc_4096\",\n \"sourceName\": \"contracts/Verifier_dsc_4096."
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/156ea966d193a8f31731f9de51f9abba.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537.json",
"chars": 7622,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Verifier_register_sha1WithRSAEncryption_65537\",\n \"sourceName\": \""
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537.dbg.json",
"chars": 101,
"preview": "{\n \"_format\": \"hh-sol-dbg-1\",\n \"buildInfo\": \"../build-info/8ea09ebed9f522c8b9c97ac3e733e067.json\"\n}"
},
{
"path": "app/deployments/artifacts/Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537.json",
"chars": 7626,
"preview": "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Verifier_register_sha256WithRSAEncryption_65537\",\n \"sourceName\":"
},
{
"path": "app/deployments/deployed_addresses.json",
"chars": 801,
"preview": "{\n \"Deploy_Registry#Formatter\": \"0xD73395ad7391a3285d2e2a2259031ED6Eb753a2c\",\n \"Deploy_Registry#PoseidonT3\": \"0xbc16D1"
},
{
"path": "app/docs/DOCSTRING_STYLE_GUIDE.md",
"chars": 1133,
"preview": "# Mobile app docstring style guide\n\nDocstrings for the React Native app live alongside the source in `app/src`. We follo"
},
{
"path": "app/docs/MOBILE_DEPLOYMENT.md",
"chars": 5738,
"preview": "# Mobile Deployment Guide\n\nThis guide covers the automated mobile deployment pipeline for iOS and Android apps.\n\n## 🚀 Qu"
},
{
"path": "app/docs/TREE_SHAKING.md",
"chars": 11298,
"preview": "# Tree Shaking Testing and Analysis\n\nThis document explains how to test and measure tree shaking effectiveness in this p"
},
{
"path": "app/docs/examples/tree-shaking/granular-circuits-example.ts",
"chars": 668,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/docs/examples/tree-shaking/level2-optimal-example.ts",
"chars": 1178,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/docs/examples/tree-shaking/level3-migration-guide.ts",
"chars": 8303,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/docs/examples/tree-shaking/level3-optimal-example.ts",
"chars": 3840,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/docs/examples/tree-shaking/optimal-pattern-example.ts",
"chars": 1427,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/env.sample",
"chars": 273,
"preview": "ENABLE_DEBUG_LOGS=\nGITLEAKS_LICENSE=\nGOOGLE_SIGNIN_ANDROID_CLIENT_ID=\nGOOGLE_SIGNIN_IOS_CLIENT_ID=\nGOOGLE_SIGNIN_WEB_CLI"
},
{
"path": "app/env.ts",
"chars": 1541,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/fastlane/DEV.md",
"chars": 28608,
"preview": "# Fastlane & CI/CD Development Guide 🚀\n\nThis document outlines how to work with the Fastlane setup and the GitHub Action"
},
{
"path": "app/fastlane/Fastfile",
"chars": 16052,
"preview": "# This file contains the fastlane.tools configuration\n# You can find the documentation at https://docs.fastlane.tools\n#\n"
},
{
"path": "app/fastlane/Pluginfile",
"chars": 169,
"preview": "# Autogenerated by fastlane\n#\n# Ensure this file is checked in to source control!\n\ngem 'fastlane-plugin-increment_versio"
},
{
"path": "app/fastlane/README.md",
"chars": 1592,
"preview": "## fastlane documentation\n\n# Installation\n\nMake sure you have the latest version of the Xcode command line tools install"
},
{
"path": "app/fastlane/helpers/android.rb",
"chars": 3658,
"preview": "# SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE)"
},
{
"path": "app/fastlane/helpers/common.rb",
"chars": 3375,
"preview": "# SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE)"
},
{
"path": "app/fastlane/helpers/ios.rb",
"chars": 6060,
"preview": "# SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE)"
},
{
"path": "app/fastlane/helpers/slack.rb",
"chars": 4891,
"preview": "# SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE)"
},
{
"path": "app/fastlane/helpers/version_manager.rb",
"chars": 4832,
"preview": "# SPDX-License-Identifier: BUSL-1.1\n\nrequire \"json\"\nrequire \"time\"\n\nmodule Fastlane\n module Helpers\n module VersionM"
},
{
"path": "app/fastlane/helpers.rb",
"chars": 626,
"preview": "# SPDX-License-Identifier: BUSL-1.1\n\nrequire \"bundler/setup\"\nrequire \"fastlane\"\nrequire \"tempfile\"\nrequire \"fileutils\"\nr"
},
{
"path": "app/fastlane/test/app_name_test.rb",
"chars": 1790,
"preview": "# SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE)"
},
{
"path": "app/fastlane/test/helpers_test.rb",
"chars": 12623,
"preview": "# SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE)"
},
{
"path": "app/firebase.json",
"chars": 129,
"preview": "{\n \"react-native\": {\n \"messaging_auto_init_enabled\": true,\n \"messaging_ios_auto_register_for_remote_messages\": tr"
},
{
"path": "app/index.js",
"chars": 981,
"preview": "// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to"
},
{
"path": "app/ios/.bundle/config",
"chars": 54,
"preview": "---\nBUNDLE_PATH: \"vendor/bundle\"\nBUNDLE_CLEAN: \"true\"\n"
},
{
"path": "app/ios/.xcode.env",
"chars": 1842,
"preview": "# Environment configuration for Xcode script phases\n# Create `.xcode.env.local` for local customizations (not versioned)"
},
{
"path": "app/ios/App Thinning Size Report.txt",
"chars": 15394,
"preview": "\nApp Thinning Size Report for All Variants of OpenPassport\n\nVariant: OpenPassport App Clip-2AF49703-19A9-4ABA-AC17-33B8E"
},
{
"path": "app/ios/AppDelegate.swift",
"chars": 3409,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/CameraView.swift",
"chars": 7197,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/GoogleService-Info.plist",
"chars": 883,
"preview": "\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
},
{
"path": "app/ios/LiveMRZScannerView.swift",
"chars": 3283,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/LottieView.swift",
"chars": 1183,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/MRZScannerModule.m",
"chars": 582,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/MRZScannerModule.swift",
"chars": 3451,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/MrzOcrCorrection.swift",
"chars": 4697,
"preview": "// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to Apac"
},
{
"path": "app/ios/MrzResultMapper.swift",
"chars": 1210,
"preview": "// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to Apac"
},
{
"path": "app/ios/MrzScanEngine.swift",
"chars": 3591,
"preview": "// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.\n// SPDX-License-Identifier: BUSL-1.1\n// NOTE: Converts to Apac"
},
{
"path": "app/ios/NativeLoggerBridge.m",
"chars": 292,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/NativeLoggerBridge.swift",
"chars": 2068,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/NotificationService/Info.plist",
"chars": 1011,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "app/ios/NotificationService/NotificationService.h",
"chars": 270,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/NotificationService/NotificationService.m",
"chars": 1635,
"preview": "// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE"
},
{
"path": "app/ios/OpenPassport/GoogleService-Info.plist",
"chars": 883,
"preview": "\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
},
{
"path": "app/ios/OpenPassport/Images.xcassets/AppIcon.appiconset/Contents.json",
"chars": 217,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"self-app-icon.png\",\n \"idiom\" : \"universal\",\n \"platform\" : \"ios\",\n "
},
{
"path": "app/ios/OpenPassport/Images.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}\n"
},
{
"path": "app/ios/OpenPassport/Info.plist",
"chars": 3730,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "app/ios/OpenPassport/LaunchScreen.storyboard",
"chars": 3130,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "app/ios/OpenPassport/OpenPassport.entitlements",
"chars": 1509,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
}
]
// ... and 3508 more files (download for full content)
About this extraction
This page contains the full source code of the zk-passport/proof-of-passport GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3708 files (172.3 MB), approximately 26.7M tokens, and a symbol index with 1856 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.