diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index 12497f9c..b4aaad1e 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -53,8 +53,4 @@ jobs: - name: Run Tests working-directory: ./circuits - run: yarn test - - - name: Run Tests - working-directory: ./circuits - run: yarn test + run: yarn test \ No newline at end of file diff --git a/app/App.tsx b/app/App.tsx index 649c00cf..d7221d4e 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -9,28 +9,36 @@ import useNavigationStore from './src/stores/navigationStore'; import { AMPLITUDE_KEY } from '@env'; import * as amplitude from '@amplitude/analytics-react-native'; import useUserStore from './src/stores/userStore'; +import { bgWhite } from './src/utils/colors'; global.Buffer = Buffer; function App(): JSX.Element { const toast = useToastController(); const setToast = useNavigationStore((state) => state.setToast); const initUserStore = useUserStore((state) => state.initUserStore); + const setSelectedTab = useNavigationStore((state) => state.setSelectedTab); + + useEffect(() => { + initUserStore(); + }, [initUserStore]); useEffect(() => { setToast(toast); }, [toast, setToast]); - + useEffect(() => { + setSelectedTab('splash'); + }, [setSelectedTab]); useEffect(() => { if (AMPLITUDE_KEY) { amplitude.init(AMPLITUDE_KEY); } - initUserStore(); + //initUserStore(); }, []); // TODO: when passportData already stored, retrieve and jump to main screen return ( - + diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index 7577fe2a..83a9284c 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -140,6 +140,8 @@ dependencies { implementation project(':passportreader') implementation 'org.jmrtd:jmrtd:0.7.18' + implementation 'com.github.blikoon:QRCodeScanner:0.1.2' + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { exclude group:'com.squareup.okhttp3', module:'okhttp' diff --git a/app/android/app/src/main/java/com/awesomeproject/MainApplication.java b/app/android/app/src/main/java/com/awesomeproject/MainApplication.java index ad7a3825..7956205b 100644 --- a/app/android/app/src/main/java/com/awesomeproject/MainApplication.java +++ b/app/android/app/src/main/java/com/awesomeproject/MainApplication.java @@ -13,6 +13,7 @@ import java.util.List; import com.proofofpassport.prover.ProverPackage; import com.rnfs.RNFSPackage; +import com.proofofpassport.QRCodeScannerPackage; public class MainApplication extends Application implements ReactApplication { @@ -32,6 +33,7 @@ protected List getPackages() { // Add the custom package here packages.add(new CameraActivityPackage()); packages.add(new ProverPackage()); + packages.add(new QRCodeScannerPackage()); return packages; } diff --git a/app/android/app/src/main/java/com/awesomeproject/QRCodeScannerModule.java b/app/android/app/src/main/java/com/awesomeproject/QRCodeScannerModule.java new file mode 100644 index 00000000..0e4a4ff5 --- /dev/null +++ b/app/android/app/src/main/java/com/awesomeproject/QRCodeScannerModule.java @@ -0,0 +1,93 @@ +package com.proofofpassport; + +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.BaseActivityEventListener; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.blikoon.qrcodescanner.QrCodeActivity; +import android.Manifest; + +public class QRCodeScannerModule extends ReactContextBaseJavaModule { + + private static final int REQUEST_CODE_QR_SCAN = 101; + private static final int PERMISSION_REQUEST_CAMERA = 1; + private Promise scanPromise; + + private final ActivityEventListener activityEventListener = new BaseActivityEventListener() { + @Override + public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_QR_SCAN) { + if (scanPromise != null) { + if (resultCode == Activity.RESULT_OK) { + String result = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult"); + scanPromise.resolve(result); + } else { + scanPromise.reject("SCAN_FAILED", "QR Code scanning failed or was cancelled"); + } + scanPromise = null; + } + } + } + }; + + QRCodeScannerModule(ReactApplicationContext reactContext) { + super(reactContext); + reactContext.addActivityEventListener(activityEventListener); + } + + @NonNull + @Override + public String getName() { + return "QRCodeScanner"; + } + + @ReactMethod + public void scanQRCode(Promise promise) { + Activity currentActivity = getCurrentActivity(); + if (currentActivity == null) { + promise.reject("ACTIVITY_DOES_NOT_EXIST", "Activity doesn't exist"); + return; + } + + scanPromise = promise; + + if (ContextCompat.checkSelfPermission(currentActivity, Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(currentActivity, + new String[]{Manifest.permission.CAMERA}, + PERMISSION_REQUEST_CAMERA); + } else { + startQRScanner(currentActivity); + } + } + + private void startQRScanner(Activity activity) { + Intent intent = new Intent(activity, QrCodeActivity.class); + activity.startActivityForResult(intent, REQUEST_CODE_QR_SCAN); + } + + // Add this method to handle permission result + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (requestCode == PERMISSION_REQUEST_CAMERA) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Activity currentActivity = getCurrentActivity(); + if (currentActivity != null) { + startQRScanner(currentActivity); + } + } else { + if (scanPromise != null) { + scanPromise.reject("PERMISSION_DENIED", "Camera permission was denied"); + scanPromise = null; + } + } + } + } +} \ No newline at end of file diff --git a/app/android/app/src/main/java/com/awesomeproject/QRCodeScannerPackage.java b/app/android/app/src/main/java/com/awesomeproject/QRCodeScannerPackage.java new file mode 100644 index 00000000..20d2d4f5 --- /dev/null +++ b/app/android/app/src/main/java/com/awesomeproject/QRCodeScannerPackage.java @@ -0,0 +1,24 @@ +package com.proofofpassport; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class QRCodeScannerPackage implements ReactPackage { + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + List modules = new ArrayList<>(); + modules.add(new QRCodeScannerModule(reactContext)); + return modules; + } +} \ No newline at end of file diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml index 7ba83a2a..cade8bcc 100644 --- a/app/android/app/src/main/res/values/styles.xml +++ b/app/android/app/src/main/res/values/styles.xml @@ -4,6 +4,11 @@ - + \ No newline at end of file diff --git a/app/deployments/deployed_addresses.json b/app/deployments/deployed_addresses.json index 2b4b7d7a..b2fb1e7e 100644 --- a/app/deployments/deployed_addresses.json +++ b/app/deployments/deployed_addresses.json @@ -1,11 +1,11 @@ { - "Deploy_Registry#Formatter": "0x15cAe49aFFD6C9f918BC454A255C05997A74F960", - "Deploy_Registry#PoseidonT3": "0xdfAC8e1AECc55C4c8B8eC55D666A5a5BB8fbAE5c", - "Deploy_Registry#Registry": "0xBabF700EdE592Aa69e14B5BAE1859ee4164C3323", - "Deploy_Registry#Verifier_disclose": "0x36BDB37Ab78feB585B782A734C07D04C4c5A66B4", - "Deploy_Registry#Verifier_dsc_4096": "0x97c7D14A52e1576dADf8a7CCDf92a246aeb0C493", - "Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537": "0x8392b122Bcbf1eF99dFf1b183C5D4939EDf699A2", - "Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537": "0x2f5505803a3FCa5322A70A6471C91C34545AEa5D", - "Deploy_Registry#ProofOfPassportRegister": "0xEd7495516a957dD7d378d8A78846646461cFF25f", - "Deploy_Registry#SBT": "0x601Fd54FD11C5E77DE84d877e55B829aff20f0A6" + "Deploy_Registry#Formatter": "0xD73395ad7391a3285d2e2a2259031ED6Eb753a2c", + "Deploy_Registry#PoseidonT3": "0xbc16D1BD4Be33Cff388Bcbd61285b08BDCdeb86C", + "Deploy_Registry#Registry": "0xe2778F3b0302359d947531C2E668b46cFbE97206", + "Deploy_Registry#Verifier_disclose": "0xE2e39e0b823c1290788303094cb75B474899EAf6", + "Deploy_Registry#Verifier_dsc_sha256_rsa_4096": "0xFD3AFBb0E0565cc28E99d9e11629c4c20e1e517D", + "Deploy_Registry#Verifier_register_sha1WithRSAEncryption_65537": "0x434547E86530A583137c9990ffb87682F0d5ca48", + "Deploy_Registry#Verifier_register_sha256WithRSAEncryption_65537": "0xDc5e3E81b4b3bC22f79C3a90dbb57EBB9aEdAAfF", + "Deploy_Registry#ProofOfPassportRegister": "0x3F346FFdC5d583e4126AF01A02Ac5b9CdB3f1909", + "Deploy_Registry#SBT": "0x33f41D706587a7AC6c2061B1893e6eb29615822B" } \ No newline at end of file diff --git a/app/ios/LottieView.swift b/app/ios/LottieView.swift new file mode 100644 index 00000000..47659300 --- /dev/null +++ b/app/ios/LottieView.swift @@ -0,0 +1,41 @@ +// +// LottieView.swift +// FreedomTools +// +// Created by Ivan Lele on 27.02.2024. +// + +import Lottie +import SwiftUI + +struct LottieView: UIViewRepresentable { + var animationFileName: String + let loopMode: LottieLoopMode + + func updateUIView(_ uiView: UIViewType, context: Context) {} + + func makeUIView(context: Context) -> some UIView { + let view = UIView(frame: .zero) + + let animationView = LottieAnimationView(name: animationFileName) + animationView.loopMode = loopMode + animationView.contentMode = .scaleAspectFit + + animationView.play() + + animationView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(animationView) + + NSLayoutConstraint.activate([ + animationView.widthAnchor.constraint(equalTo: view.widthAnchor), + animationView.heightAnchor.constraint(equalTo: view.heightAnchor) + ]) + + return view + } +} + +#Preview { + LottieView(animationFileName: "passport", loopMode: .loop) + .frame(width: 300) +} diff --git a/app/ios/MRZScannerModule.swift b/app/ios/MRZScannerModule.swift index a8626886..ada2e1d4 100644 --- a/app/ios/MRZScannerModule.swift +++ b/app/ios/MRZScannerModule.swift @@ -28,6 +28,8 @@ class MRZScannerModule: NSObject, RCTBridgeModule { var hostingController: UIHostingController? = nil var scannerView = QKMRZScannerViewRepresentable() + let lottieView = LottieView(animationFileName: "passport", loopMode: .loop) + scannerView.onScanResult = { scanResult in let resultDict: [String: Any] = [ "documentNumber": scanResult.documentNumber, @@ -41,7 +43,7 @@ class MRZScannerModule: NSObject, RCTBridgeModule { } // Wrap the scanner view and instruction text in a new SwiftUI view - let scannerWithInstructions = ScannerWithInstructions(scannerView: scannerView) + let scannerWithInstructions = ScannerWithInstructions(scannerView: scannerView, lottieView: lottieView) hostingController = UIHostingController(rootView: scannerWithInstructions) rootViewController.present(hostingController!, animated: true, completion: nil) } @@ -55,14 +57,29 @@ class MRZScannerModule: NSObject, RCTBridgeModule { // Define a new SwiftUI view that includes the scanner and instruction text struct ScannerWithInstructions: View { var scannerView: QKMRZScannerViewRepresentable + var lottieView: LottieView var body: some View { - VStack { - scannerView - Text("Avoid glare or reflections during scanning.") - .font(.title3) - .padding() - .multilineTextAlignment(.center) + ZStack { + Color.white.ignoresSafeArea() // This creates a white background for the entire view + + VStack { + ZStack { + scannerView + .mask { + RoundedRectangle(cornerRadius: 15) + .frame(width: 370, height: 270) + } + lottieView.frame(width: 360, height: 230) + } + .frame(height: 320) + Text("Hold your passport on a flat surface while scanning") + .font(.custom("Inter-Regular", size: 20)) + .foregroundColor(.black) + .multilineTextAlignment(.center) + .frame(width: 300) + .padding() + } } } -} +} \ No newline at end of file diff --git a/app/ios/Podfile b/app/ios/Podfile index a8703f77..eb097dd2 100644 --- a/app/ios/Podfile +++ b/app/ios/Podfile @@ -41,6 +41,8 @@ target 'ProofOfPassport' do pod 'NFCPassportReader', git: 'https://github.com/0xturboblitz/NFCPassportReader.git', commit: '310ecb519655d9ed8b1afc5eb490b2f51a4d3595' pod 'QKMRZScanner' pod 'RNFS', :path => '../node_modules/react-native-fs' + pod 'lottie-ios' + pod 'SwiftQRScanner', :git => 'https://github.com/vinodiOS/SwiftQRScanner' use_react_native!( :path => config[:reactNativePath], @@ -79,4 +81,4 @@ target 'ProofOfPassport' do ) __apply_Xcode_12_5_M1_post_install_workaround(installer) end -end +end \ No newline at end of file diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 90bbad03..f2795789 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -13,6 +13,7 @@ PODS: - ReactCommon/turbomodule/core (= 0.72.3) - fmt (6.2.1) - glog (0.3.5) + - lottie-ios (4.5.0) - NFCPassportReader (2.0.3): - OpenSSL-Universal (= 1.1.1100) - OpenSSL-Universal (1.1.1100) @@ -291,10 +292,14 @@ PODS: - React-jsinspector (0.72.3) - React-logger (0.72.3): - glog + - react-native-date-picker (5.0.4): + - React-Core - react-native-get-random-values (1.11.0): - React-Core - react-native-netinfo (11.3.1): - React-Core + - react-native-nfc-manager (3.15.1): + - React-Core - React-NativeModulesApple (0.72.3): - React-callinvoker - React-Core @@ -419,6 +424,7 @@ PODS: - SSZipArchive (~> 2.2) - SocketRocket (0.6.1) - SSZipArchive (2.4.3) + - SwiftQRScanner (1.1.6) - SwiftyTesseract (3.1.3) - Yoga (1.14.0) @@ -429,6 +435,7 @@ DEPENDENCIES: - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - lottie-ios - NFCPassportReader (from `https://github.com/0xturboblitz/NFCPassportReader.git`, commit `310ecb519655d9ed8b1afc5eb490b2f51a4d3595`) - QKMRZScanner - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) @@ -447,8 +454,10 @@ DEPENDENCIES: - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - react-native-date-picker (from `../node_modules/react-native-date-picker`) - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" + - react-native-nfc-manager (from `../node_modules/react-native-nfc-manager`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) @@ -472,11 +481,13 @@ DEPENDENCIES: - RNKeychain (from `../node_modules/react-native-keychain`) - RNSVG (from `../node_modules/react-native-svg`) - RNZipArchive (from `../node_modules/react-native-zip-archive`) + - SwiftQRScanner (from `https://github.com/vinodiOS/SwiftQRScanner`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - fmt + - lottie-ios - OpenSSL-Universal - QKMRZParser - QKMRZScanner @@ -530,10 +541,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsinspector" React-logger: :path: "../node_modules/react-native/ReactCommon/logger" + react-native-date-picker: + :path: "../node_modules/react-native-date-picker" react-native-get-random-values: :path: "../node_modules/react-native-get-random-values" react-native-netinfo: :path: "../node_modules/@react-native-community/netinfo" + react-native-nfc-manager: + :path: "../node_modules/react-native-nfc-manager" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: @@ -580,6 +595,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-svg" RNZipArchive: :path: "../node_modules/react-native-zip-archive" + SwiftQRScanner: + :git: https://github.com/vinodiOS/SwiftQRScanner Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -587,6 +604,9 @@ CHECKOUT OPTIONS: NFCPassportReader: :commit: 310ecb519655d9ed8b1afc5eb490b2f51a4d3595 :git: https://github.com/0xturboblitz/NFCPassportReader.git + SwiftQRScanner: + :commit: fddcabcb431cd6110cea0394660082661dbafa7e + :git: https://github.com/vinodiOS/SwiftQRScanner SPEC CHECKSUMS: amplitude-react-native: 43098dfcfe1dcd6f0e9426017258ba79289d7a21 @@ -596,6 +616,7 @@ SPEC CHECKSUMS: FBReactNativeSpec: c6bd9e179757b3c0ecf815864fae8032377903ef fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + lottie-ios: a881093fab623c467d3bce374367755c272bdd59 NFCPassportReader: a160b80e3df3b5325c13902f90405f5eef7520b3 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c QKMRZParser: 6b419b6f07d6bff6b50429b97de10846dc902c29 @@ -609,15 +630,17 @@ SPEC CHECKSUMS: React-Core: 8293312ad137ea82fd2c29deb163dbc24aa4e00e React-CoreModules: 32fab1d62416849a3b6dac6feff9d54e5ddc2d1e React-cxxreact: 55d0f7cb6b4cc09ba9190797f1da87182d1a2fb6 - React-debug: 7e61555c8158126c6cd98c3154381ad3821aaaca + React-debug: 2aafa5b6cea5ab76043c20d72663aa0204e49020 React-jsc: 0db8e8cc2074d979c37ffa7b8d7c914833960497 React-jsi: 58677ff4848ceb6aeb9118fe03448a843ea5e16a React-jsiexecutor: 2c15ba1bace70177492368d5180b564f165870fd React-jsinspector: b511447170f561157547bc0bef3f169663860be7 React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95 + react-native-date-picker: 6891317e850deae5b53d51355226e07a495aba61 react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06 react-native-netinfo: bdb108d340cdb41875c9ced535977cac6d2ff321 - React-NativeModulesApple: 0438665fc7473be6edc496e823e6ea0b0537b46c + react-native-nfc-manager: 3134770f9afcb586c0ae859e747fda3106ec1f76 + React-NativeModulesApple: 1d8e4abb2fc6d80bdd13dcf128ee548804eb4a24 React-perflogger: 6bd153e776e6beed54c56b0847e1220a3ff92ba5 React-RCTActionSheet: c0b62af44e610e69d9a2049a682f5dba4e9dff17 React-RCTAnimation: fe7005136b58f58871cab2f70732343b6e330d30 @@ -631,9 +654,9 @@ SPEC CHECKSUMS: React-RCTVibration: ea3a68a49873a54ced927c90923fc6932baf344a React-rncore: 9672a017af4a7da7495d911f0b690cbcae9dd18d React-runtimeexecutor: 369ae9bb3f83b65201c0c8f7d50b72280b5a1dbc - React-runtimescheduler: ec1066a4f2d1152eb1bc3fb61d69376b3bc0dde0 - React-utils: d55ba834beb39f01b0b470ae43478c0a3a024abe - ReactCommon: 68e3a815fbb69af3bb4196e04c6ae7abb306e7a8 + React-runtimescheduler: 053752ab29d2747602f81c76d1bd7ede9412ef69 + React-utils: d3799712bc7003f1ad6501a37189384bf87c25f1 + ReactCommon: e639ff94ef1db3d9dd184decec9b02a6fbcc638e RNCAsyncStorage: 826b603ae9c0f88b5ac4e956801f755109fa4d5c RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 @@ -642,9 +665,10 @@ SPEC CHECKSUMS: RNZipArchive: ef9451b849c45a29509bf44e65b788829ab07801 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef + SwiftQRScanner: e85a25f9b843e9231dab89a96e441472fe54a724 SwiftyTesseract: 1f3d96668ae92dc2208d9842c8a59bea9fad2cbb Yoga: 8796b55dba14d7004f980b54bcc9833ee45b28ce -PODFILE CHECKSUM: 2e0fb25883367cd333873ac29cbb9f28ba88c30f +PODFILE CHECKSUM: ed2a230fe418418ecb7e6525cb769af59fc9dae2 COCOAPODS: 1.15.2 diff --git a/app/ios/ProofOfPassport.xcodeproj/project.pbxproj b/app/ios/ProofOfPassport.xcodeproj/project.pbxproj index 1e62ffca..56451f7f 100644 --- a/app/ios/ProofOfPassport.xcodeproj/project.pbxproj +++ b/app/ios/ProofOfPassport.xcodeproj/project.pbxproj @@ -26,7 +26,12 @@ 165E76BD2B8DC4A00000FA90 /* MRZScannerModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 165E76BC2B8DC4A00000FA90 /* MRZScannerModule.swift */; }; 165E76BF2B8DC53A0000FA90 /* MRZScannerModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 165E76BE2B8DC53A0000FA90 /* MRZScannerModule.m */; }; 165E76C32B8DC8370000FA90 /* ScannerHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 165E76C22B8DC8370000FA90 /* ScannerHostingController.swift */; }; + 1686F0DC2C500F3800841CDE /* QRScannerBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1686F0DB2C500F3800841CDE /* QRScannerBridge.swift */; }; + 1686F0DE2C500F4F00841CDE /* QRScannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1686F0DD2C500F4F00841CDE /* QRScannerViewController.swift */; }; + 1686F0E02C500FBD00841CDE /* QRScannerBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 1686F0DF2C500FBD00841CDE /* QRScannerBridge.m */; }; + 16E0838A2C4E7AF100CE8DB2 /* LottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16E083892C4E7AF100CE8DB2 /* LottieView.swift */; }; 16E6646E2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16E6646D2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift */; }; + 16E884A52C5BD764003B7125 /* passport.json in Resources */ = {isa = PBXBuildFile; fileRef = 16E884A42C5BD764003B7125 /* passport.json */; }; 1BA25F26C91C45F697D55099 /* Inter-ExtraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = 568162F4DC4B4CDC8B341853 /* Inter-ExtraLight.otf */; }; 1D2A11340C7041909B820A90 /* Inter-ExtraBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = D20EA8C94F544E14AB58E6EB /* Inter-ExtraBold.otf */; }; 2CD45EA0A0A94063935CE7D3 /* Inter-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF4EC58B331A46F098343757 /* Inter-Regular.otf */; }; @@ -90,7 +95,12 @@ 165E76BC2B8DC4A00000FA90 /* MRZScannerModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MRZScannerModule.swift; sourceTree = ""; }; 165E76BE2B8DC53A0000FA90 /* MRZScannerModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MRZScannerModule.m; sourceTree = ""; }; 165E76C22B8DC8370000FA90 /* ScannerHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScannerHostingController.swift; sourceTree = ""; }; + 1686F0DB2C500F3800841CDE /* QRScannerBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRScannerBridge.swift; sourceTree = ""; }; + 1686F0DD2C500F4F00841CDE /* QRScannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRScannerViewController.swift; sourceTree = ""; }; + 1686F0DF2C500FBD00841CDE /* QRScannerBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QRScannerBridge.m; sourceTree = ""; }; + 16E083892C4E7AF100CE8DB2 /* LottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieView.swift; sourceTree = ""; }; 16E6646D2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QKMRZScannerViewRepresentable.swift; sourceTree = ""; }; + 16E884A42C5BD764003B7125 /* passport.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = passport.json; sourceTree = ""; }; 1CA9D245CD5A439D88F01D4F /* Inter-ThinItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-ThinItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-ThinItalic.otf"; sourceTree = ""; }; 22FDF2ADA5789E09558ADB4E /* Pods-ProofOfPassport-ProofOfPassportTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ProofOfPassport-ProofOfPassportTests.release.xcconfig"; path = "Target Support Files/Pods-ProofOfPassport-ProofOfPassportTests/Pods-ProofOfPassport-ProofOfPassportTests.release.xcconfig"; sourceTree = ""; }; 2B01EC4981C171CA304E6D2B /* Pods-ProofOfPassport.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ProofOfPassport.release.xcconfig"; path = "Target Support Files/Pods-ProofOfPassport/Pods-ProofOfPassport.release.xcconfig"; sourceTree = ""; }; @@ -156,6 +166,7 @@ 13B07FAE1A68108700A75B9A /* ProofOfPassport */ = { isa = PBXGroup; children = ( + 16E884A42C5BD764003B7125 /* passport.json */, 05EDEDC42B52D25D00AA51AD /* Prover.m */, 05EDEDC52B52D25D00AA51AD /* Prover.swift */, 905B700A2A72A5E900AFA232 /* masterList.pem */, @@ -173,9 +184,13 @@ 905B70032A72767800AFA232 /* ProofOfPassport-Bridging-Header.h */, 165E76C22B8DC8370000FA90 /* ScannerHostingController.swift */, 905B70062A72774000AFA232 /* PassportReader.m */, + 16E083892C4E7AF100CE8DB2 /* LottieView.swift */, 165E76BC2B8DC4A00000FA90 /* MRZScannerModule.swift */, 165E76BE2B8DC53A0000FA90 /* MRZScannerModule.m */, 16E6646D2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift */, + 1686F0DB2C500F3800841CDE /* QRScannerBridge.swift */, + 1686F0DF2C500FBD00841CDE /* QRScannerBridge.m */, + 1686F0DD2C500F4F00841CDE /* QRScannerViewController.swift */, ); name = ProofOfPassport; sourceTree = ""; @@ -383,6 +398,7 @@ 37AF1D1302824FFC83B6D1D2 /* Inter-ThinItalic.otf in Resources */, CC99B59A281C4B6497C14141 /* Luciole-Bold-Italic.ttf in Resources */, 05E2174E2E7E48EB80B9C8D8 /* Luciole-Bold.ttf in Resources */, + 16E884A52C5BD764003B7125 /* passport.json in Resources */, 6959CC40713D4D42AA56850D /* Luciole-Regular-Italic.ttf in Resources */, E4E0715B819049EFACAF2AEE /* Luciole-Regular.ttf in Resources */, 98D6CE33FC02453794D8DB08 /* slkscr.ttf in Resources */, @@ -523,7 +539,10 @@ buildActionMask = 2147483647; files = ( 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 1686F0DE2C500F4F00841CDE /* QRScannerViewController.swift in Sources */, + 1686F0E02C500FBD00841CDE /* QRScannerBridge.m in Sources */, 05EDEDC72B52D25D00AA51AD /* Prover.swift in Sources */, + 1686F0DC2C500F3800841CDE /* QRScannerBridge.swift in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, 905B70072A72774000AFA232 /* PassportReader.m in Sources */, 16E6646E2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift in Sources */, @@ -531,6 +550,7 @@ 905B70052A72767900AFA232 /* PassportReader.swift in Sources */, 165E76C32B8DC8370000FA90 /* ScannerHostingController.swift in Sources */, 05EDEDC62B52D25D00AA51AD /* Prover.m in Sources */, + 16E0838A2C4E7AF100CE8DB2 /* LottieView.swift in Sources */, 165E76BD2B8DC4A00000FA90 /* MRZScannerModule.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -609,7 +629,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 47; - DEVELOPMENT_TEAM = 5B29R5LYHQ; + DEVELOPMENT_TEAM = X53ZR86F22; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -708,6 +728,7 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = ProofOfPassport/Info.plist; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Needed only if you want to upload QRcodes"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -726,7 +747,7 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = com.warroom.proofofpassport; + PRODUCT_BUNDLE_IDENTIFIER = "com.warroom.proofofpassport-dev"; PRODUCT_NAME = ProofOfPassport; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/ProofOfPassport-Bridging-Header.h"; @@ -744,7 +765,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = ProofOfPassport/ProofOfPassport.entitlements; CURRENT_PROJECT_VERSION = 47; - DEVELOPMENT_TEAM = 5B29R5LYHQ; + DEVELOPMENT_TEAM = X53ZR86F22; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/DoubleConversion\"", @@ -842,6 +863,8 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = ProofOfPassport/Info.plist; + INFOPLIST_KEY_NSDocumentsFolderUsageDescription = ""; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Needed only if you want to upload QRcodes"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -859,7 +882,7 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = com.warroom.proofofpassport; + PRODUCT_BUNDLE_IDENTIFIER = "com.warroom.proofofpassport-dev"; PRODUCT_NAME = ProofOfPassport; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/ProofOfPassport-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/app/ios/ProofOfPassport/AppDelegate.mm b/app/ios/ProofOfPassport/AppDelegate.mm index 9fd25176..fd3025c9 100644 --- a/app/ios/ProofOfPassport/AppDelegate.mm +++ b/app/ios/ProofOfPassport/AppDelegate.mm @@ -1,6 +1,8 @@ #import "AppDelegate.h" #import +#import +#import @implementation AppDelegate @@ -23,4 +25,4 @@ - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge #endif } -@end +@end \ No newline at end of file diff --git a/app/ios/ProofOfPassport/Info.plist b/app/ios/ProofOfPassport/Info.plist index 31966d3b..7d31930d 100644 --- a/app/ios/ProofOfPassport/Info.plist +++ b/app/ios/ProofOfPassport/Info.plist @@ -51,6 +51,8 @@ NSLocationWhenInUseUsageDescription + NSPhotoLibraryUsageDescription + We need access to your photo library to allow you to choose passport photos or save generated QR codes. UIAppFonts Inter-Black.otf diff --git a/app/ios/ProofOfPassport/passport.json b/app/ios/ProofOfPassport/passport.json new file mode 100644 index 00000000..920639b6 --- /dev/null +++ b/app/ios/ProofOfPassport/passport.json @@ -0,0 +1,1134 @@ +{ + "v": "5.9.0", + "fr": 30, + "ip": 0, + "op": 61, + "w": 684, + "h": 450, + "nm": "Group 427319362", + "ddd": 0, + "assets": [ + { + "id": "image_0", + "w": 635, + "h": 404, + "u": "", + "p": "data:image/png;base64,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", + "e": 1 + }, + { + "id": "image_1", + "w": 670, + "h": 50, + "u": "", + "p": "data:image/png;base64,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", + "e": 1 + }, + { + "id": "comp_0", + "nm": "1", + "fr": 30, + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 2, + "nm": "layer", + "refId": "image_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 337.775, + 215.849, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 317.384, + 202, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "mask", + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 338, + 216, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 315, + 200, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 99.524, + 99, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ] + ], + "o": [ + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ], + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -315, + -184 + ], + [ + -299, + -200 + ], + [ + 299, + -200 + ], + [ + 315, + -184 + ], + [ + 315, + 184 + ], + [ + 299, + 200 + ], + [ + -299, + 200 + ], + [ + -315, + 184 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 0, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 315, + 200 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "shadow", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 20, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 337.5, + 215, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + -4.5, + -20, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 0, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 313, + 198.25 + ], + [ + 313.5, + 198 + ], + [ + -313.5, + 198 + ], + [ + -314, + 198.25 + ] + ], + "c": true + } + ] + }, + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 30, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 313.5, + -198 + ], + [ + 313.5, + 198 + ], + [ + -313.5, + 198 + ], + [ + -313.5, + -198 + ] + ], + "c": true + } + ] + }, + { + "t": 60, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 313, + 198.25 + ], + [ + 313.5, + 198 + ], + [ + -313.5, + 198 + ], + [ + -314, + 198.25 + ] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 0, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -4.5, + -20 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Rectangle 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "mask 2", + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 338, + 216, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 315, + 200, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 99.5, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ] + ], + "o": [ + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ], + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -315, + -184 + ], + [ + -299, + -200 + ], + [ + 299, + -200 + ], + [ + 315, + -184 + ], + [ + 315, + 184 + ], + [ + 299, + 200 + ], + [ + -299, + 200 + ], + [ + -315, + 184 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 0, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 315, + 200 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 2, + "nm": "blur.png", + "cl": "png", + "tt": 1, + "refId": "image_1", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 0, + "s": [ + 339, + 415, + 0 + ], + "to": [ + 0, + -66.333, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 30, + "s": [ + 339, + 17, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + -66.333, + 0 + ] + }, + { + "t": 60, + "s": [ + 339, + 415, + 0 + ] + } + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 335, + 25, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 0, + "nm": "1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 344, + 247, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 342, + 235, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "w": 684, + "h": 470, + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} \ No newline at end of file diff --git a/app/ios/QRScannerBridge.m b/app/ios/QRScannerBridge.m new file mode 100644 index 00000000..dae2a3c7 --- /dev/null +++ b/app/ios/QRScannerBridge.m @@ -0,0 +1,15 @@ +// +// QRScannerBridge.m +// ProofOfPassport +// +// Created by Rémi Colin on 23/07/2024. +// + +#import +#import + +@interface RCT_EXTERN_MODULE(QRScannerBridge, NSObject) + +RCT_EXTERN_METHOD(scanQRCode:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) + +@end diff --git a/app/ios/QRScannerBridge.swift b/app/ios/QRScannerBridge.swift new file mode 100644 index 00000000..b36916be --- /dev/null +++ b/app/ios/QRScannerBridge.swift @@ -0,0 +1,30 @@ +// +// QRScannerBridge.swift +// ProofOfPassport +// +// Created by Rémi Colin on 23/07/2024. +// + +import Foundation +import SwiftQRScanner +import React + +@objc(QRScannerBridge) +class QRScannerBridge: NSObject { + @objc + static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc + func scanQRCode(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + DispatchQueue.main.async { + let rootViewController = UIApplication.shared.keyWindow?.rootViewController + let qrScannerViewController = QRScannerViewController() + qrScannerViewController.completionHandler = { result in + resolve(result) + } + rootViewController?.present(qrScannerViewController, animated: true, completion: nil) + } + } +} diff --git a/app/ios/QRScannerViewController.swift b/app/ios/QRScannerViewController.swift new file mode 100644 index 00000000..f52d2d54 --- /dev/null +++ b/app/ios/QRScannerViewController.swift @@ -0,0 +1,45 @@ +// +// QRScannerViewController.swift +// ProofOfPassport +// +// Created by Rémi Colin on 23/07/2024. +// + +import Foundation +import UIKit +import SwiftQRScanner + +class QRScannerViewController: UIViewController, QRScannerCodeDelegate { + var completionHandler: ((String) -> Void)? + + override func viewDidLoad() { + super.viewDidLoad() + + var configuration = QRScannerConfiguration() + configuration.cameraImage = UIImage(named: "camera") + configuration.flashOnImage = UIImage(named: "flash-on") + configuration.galleryImage = UIImage(named: "photos") + + let scanner = QRCodeScannerController(qrScannerConfiguration: configuration) + scanner.delegate = self + + addChild(scanner) + view.addSubview(scanner.view) + scanner.view.frame = view.bounds + scanner.didMove(toParent: self) + } + + func qrScanner(_ controller: UIViewController, didScanQRCodeWithResult result: String) { + completionHandler?(result) + dismiss(animated: true, completion: nil) + } + + func qrScanner(_ controller: UIViewController, didFailWithError error: QRCodeError) { + print("QR Scanner Error: \(error.localizedDescription)") + dismiss(animated: true, completion: nil) + } + + func qrScannerDidCancel(_ controller: UIViewController) { + dismiss(animated: true, completion: nil) + } +} diff --git a/app/ios/passport.json b/app/ios/passport.json new file mode 100644 index 00000000..920639b6 --- /dev/null +++ b/app/ios/passport.json @@ -0,0 +1,1134 @@ +{ + "v": "5.9.0", + "fr": 30, + "ip": 0, + "op": 61, + "w": 684, + "h": 450, + "nm": "Group 427319362", + "ddd": 0, + "assets": [ + { + "id": "image_0", + "w": 635, + "h": 404, + "u": "", + "p": "data:image/png;base64,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", + "e": 1 + }, + { + "id": "image_1", + "w": 670, + "h": 50, + "u": "", + "p": "data:image/png;base64,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", + "e": 1 + }, + { + "id": "comp_0", + "nm": "1", + "fr": 30, + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 2, + "nm": "layer", + "refId": "image_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 337.775, + 215.849, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 317.384, + 202, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "mask", + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 338, + 216, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 315, + 200, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 99.524, + 99, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ] + ], + "o": [ + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ], + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -315, + -184 + ], + [ + -299, + -200 + ], + [ + 299, + -200 + ], + [ + 315, + -184 + ], + [ + 315, + 184 + ], + [ + 299, + 200 + ], + [ + -299, + 200 + ], + [ + -315, + 184 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 0, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 315, + 200 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "shadow", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 20, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 337.5, + 215, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + -4.5, + -20, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 0, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 313, + 198.25 + ], + [ + 313.5, + 198 + ], + [ + -313.5, + 198 + ], + [ + -314, + 198.25 + ] + ], + "c": true + } + ] + }, + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 30, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 313.5, + -198 + ], + [ + 313.5, + 198 + ], + [ + -313.5, + 198 + ], + [ + -313.5, + -198 + ] + ], + "c": true + } + ] + }, + { + "t": 60, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 313, + 198.25 + ], + [ + 313.5, + 198 + ], + [ + -313.5, + 198 + ], + [ + -314, + 198.25 + ] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 0, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -4.5, + -20 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Rectangle 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "mask 2", + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 338, + 216, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 315, + 200, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 99.5, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ] + ], + "o": [ + [ + 0, + -8.836 + ], + [ + 0, + 0 + ], + [ + 8.836, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 8.836 + ], + [ + 0, + 0 + ], + [ + -8.836, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -315, + -184 + ], + [ + -299, + -200 + ], + [ + 299, + -200 + ], + [ + 315, + -184 + ], + [ + 315, + 184 + ], + [ + 299, + 200 + ], + [ + -299, + 200 + ], + [ + -315, + 184 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 0, + 0, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 315, + 200 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 2, + "nm": "blur.png", + "cl": "png", + "tt": 1, + "refId": "image_1", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 0, + "s": [ + 339, + 415, + 0 + ], + "to": [ + 0, + -66.333, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.3, + "y": 1 + }, + "o": { + "x": 0.7, + "y": 0 + }, + "t": 30, + "s": [ + 339, + 17, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + -66.333, + 0 + ] + }, + { + "t": 60, + "s": [ + 339, + 415, + 0 + ] + } + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 335, + 25, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 0, + "nm": "1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 344, + 247, + 0 + ], + "ix": 2, + "l": 2 + }, + "a": { + "a": 0, + "k": [ + 342, + 235, + 0 + ], + "ix": 1, + "l": 2 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6, + "l": 2 + } + }, + "ao": 0, + "w": 684, + "h": 470, + "ip": 0, + "op": 61, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} \ No newline at end of file diff --git a/app/package.json b/app/package.json index f39e34aa..02966df1 100644 --- a/app/package.json +++ b/app/package.json @@ -14,15 +14,16 @@ "@amplitude/analytics-react-native": "^1.4.7", "@babel/plugin-transform-private-methods": "^7.23.3", "@ethersproject/shims": "^5.7.0", + "@proofofpassport/sdk": "^1.5.6", "@react-native-async-storage/async-storage": "^1.23.1", "@react-native-community/clipboard": "^1.5.1", "@react-native-community/netinfo": "^11.3.1", - "@tamagui/colors": "^1.94.3", - "@tamagui/config": "^1.94.3", - "@tamagui/core": "^1.94.3", - "@tamagui/lucide-icons": "^1.94.3", - "@tamagui/toast": "^1.94.3", - "@tamagui/types": "^1.94.3", + "@tamagui/colors": "^1.103.0", + "@tamagui/config": "^1.103.0", + "@tamagui/core": "^1.103.0", + "@tamagui/lucide-icons": "^1.103.0", + "@tamagui/toast": "^1.103.0", + "@tamagui/types": "^1.103.0", "@zk-kit/imt": "https://gitpkg.now.sh/0xturboblitz/zk-kit/packages/imt?6d417675", "axios": "^1.6.3", "body-parser": "^1.20.2", @@ -40,14 +41,18 @@ "react": "18.2.0", "react-native": "0.72.3", "react-native-canvas": "^0.1.39", + "react-native-date-picker": "^5.0.4", "react-native-dialog": "^9.3.0", "react-native-fs": "^2.20.0", "react-native-get-random-values": "^1.11.0", "react-native-keychain": "^8.2.0", + "react-native-nfc-manager": "^3.15.1", "react-native-passport-reader": "^1.0.3", "react-native-svg": "13.4.0", "react-native-zip-archive": "^6.1.0", - "tamagui": "^1.94.3", + "react-spinners": "^0.14.1", + "socket.io-client": "^4.7.5", + "tamagui": "^1.103.0", "zustand": "^4.5.2" }, "devDependencies": { @@ -76,4 +81,4 @@ "engines": { "node": ">=16" } -} \ No newline at end of file +} diff --git a/app/src/apps/gitcoin.tsx b/app/src/apps/gitcoin.tsx index 29d55c33..365e14bc 100644 --- a/app/src/apps/gitcoin.tsx +++ b/app/src/apps/gitcoin.tsx @@ -1,4 +1,4 @@ -import { AppType } from "../utils/appType"; +import { AppType } from "../../../common/src/utils/appType"; import { Text, YStack } from 'tamagui'; import { Coins } from '@tamagui/lucide-icons'; import GITCOIN from '../images/gitcoin.png'; diff --git a/app/src/apps/sbt.tsx b/app/src/apps/sbt.tsx index cd452c1f..bf4e1964 100644 --- a/app/src/apps/sbt.tsx +++ b/app/src/apps/sbt.tsx @@ -1,4 +1,4 @@ -import { AppType } from "../utils/appType"; +import { AppType } from "../../../common/src/utils/appType"; import { Flame } from '@tamagui/lucide-icons'; import { Text, XStack, YStack } from 'tamagui'; import { generateProof } from "../utils/prover"; @@ -159,7 +159,7 @@ export const sbtApp: AppType = { const end = Date.now(); console.log('Total proof time from frontend:', end - start); - amplitude.track('Proof generation successful, took ' + ((end - start) / 1000) + ' seconds'); + //amplitude.track('Proof generation successful, took ' + ((end - start) / 1000) + ' seconds'); update({ proof: proof, proofTime: end - start, @@ -174,7 +174,7 @@ export const sbtApp: AppType = { }, }) setStep(Steps.NEXT_SCREEN); - amplitude.track(error.message); + //amplitude.track(error.message); } }, @@ -269,7 +269,7 @@ export const sbtApp: AppType = { console.log('Failed to parse blockchain error'); } } - amplitude.track(error.message); + //amplitude.track(error.message); } } } diff --git a/app/src/apps/zupass.tsx b/app/src/apps/zupass.tsx index c53fad8f..a12bc276 100644 --- a/app/src/apps/zupass.tsx +++ b/app/src/apps/zupass.tsx @@ -1,4 +1,4 @@ -import { AppType } from "../utils/appType"; +import { AppType } from "../../../common/src/utils/appType"; import { Text, YStack } from 'tamagui'; import { Ticket } from '@tamagui/lucide-icons'; import ZUPASS from '../images/zupass.png'; diff --git a/app/src/components/Carousel.tsx b/app/src/components/Carousel.tsx new file mode 100644 index 00000000..faa48a4f --- /dev/null +++ b/app/src/components/Carousel.tsx @@ -0,0 +1,116 @@ +import React, { useState } from 'react' +import { AnimatePresence } from '@tamagui/animate-presence' +import { ArrowLeft, ArrowRight, Nfc, ShieldCheck } from '@tamagui/lucide-icons' +import { Button, Image, XStack, YStack, styled, Text } from 'tamagui' +import { bgBlue, bgGreen, borderColor, textBlack, textColor1, textColor2 } from '../utils/colors' +import CustomButton from './CustomButton' + +const GalleryItem = styled(YStack, { + zIndex: 1, + x: 0, + opacity: 1, + fullscreen: true, + + variants: { + going: { + ':number': (going) => ({ + enterStyle: { + x: going > 0 ? 1000 : -1000, + opacity: 0, + }, + exitStyle: { + zIndex: 0, + x: going < 0 ? 1000 : -1000, + opacity: 0, + }, + }), + }, + } as const, +}) + +const wrap = (min: number, max: number, v: number) => { + const rangeSize = max - min + return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min +} + +interface CarouselProps { + images: string[]; + height?: number; + onSlideChange?: (index: number) => void; + handleNfcScan?: () => void; +} + +export function Carousel({ images, height = 300, onSlideChange, handleNfcScan }: CarouselProps) { + const [[page, going], setPage] = useState([0, 0]) + + const imageIndex = wrap(0, images.length, page) + const paginate = (going: number) => { + const newPage = page + going + setPage([newPage, going]) + onSlideChange?.(newPage) + } + + const isLastImage = imageIndex === images.length - 1 + const slideTexts = [ + { header: "Follow this guide carefully", subtitle: "", acknowledgment: "I'm ready to start" }, + { header: "Remove your phone case", subtitle: "If your phone does not have a case, you can skip this step.", acknowledgment: "I have removed my phone case" }, + { header: "Open your passport to the last page", subtitle: "", acknowledgment: "I have opened my passport to the last page" }, + { header: "Put your phone on the passport", subtitle: "Press your phone against the last page of the passport as in the image.", acknowledgment: "I have placed my phone on the passport" }, + { header: "Start scanning", subtitle: "Press Start NFC Scan and follow the on-screen instructions.", acknowledgment: "Start scanning" }, + ] + + const currentSlide = slideTexts[imageIndex] || { header: "No header", subtitle: "No subtitle for this slide", acknowledgment: "Continue" } + + return ( + + + + + + + + + + + {imageIndex > 0 && ( + + ); +}; + + +export default CustomButton; \ No newline at end of file diff --git a/app/src/components/StepOneStepTwo.tsx b/app/src/components/StepOneStepTwo.tsx new file mode 100644 index 00000000..d53dcc90 --- /dev/null +++ b/app/src/components/StepOneStepTwo.tsx @@ -0,0 +1,20 @@ +import { XStack } from "tamagui"; +import { textBlack } from "../utils/colors"; + +interface StepOneStepTwoProps { + variable: string; + step1: string; + step2: string; +} +const StepOneStepTwo = ({ variable, step1, step2 }: StepOneStepTwoProps) => { + const isVisible = variable === step1 || variable === step2; + + return ( + + + + + ) +} + +export default StepOneStepTwo; diff --git a/app/src/images/internet.png b/app/src/images/internet.png index 14c3f3ca..17ae422a 100644 Binary files a/app/src/images/internet.png and b/app/src/images/internet.png differ diff --git a/app/src/images/passport_lastpage_android.png b/app/src/images/passport_lastpage_android.png new file mode 100644 index 00000000..83e3855e Binary files /dev/null and b/app/src/images/passport_lastpage_android.png differ diff --git a/app/src/images/passport_lastpage_graybg.png b/app/src/images/passport_lastpage_graybg.png new file mode 100644 index 00000000..abcc687f Binary files /dev/null and b/app/src/images/passport_lastpage_graybg.png differ diff --git a/app/src/images/passport_lastpage_iphone.png b/app/src/images/passport_lastpage_iphone.png new file mode 100644 index 00000000..41c4e698 Binary files /dev/null and b/app/src/images/passport_lastpage_iphone.png differ diff --git a/app/src/images/phone_scanbutton.png b/app/src/images/phone_scanbutton.png new file mode 100644 index 00000000..a09d6976 Binary files /dev/null and b/app/src/images/phone_scanbutton.png differ diff --git a/app/src/images/remove_case.png b/app/src/images/remove_case.png new file mode 100644 index 00000000..664e9920 Binary files /dev/null and b/app/src/images/remove_case.png differ diff --git a/app/src/images/us-passport.png b/app/src/images/us-passport.png new file mode 100644 index 00000000..774d2bf3 Binary files /dev/null and b/app/src/images/us-passport.png differ diff --git a/app/src/screens/AppScreen copy.tsx b/app/src/screens/AppScreen copy.tsx new file mode 100644 index 00000000..e02bbaec --- /dev/null +++ b/app/src/screens/AppScreen copy.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { ScrollView, YStack } from 'tamagui'; +import AppCard from '../components/AppCard'; +import { Steps } from '../utils/utils'; +import useNavigationStore from '../stores/navigationStore'; +import { AppType } from '../../../common/src/utils/appType'; +import sbtApp from '../apps/sbt'; +import zupassApp from '../apps/zupass'; +import gitcoinApp from '../apps/gitcoin'; + +const AppScreen: React.FC = () => { + const { + selectedApp, + update + } = useNavigationStore(); + + const handleCardSelect = (app: AppType) => { + update({ + selectedTab: "prove", + selectedApp: app, + step: Steps.APP_SELECTED, + }) + }; + + // add new apps here + const cardsData = [ + sbtApp, + zupassApp, + gitcoinApp + ]; + + return ( + + + { + cardsData.map(app => ( + handleCardSelect(app)} + selected={selectedApp && selectedApp.id === app.id ? true : false} + selectable={app.selectable} + icon={app.icon} + tags={app.tags} + /> + )) + } + + + ); +} + +export default AppScreen; diff --git a/app/src/screens/AppScreen.tsx b/app/src/screens/AppScreen.tsx index 4fce61bf..2de72906 100644 --- a/app/src/screens/AppScreen.tsx +++ b/app/src/screens/AppScreen.tsx @@ -1,19 +1,41 @@ import React from 'react'; -import { ScrollView, YStack } from 'tamagui'; +import { ScrollView, Text, YStack } from 'tamagui'; import AppCard from '../components/AppCard'; import { Steps } from '../utils/utils'; import useNavigationStore from '../stores/navigationStore'; -import { AppType } from '../utils/appType'; +import { AppType, createAppType } from '../../../common/src/utils/appType'; import sbtApp from '../apps/sbt'; import zupassApp from '../apps/zupass'; import gitcoinApp from '../apps/gitcoin'; +import { XStack } from 'tamagui'; +import CustomButton from '../components/CustomButton'; +import { BadgeCheck, Binary, LayoutGrid, List, LockKeyhole, QrCode, ShieldCheck, Smartphone, UserPlus } from '@tamagui/lucide-icons'; +import { bgBlue, bgGreen, separatorColor, textBlack } from '../utils/colors'; +import { orange } from '@tamagui/colors'; +import useUserStore from '../stores/userStore'; +import { Platform } from 'react-native'; +import { NativeModules } from 'react-native'; -const AppScreen: React.FC = () => { +interface AppScreenProps { + setSheetAppListOpen: (value: boolean) => void; + setSheetRegisterIsOpen: (value: boolean) => void; +} + +const AppScreen: React.FC = ({ setSheetAppListOpen, setSheetRegisterIsOpen }) => { const { selectedApp, - update + setSelectedApp, + update, + selectedTab, + setSelectedTab, + toast } = useNavigationStore(); + const { + registered, + setRegistered + } = useUserStore(); + const handleCardSelect = (app: AppType) => { update({ selectedTab: "prove", @@ -22,16 +44,163 @@ const AppScreen: React.FC = () => { }) }; - // add new apps here const cardsData = [ sbtApp, zupassApp, gitcoinApp ]; + const scanQRCode = () => { + if (Platform.OS === 'ios') { + if (NativeModules.QRScannerBridge && NativeModules.QRScannerBridge.scanQRCode) { + NativeModules.QRScannerBridge.scanQRCode() + .then((result: string) => { + handleQRCodeScan(result); + }) + .catch((error: any) => { + console.error('QR Scanner Error:', error); + toast.show('Error', { + message: 'Failed to scan QR code', + type: 'error', + }); + }); + } else { + console.error('QR Scanner module not found for iOS'); + toast.show('Error', { + message: 'QR Scanner not available', + type: 'error', + }); + } + } else if (Platform.OS === 'android') { + if (NativeModules.QRCodeScanner && NativeModules.QRCodeScanner.scanQRCode) { + NativeModules.QRCodeScanner.scanQRCode() + .then((result: string) => { + handleQRCodeScan(result); + }) + .catch((error: any) => { + console.error('QR Scanner Error:', error); + toast.show('Error', { + message: 'Failed to scan QR code', + type: 'error', + }); + }); + } else { + console.error('QR Scanner module not found for Android'); + toast.show('Error', { + message: 'QR Scanner not available', + type: 'error', + }); + } + } + }; + + const handleQRCodeScan = (result: string) => { + try { + console.log(result); + const app = createAppType(JSON.parse(result)); + console.log(app); + setSelectedApp(app); + setSelectedTab("prove"); + } catch (error) { + console.error('Error parsing QR code result:', error); + toast.show('Error', { + message: 'Invalid QR code format', + type: 'error', + }); + } + }; + return ( - - + + {/* */} + + + Account + + status: + {registered ? + + registered + : + + not registered + } + + + {/* + userID: + 0x1234567890 + */} + + + How to use Proof of Passport? + + + + + Scan QR code + 1Find the QR code on the page of the app that asks for proof of passport. + 2Scan the QR code. + + + + + + Generate a Proof + 1Generate a proof of the selected information. + 2Share the proof with the application. + + + + + + How does it works? + + + + + Strong cryptography + ·Proof of Passport uses ZK technologies which allows you to prove a statement without revealing why it's true. + ·You are always anonymous + + + + + + Serverless + ·Proof of Passport will never receive your data and will never know who you are. + ·Everything is achieved on your device, even the camera and NFC scanning. + + + + + + + + + + + + { + if (registered) { + scanQRCode(); + } else { + setSheetRegisterIsOpen(true); + } + }} + Icon={} + /> + setSheetAppListOpen(true) + : + () => setSheetRegisterIsOpen(true)} Icon={} /> + + + + {/* { cardsData.map(app => ( { /> )) } - - + */} + ); } -export default AppScreen; +export default AppScreen; \ No newline at end of file diff --git a/app/src/screens/CameraScreen.tsx b/app/src/screens/CameraScreen.tsx index bb8748dc..4f6bd8c9 100644 --- a/app/src/screens/CameraScreen.tsx +++ b/app/src/screens/CameraScreen.tsx @@ -1,9 +1,10 @@ import React from 'react'; -import { YStack, Button, Image, Text } from 'tamagui'; -import { Camera, SquarePen } from '@tamagui/lucide-icons'; -import { bgColor, borderColor, textColor1, textColor2 } from '../utils/colors'; +import { YStack, Button, Image, Text, ScrollView, XStack, Separator } from 'tamagui'; +import { Camera, ShieldCheck, SquarePen, X } from '@tamagui/lucide-icons'; +import { bgColor, bgGreen, borderColor, componentBgColor, componentBgColor2, separatorColor, textBlack, textColor1, textColor2 } from '../utils/colors'; import SCANHelp from '../images/scan_help.png' import { startCameraScan } from '../utils/cameraScanner'; +import CustomButton from '../components/CustomButton'; interface CameraScreenProps { sheetIsOpen: boolean @@ -11,30 +12,31 @@ interface CameraScreenProps { } const CameraScreen: React.FC = ({ sheetIsOpen, setSheetIsOpen }) => { - return ( - - + Scan or type your passport ID + Open your passport on the main page to scan it. + Your data never leaves your device. + + + + + private and secured + + + {/* - - Use your camera to scan the main page of your passport. - You can also enter those data manually. - The app does not take a picture of your passport, it only reads some fields. - + /> */} + + } /> + setSheetIsOpen(true)} Icon={} /> - - - - - - - + ); }; -export default CameraScreen; +export default CameraScreen; \ No newline at end of file diff --git a/app/src/screens/MainScreen.tsx b/app/src/screens/MainScreen.tsx index c18d0fd6..bb2a3c3e 100644 --- a/app/src/screens/MainScreen.tsx +++ b/app/src/screens/MainScreen.tsx @@ -4,9 +4,9 @@ import forge from 'node-forge'; import Dialog from "react-native-dialog"; import { ethers } from 'ethers'; // import ressources -import { YStack, XStack, Text, Button, Tabs, Sheet, Label, Fieldset, Input, Switch, H2, Image, useWindowDimensions, H4, H3 } from 'tamagui' -import { HelpCircle, IterationCw, VenetianMask, Cog, CheckCircle2, ChevronLeft, Share, Eraser } from '@tamagui/lucide-icons'; -import X from '../images/x.png' +import { YStack, XStack, Text, Button, Tabs, Sheet, Label, Fieldset, Input, Switch, H2, Image, useWindowDimensions, H4, H3, Separator } from 'tamagui' +import { HelpCircle, IterationCw, VenetianMask, Cog, CheckCircle2, ChevronLeft, Share, Eraser, CalendarSearch, Cross, X, UserPlus, Wifi } from '@tamagui/lucide-icons'; +import Xlogo from '../images/x.png' import Telegram from '../images/telegram.png' import Github from '../images/github.png' import Internet from "../images/internet.png" @@ -17,7 +17,7 @@ import { ToastMessage } from '../components/ToastMessage'; import useUserStore from '../stores/userStore'; import useNavigationStore from '../stores/navigationStore'; // import utils -import { bgColor, blueColorLight, borderColor, componentBgColor, textColor1, textColor2 } from '../utils/colors'; +import { bgColor, bgGreen, bgWhite, blueColorLight, borderColor, componentBgColor, componentBgColor2, separatorColor, textBlack, textColor1, textColor2 } from '../utils/colors'; import { ModalProofSteps, Steps } from '../utils/utils'; import { scan } from '../utils/nfcScanner'; import { CircuitName, fetchZkey } from '../utils/zkeyDownload'; @@ -40,6 +40,13 @@ import AppScreen from './AppScreen'; import { RPC_URL, SignatureAlgorithm } from '../../../common/src/constants/constants'; import { mock_csca_sha256_rsa_4096, mock_dsc_sha256_rsa_4096 } from '../../../common/src/constants/mockCertificates'; +import DatePicker from 'react-native-date-picker' +import StartScreen from './StartScreen'; +import CustomButton from '../components/CustomButton'; +import StepOneStepTwo from '../components/StepOneStepTwo'; +import SplashScreen from './SplashScreen'; +import ValidProofScreen from './ValidProofScreen'; +import WrongProofScreen from './WrongProofScreen'; const MainScreen: React.FC = () => { const [NFCScanIsOpen, setNFCScanIsOpen] = useState(false); @@ -49,7 +56,14 @@ const MainScreen: React.FC = () => { const [dialogDeleteSecretIsOpen, setDialogDeleteSecretIsOpen] = useState(false); const [HelpIsOpen, setHelpIsOpen] = useState(false); const [sheetIsOpen, setSheetIsOpen] = useState(false); + const [sheetAppListOpen, setSheetAppListOpen] = useState(false); + const [sheetRegisterIsOpen, setSheetRegisterIsOpen] = useState(false); const [modalProofStep, setModalProofStep] = useState(0); + const [dateOfBirthDatePicker, setDateOfBirthDatePicker] = useState(null) + const [dateOfExpiryDatePicker, setDateOfExpiryDatePicker] = useState(null) + const [dateOfBirthDatePickerIsOpen, setDateOfBirthDatePickerIsOpen] = useState(false) + const [dateOfExpiryDatePickerIsOpen, setDateOfExpiryDatePickerIsOpen] = useState(false) + const [isFormComplete, setIsFormComplete] = useState(false); const { passportNumber, @@ -73,16 +87,18 @@ const MainScreen: React.FC = () => { step, setStep, selectedTab, + setSelectedTab, hideData, toast, showRegistrationErrorSheet, registrationErrorMessage, + nfcSheetIsOpen, + setNfcSheetIsOpen, } = useNavigationStore(); const handleRestart = () => { updateNavigationStore({ - selectedTab: "scan", - selectedApp: null, + selectedTab: "start", step: Steps.MRZ_SCAN, }) deleteMrzFields(); @@ -120,7 +136,6 @@ const MainScreen: React.FC = () => { useUserStore.getState().setDscSecret(secret); } - const inputs_csca = getCSCAInputs( secret, dscCert, @@ -136,12 +151,19 @@ const MainScreen: React.FC = () => { toast.show("Using mock passport data!", { type: "info" }) } + const castDate = (date: Date) => { + return (date.toISOString().slice(2, 4) + date.toISOString().slice(5, 7) + date.toISOString().slice(8, 10)).toString(); + } + const decrementStep = () => { - if (selectedTab === "nfc") { - setStep(Steps.MRZ_SCAN); + if (selectedTab === "scan") { + setSelectedTab("start"); + } + else if (selectedTab === "nfc") { + setSelectedTab("scan"); } else if (selectedTab === "next") { - setStep(Steps.MRZ_SCAN_COMPLETED); + setSelectedTab("nfc"); } else if (selectedTab === "register") { setStep(Steps.NEXT_SCREEN); @@ -196,6 +218,7 @@ const MainScreen: React.FC = () => { throw new Error("Transaction failed"); } setRegistered(true); + setSelectedTab("app"); setStep(Steps.REGISTERED); toast.show('✅', { message: "Registered", @@ -210,88 +233,117 @@ const MainScreen: React.FC = () => { } }, [modalProofStep]); - useEffect(() => { - if (passportNumber?.length === 9 && (dateOfBirth?.length === 6 && dateOfExpiry?.length === 6)) { - setStep(Steps.MRZ_SCAN_COMPLETED); - } - }, [passportNumber, dateOfBirth, dateOfExpiry]); useEffect(() => { - if (registered && step < Steps.REGISTERED) { - setStep(Steps.REGISTERED); - } - }, [registered]); - + setIsFormComplete(passportNumber?.length === 9 && dateOfBirth?.length === 6 && dateOfExpiry?.length === 6); + }, [passportNumber, dateOfBirth, dateOfExpiry]); - useEffect(() => { - let timeoutId: ReturnType; - if (step == Steps.MRZ_SCAN) { - updateNavigationStore({ - selectedTab: "scan", - }) - timeoutId = setTimeout(() => { - setNFCScanIsOpen(false); - }, 0); - } - else if (step == Steps.MRZ_SCAN_COMPLETED) { - updateNavigationStore({ - selectedTab: "nfc", - }) - timeoutId = setTimeout(() => { - setNFCScanIsOpen(false); - }, 0); - } - else if (step == Steps.NEXT_SCREEN) { - // Set the timeout and store its ID - timeoutId = setTimeout(() => { - setNFCScanIsOpen(false); - }, 700); - } - else if (step == Steps.PROOF_GENERATED) { - updateNavigationStore({ - selectedTab: "mint", - }) - } - if (step == Steps.NEXT_SCREEN) { - updateNavigationStore({ - selectedTab: "next", - }) - } - if (step == Steps.REGISTER) { - updateNavigationStore({ - selectedTab: "register", - }) - } - if (step == Steps.REGISTERED) { - updateNavigationStore({ - selectedTab: "app", - }) - } - return () => { - if (timeoutId) { - clearTimeout(timeoutId); - } - }; - }, [step]); + // useEffect(() => { + // if (registered && step < Steps.REGISTERED) { + // setStep(Steps.REGISTERED); + // } + // }, [registered]); + + + // useEffect(() => { + // let timeoutId: ReturnType; + // if (step == Steps.START) { + // updateNavigationStore({ + // selectedTab: "start", + // }) + // } + + // if (step == Steps.MRZ_SCAN) { + // updateNavigationStore({ + // selectedTab: "scan", + // }) + // timeoutId = setTimeout(() => { + // setNFCScanIsOpen(false); + // }, 0); + // } + // else if (step == Steps.MRZ_SCAN_COMPLETED) { + // updateNavigationStore({ + // selectedTab: "nfc", + // }) + // timeoutId = setTimeout(() => { + // setNFCScanIsOpen(false); + // }, 0); + // } + // else if (step == Steps.NEXT_SCREEN) { + // // Set the timeout and store its ID + // timeoutId = setTimeout(() => { + // setNFCScanIsOpen(false); + // }, 700); + // } + // else if (step == Steps.PROOF_GENERATED) { + // updateNavigationStore({ + // selectedTab: "mint", + // }) + // } + // if (step == Steps.NEXT_SCREEN) { + // updateNavigationStore({ + // selectedTab: "next", + // }) + // } + // if (step == Steps.REGISTER) { + // updateNavigationStore({ + // selectedTab: "register", + // }) + // } + // if (step == Steps.REGISTERED) { + // updateNavigationStore({ + // selectedTab: "app", + // }) + // } + // return () => { + // if (timeoutId) { + // clearTimeout(timeoutId); + // } + // }; + // }, [step]); const { height } = useWindowDimensions(); return ( - <> - + + + + - - - - - {selectedTab === "scan" ? "Scan" : (selectedTab === "app" ? "Apps" : "Prove")} - - - - + + {selectedTab !== ("app") && selectedTab !== ("splash") && setSelectedTab("app")} px="$4" py="$2" mt="$3" alignSelf='flex-end'>} + {selectedTab === "app" && + + Proof of Passport + + + setHelpIsOpen(true)}> + setSettingsIsOpen(true)}> - - + + + + + + } + + {/* {selectedTab !== "start" && selectedTab !== "scan" && selectedTab !== "nfc" && selectedTab !== "next" && selectedTab !== "register" && ( + + + + + + {selectedTab === "scan" ? "Scan" : (selectedTab === "app" ? "Apps" : "Prove")} + + + + + + + + + )} */} + @@ -421,6 +473,16 @@ const MainScreen: React.FC = () => { +
+ + +
+ + )} @@ -436,85 +498,91 @@ const MainScreen: React.FC = () => {
- + - - - -

Help

- - - Linking.openURL('https://proofofpassport.com')}> - - - Linking.openURL('https://t.me/proofofpassport')}> - - - Linking.openURL('https://x.com/proofofpassport')}> - - - Linking.openURL('https://github.com/zk-passport/proof-of-passport')}> - - + + + + + Help 💁 + + setHelpIsOpen(false)} p="$2"> + - - -

Security and Privacy

- Proof of Passport uses zero-knowledge cryptography to allow you to prove facts about yourself like humanity, nationality or age without disclosing sensitive information. + + + + + + {/* +

Security and Privacy

+ Proof of Passport uses zero-knowledge cryptography to allow you to prove facts about yourself like humanity, nationality or age without disclosing sensitive information.
-

About ZK Proofs

- Zero-knowledge proofs rely on mathematical magic tricks to show the validity of some computation without revealing of all its inputs. In our case, the proof shows the passport has not been forged, but allows you to hide sensitive data. -
+

About ZK Proofs

+ Zero-knowledge proofs rely on mathematical magic tricks to show the validity of some computation without revealing of all its inputs. In our case, the proof shows the passport has not been forged, but allows you to hide sensitive data. +
*/} -

FAQ

- -

Troubleshoot NFC scanning

- Refer to Linking.openURL('https://zk-passport.github.io/posts/how-to-scan-your-passport-using-nfc/')} color={blueColorLight} style={{ textDecorationLine: 'underline', fontStyle: 'italic' }}>this tutorial on how to scan your passport using NFC. -
+

FAQ

-

My camera is down

- Go to settings and turn on the broken camera option. -
- -

My passport is not supported

- Please contact us on Telegram, or if you have programming skills, you can easily Linking.openURL('https://t.me/proofofpassport')} color={blueColorLight} style={{ textDecorationLine: 'underline', fontStyle: 'italic' }}>contribute to the project by adding your signature algorithm. +

My passport is not supported

+ Please contact us on Telegram, or if you have programming skills, you can easily Linking.openURL('https://t.me/proofofpassport')} color={blueColorLight} style={{ textDecorationLine: 'underline', fontStyle: 'italic' }}>contribute to the project by adding your signature algorithm.
+ +
- {/* */} + + Linking.openURL('https://proofofpassport.com')}> + + + Linking.openURL('https://t.me/proofofpassport')}> + + + Linking.openURL('https://x.com/proofofpassport')}> + + + Linking.openURL('https://github.com/zk-passport/proof-of-passport')}> + + +
- + - + - Enter your the information manually -
- + + Manual input ✍️ + + setSheetIsOpen(false)} p="$2"> + + + + +
+ Passport Number { @@ -524,42 +592,165 @@ const MainScreen: React.FC = () => { keyboardType="default" />
+ +
- - Date of birth (yymmdd) + + Date of birth - { - update({ dateOfBirth: text }) + + {dateOfBirthDatePicker ? dateOfBirthDatePicker.toISOString().slice(0, 10) : ''} + + + { + setDateOfBirthDatePickerIsOpen(false) + setDateOfBirthDatePicker(date) + update({ dateOfBirth: castDate(date) }) + }} + onCancel={() => { + setDateOfBirthDatePickerIsOpen(false) }} - value={dateOfBirth} - keyboardType={Platform.OS === "ios" ? "default" : "number-pad"} />
- - Date of expiry (yymmdd) + + Date of expiry - { - update({ dateOfExpiry: text }) + + {dateOfExpiryDatePicker ? dateOfExpiryDatePicker.toISOString().slice(0, 10) : ''} + + + { + setDateOfExpiryDatePickerIsOpen(false) + setDateOfExpiryDatePicker(date) + update({ dateOfExpiry: castDate(date) }) + }} + onCancel={() => { + setDateOfExpiryDatePickerIsOpen(false) }} - value={dateOfExpiry} - keyboardType={Platform.OS === "ios" ? "default" : "number-pad"} />
+ + + { + setSelectedTab("nfc"); + setSheetIsOpen(false); + }} + bgColor={isFormComplete ? bgGreen : separatorColor} + isDisabled={!isFormComplete} + disabledOnPress={() => toast.show('✍️', { + message: "Please fill in all fields.", + customData: { + type: "info", + }, + })} + /> + + + + + + + + + + + + Applications + + setSheetAppListOpen(false)} p="$2"> + + + + + + + + toast.show('😖', { + message: "Work in progress", + customData: { + type: "info", + }, + })} + /> + toast.show('😖', { + message: "Work in progress", + customData: { + type: "info", + }, + })} + /> + toast.show('😖', { + message: "Work in progress", + customData: { + type: "info", + }, + })} + /> + + + + + + + + + + + + + 👋 Not registered yet? + + setSheetRegisterIsOpen(false)} p="$2"> + + + + + + Registering to Proof of Passport does not leak anything about your personal information. + Linking.openURL('https://zk-passport.github.io/posts/how-to-scan-your-passport-using-nfc/')} color={blueColorLight} style={{ textDecorationLine: 'underline', fontStyle: 'italic' }}>Learn more. + + + + + } + onPress={() => { + setSheetRegisterIsOpen(false); + setSelectedTab("start"); + + }} + /> + + + @@ -574,33 +765,43 @@ const MainScreen: React.FC = () => { dismissOnSnapToBottom modal animation="medium" snapPoints={[80]} > - - -

Passport unsupported

- Unfortunately, your passport is currently not supported. Details: - {registrationErrorMessage} + + + + Sorry, an error has occurred + - To help us add support for it, please consider contributing its data! -
- - -
+ Error details: + {registrationErrorMessage} + + + Unfortunately, your passport is currently not supported. + + To help us add support for it, please consider contributing its data! + + setDialogContributeIsOpen(true)} + Icon={} + />
-
- updateNavigationStore({ selectedTab: value })} > - - + + + + + + { - + - + + + + + + + + @@ -656,7 +869,7 @@ const MainScreen: React.FC = () => { - + ); }; diff --git a/app/src/screens/NextScreen.tsx b/app/src/screens/NextScreen.tsx index f9212cc6..454e83a6 100644 --- a/app/src/screens/NextScreen.tsx +++ b/app/src/screens/NextScreen.tsx @@ -1,20 +1,22 @@ import React from 'react'; import { YStack, XStack, Text, Button, Image, useWindowDimensions, Fieldset } from 'tamagui'; -import { Info } from '@tamagui/lucide-icons'; +import { ArrowRight, Info } from '@tamagui/lucide-icons'; import { getFirstName, maskString } from '../../utils/utils'; import { attributeToPosition } from '../../../common/src/constants/constants'; import USER from '../images/user.png' -import { borderColor, componentBgColor, textColor1, textColor2 } from '../utils/colors'; +import { bgGreen, borderColor, componentBgColor, textBlack, textColor1, textColor2 } from '../utils/colors'; import { Platform } from 'react-native'; import { formatAttribute, Steps } from '../utils/utils'; import useUserStore from '../stores/userStore'; import useNavigationStore from '../stores/navigationStore'; +import CustomButton from '../components/CustomButton'; const NextScreen: React.FC = () => { const { hideData, setStep, + setSelectedTab } = useNavigationStore() @@ -32,8 +34,8 @@ const NextScreen: React.FC = () => { const { height } = useWindowDimensions(); return ( - - + + {hideData ? { /> } - + Hi{" "} - { - hideData - ? maskString(getFirstName(passportData.mrz)) - : getFirstName(passportData.mrz) - } + { + hideData + ? maskString(getFirstName(passportData.mrz)) + : getFirstName(passportData.mrz) + } {" "}👋 - + {Object.keys(disclosureOptions).map((key) => { const key_ = key; const indexes = attributeToPosition[key_ as keyof typeof attributeToPosition]; @@ -74,11 +78,15 @@ const NextScreen: React.FC = () => { return (
- + {keyFormatted}: {hideData ? maskString(mrzAttributeFormatted) : mrzAttributeFormatted} @@ -89,20 +97,15 @@ const NextScreen: React.FC = () => { - - - Your information will remain confidential and will not be used or shared without your explicit consent. + + + Your information will remain confidential and will not be used or shared without your explicit consent. - + + + + setSelectedTab("register")} text="Next" Icon={} /> + ); diff --git a/app/src/screens/NfcScreen.tsx b/app/src/screens/NfcScreen.tsx index a0a65578..d30ffcb7 100644 --- a/app/src/screens/NfcScreen.tsx +++ b/app/src/screens/NfcScreen.tsx @@ -1,57 +1,100 @@ -import React from 'react'; -import { YStack, Text, XStack, Button, Image } from 'tamagui'; -import { Nfc } from '@tamagui/lucide-icons'; -import { blueColorDark, blueColorLight, borderColor, componentBgColor2, greenColorDark, greenColorLight, redColorDark, redColorLight, textColor1, textColor2 } from '../utils/colors'; -import NFCHelp from '../images/nfc_help.png' +import React, { useState } from 'react'; +import { YStack, Text, XStack, Button, ScrollView } from 'tamagui'; +import { Nfc, X } from '@tamagui/lucide-icons'; +import { bgGreen, borderColor, textBlack, textColor1 } from '../utils/colors'; +import { Carousel } from '../components/Carousel'; +import US_PASSPORT from '../images/us-passport.png' +import REMOVE_CASE from '../images/remove_case.png' +import US_PASSPORT_LASTPAGE from '../images/passport_lastpage_graybg.png' +import US_PASSPORT_LASTPAGE_IOS from '../images/passport_lastpage_iphone.png' +import US_PASSPORT_LASTPAGE_ANDROID from '../images/passport_lastpage_android.png' +import PHONE_SCANBUTTON from "../images/phone_scanbutton.png" + +import Dialog from "react-native-dialog"; +import NfcManager from 'react-native-nfc-manager'; +import { Platform, Linking, Dimensions } from 'react-native'; interface NfcScreenProps { handleNFCScan: () => void; } - const NfcScreen: React.FC = ({ handleNFCScan }) => { - return ( - - - - - - - Scan the NFC chip in your passport. - How do I find and scan the NFC chip? - - - 1. - Close your passport and hold the middle of the back cover of your passport to the top of the phoneThe passport should touch the phone. - - - 2. - If that does not work, try using the front cover of your passport. - - - 3. - Move your phone slowly up and down until scanning starts. - - - 4. - Hold your device still when scanning starts. - - + const [isLastSlideReached, setIsLastSlideReached] = useState(false); + const [dialogVisible, setDialogVisible] = useState(false); + const [dialogMessage, setDialogMessage] = useState(''); + const [isNfcSupported, setIsNfcSupported] = useState(true); + const carouselImages = [US_PASSPORT, REMOVE_CASE, US_PASSPORT_LASTPAGE, Platform.OS === 'ios' ? US_PASSPORT_LASTPAGE_IOS : US_PASSPORT_LASTPAGE_ANDROID, PHONE_SCANBUTTON,]; + const windowHeight = Dimensions.get('window').height; - + const handleSlideChange = (index: number) => { + if (index === carouselImages.length - 1) { + setIsLastSlideReached(true); + } + }; - + const openNfcSettings = () => { + if (Platform.OS === 'ios') { + Linking.openURL('App-Prefs:root=General&path=About'); + } else { + Linking.sendIntent('android.settings.NFC_SETTINGS'); + } + setDialogVisible(false); + }; - - - + const checkNfcSupport = async () => { + const isSupported = await NfcManager.isSupported(); + if (isSupported) { + const isEnabled = await NfcManager.isEnabled(); + if (!isEnabled) { + setDialogMessage('NFC is not enabled. Would you like to enable it in settings?'); + setDialogVisible(true); + setIsNfcSupported(true); + return false; + } + return true; + } else { + setDialogMessage("Sorry, your device doesn't seem to have an NFC reader."); + setDialogVisible(true); + setIsNfcSupported(false); + return false; + } + }; + + const handleNfcScan = async () => { + const nfcSupported = await checkNfcSupport(); + if (nfcSupported) { + handleNFCScan(); + } + }; - + return ( + + + {/* Verify your passport using NFC */} + Verify your passport using NFC + + + NFC Status + + {dialogMessage} + + {isNfcSupported ? ( + + + + + ) : ( + setDialogVisible(false)} /> + )} + + + ); }; -export default NfcScreen; +export default NfcScreen; \ No newline at end of file diff --git a/app/src/screens/NoSkipCarousel.tsx b/app/src/screens/NoSkipCarousel.tsx new file mode 100644 index 00000000..9da79398 --- /dev/null +++ b/app/src/screens/NoSkipCarousel.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { YStack, Button, Image, Text, styled } from 'tamagui'; +import { Camera, SquarePen, UserPlus } from '@tamagui/lucide-icons'; +import { bgColor, borderColor, textBlack, textColor1, textColor2 } from '../utils/colors'; +import { Steps } from "../utils/utils"; +import CustomButton from '../components/CustomButton'; + +const NoSkipCarousel: React.FC = () => { + const textStyle = styled(Text, { + fontSize: 20, + fontWeight: 'bold', + color: textBlack, + }); + + return ( + + + + Lorem ipsum doflor siat amet + Lorem ipsum dolor sit amet + + + + { + console.log("Let's start"); + }} /> + + ); +}; + +export default NoSkipCarousel; diff --git a/app/src/screens/ProveScreen.tsx b/app/src/screens/ProveScreen.tsx index 92bee767..a31f64fd 100644 --- a/app/src/screens/ProveScreen.tsx +++ b/app/src/screens/ProveScreen.tsx @@ -1,46 +1,177 @@ import React, { useState, useEffect } from 'react'; -import { YStack, XStack, Text, Checkbox, Input, Button, Spinner, Image, useWindowDimensions, ScrollView } from 'tamagui'; -import { Check, Plus, Minus, PenTool } from '@tamagui/lucide-icons'; -import { getFirstName, maskString } from '../../utils/utils'; -import { attributeToPosition } from '../../../common/src/constants/constants'; +import { YStack, XStack, Text, Input, Button, Spinner, Image, useWindowDimensions, ScrollView, Fieldset } from 'tamagui'; +import { Check, CheckCircle, CheckCircle2, Share, } from '@tamagui/lucide-icons'; +import { attributeToPosition, DEFAULT_MAJORITY, } from '../../../common/src/constants/constants'; import USER from '../images/user.png' -import { borderColor, componentBgColor, componentBgColor2, textColor1, textColor2 } from '../utils/colors'; +import { bgGreen, borderColor, componentBgColor, componentBgColor2, separatorColor, textBlack, textColor1, textColor2 } from '../utils/colors'; import { ethers } from 'ethers'; import { Platform } from 'react-native'; import { formatAttribute, Steps } from '../utils/utils'; import { downloadZkey } from '../utils/zkeyDownload'; import useUserStore from '../stores/userStore'; import useNavigationStore from '../stores/navigationStore'; -import { AppType } from '../utils/appType'; +import { AppType } from '../../../common/src/utils/appType'; import useSbtStore from '../stores/sbtStore'; +import CustomButton from '../components/CustomButton'; +import { generateCircuitInputsDisclose } from '../../../common/src/utils/generateInputs'; +import { PASSPORT_ATTESTATION_ID } from '../../../common/src/constants/constants'; +import axios from 'axios'; +import { stringToNumber } from '../../../common/src/utils/utils'; +import { revealBitmapFromAttributes } from '../../../common/src/utils/revealBitmap'; +import { getTreeFromTracker } from '../../../common/src/utils/pubkeyTree'; +import { generateProof } from '../utils/prover'; +import io, { Socket } from 'socket.io-client'; -export const appStoreMapping = { - 'soulbound': useSbtStore, - // Add more app ID to store mappings as needed -}; +interface ProveScreenProps { + setSheetRegisterIsOpen: (value: boolean) => void; +} -const ProveScreen: React.FC = () => { +const ProveScreen: React.FC = ({ setSheetRegisterIsOpen }) => { + const [generatingProof, setGeneratingProof] = useState(false); const selectedApp = useNavigationStore(state => state.selectedApp) as AppType; const { hideData, isZkeyDownloading, step, + toast, + setSelectedTab } = useNavigationStore() const { - fields, - handleProve, - circuit, - } = selectedApp + secret, + setProofVerificationResult + } = useUserStore() - const useAppStore = appStoreMapping[selectedApp.id as keyof typeof appStoreMapping] + const [proofStatus, setProofStatus] = useState(''); - const { - address, - majority, - disclosure, - update - } = useAppStore(); + const [socket, setSocket] = useState(null); + + const [isConnecting, setIsConnecting] = useState(false); + + const waitForSocketConnection = (socket: Socket): Promise => { + return new Promise((resolve) => { + if (socket.connected) { + resolve(); + } else { + socket.once('connect', () => { + resolve(); + }); + } + }); + }; + + useEffect(() => { + const newSocket = io('https://proofofpassport-merkle-tree.xyz', { + path: '/websocket', + transports: ['websocket'], + query: { sessionId: selectedApp.userId, clientType: 'mobile' } + }); + + newSocket.on('connect', () => { + console.log('Connected to WebSocket server'); + }); + + newSocket.on('disconnect', () => { + console.log('Disconnected from WebSocket server'); + }); + + newSocket.on('connect_error', (error) => { + console.error('Connection error:', error); + }); + + newSocket.on('proof_verification_result', (result) => { + console.log('Proof verification result:', result); + setProofVerificationResult(JSON.parse(result)); + setProofStatus(`Proof verification result: ${result}`); + console.log("result", result); + setSelectedTab(JSON.parse(result).valid ? "valid" : "wrong"); + }); + + setSocket(newSocket); + + return () => { + newSocket.disconnect(); + }; + }, [selectedApp.userId]); + + const handleProve = async () => { + try { + setIsConnecting(true); + setGeneratingProof(true); + + if (!socket) { + throw new Error('Socket not initialized'); + } + + await waitForSocketConnection(socket); + + setIsConnecting(false); + setProofStatus('Generating proof...'); + socket.emit('proof_generation_start', { sessionId: selectedApp.userId }); + + const tree = await getTreeFromTracker(); + + const inputs = generateCircuitInputsDisclose( + secret, + PASSPORT_ATTESTATION_ID, + passportData, + tree as any, + (selectedApp.disclosureOptions && selectedApp.disclosureOptions.older_than) ? selectedApp.disclosureOptions.older_than : DEFAULT_MAJORITY, + revealBitmapFromAttributes(selectedApp.disclosureOptions as any), + selectedApp.scope, + stringToNumber(selectedApp.userId).toString() + ); + + console.log("inputs", inputs); + const localProof = await generateProof( + selectedApp.circuit, + inputs, + ); + + setProofStatus('Sending proof to verification...'); + // console.log("localProof", localProof); + + // Send the proof via WebSocket + const formattedLocalProof = { + proof: { + pi_a: [ + localProof.proof.a[0], + localProof.proof.a[1], + "1" + ], + pi_b: [ + [localProof.proof.b[0][0], localProof.proof.b[0][1]], + [localProof.proof.b[1][0], localProof.proof.b[1][1]], + ["1", "0"] + ], + pi_c: [ + localProof.proof.c[0], + localProof.proof.c[1], + "1" + ], + protocol: "groth16", + curve: "bn128" + }, + publicSignals: (localProof as any).pub_signals + }; + // console.log("formattedLocalProof", formattedLocalProof); + socket.emit('proof_generated', { sessionId: selectedApp.userId, proof: formattedLocalProof }); + + // Wait for verification result + const verificationResult = await new Promise((resolve) => { + socket.once('proof_verification_result', resolve); + }); + + setProofStatus(`Proof verification result: ${(verificationResult)}`); + + } catch (error) { + console.error('Error in handleProve:', error); + setProofStatus(`Error: ${error || 'An unknown error occurred'}`); + } finally { + setGeneratingProof(false); + setIsConnecting(false); + } + }; const { registered, @@ -49,213 +180,81 @@ const ProveScreen: React.FC = () => { const handleDisclosureChange = (field: string) => { const requiredOrOptional = selectedApp.disclosureOptions[field as keyof typeof selectedApp.disclosureOptions]; - if (requiredOrOptional === 'required') { return; } - - update({ - disclosure: { - ...disclosure, - [field]: !disclosure[field as keyof typeof disclosure] - } - }); }; - const { height } = useWindowDimensions(); useEffect(() => { - // this already checks if downloading is required - downloadZkey(circuit); }, []) + const disclosureFieldsToText = (key: string, value: string = "") => { + if (key === 'older_than') { + return `I am older than ${value} years old.`; + } + if (key === 'nationality') { + return `I have a valid passport from ${value}.`; + } + return ''; + } + return ( - - - - {hideData - ? 750 ? 150 : 100} - h={height > 750 ? 190 : 80} - borderRadius={height > 800 ? "$7" : "$6"} - source={{ - uri: USER, - }} - /> - : 750 ? 150 : 110} - h={height > 750 ? 190 : 130} - borderRadius={height > 750 ? "$7" : "$6"} - source={{ - uri: passportData.photoBase64 ?? USER, - }} - /> - } - - - Hi{" "} - { - hideData - ? maskString(getFirstName(passportData.mrz)) - : getFirstName(passportData.mrz) - } - {" "}👋 + + + {Object.keys(selectedApp.disclosureOptions as any).length > 0 ? + + {selectedApp.name} is requesting you to prove the following information. + - {fields.map((Field, index) => ( - - ))} - - - - - - - - - - - Disclose - - Select what to disclose - - - - - - {selectedApp && Object.keys(selectedApp.disclosureOptions).map((key) => { - const key_ = key; - const indexes = attributeToPosition[key_ as keyof typeof attributeToPosition]; - const keyFormatted = key_.replace(/_/g, ' ').split(' ').map((word: string) => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); - const mrzAttribute = passportData.mrz.slice(indexes[0], indexes[1] + 1); - const mrzAttributeFormatted = formatAttribute(key_, mrzAttribute); - - return ( - - handleDisclosureChange(key_)} > - handleDisclosureChange(key_)} - aria-label={keyFormatted} - size="$6" - > - - - - - - {keyFormatted}: - - {key_ === 'older_than' ? ( - - - {majority} - yo - - - - - ) : ( - - {hideData ? maskString(mrzAttributeFormatted) : mrzAttributeFormatted} - - )} - - ); - })} - - - - - - { - (height > 750) && - - This operation can take up to 1 mn, phone may freeze during this time - - } - + ); + })} + + + + + : generatingProof ? : } + isDisabled={isConnecting || generatingProof} + text={isConnecting ? "Connecting..." : generatingProof ? "Generating Proof..." : "Verify"} + onPress={registered ? handleProve : () => setSheetRegisterIsOpen(true)} + bgColor={isConnecting || generatingProof ? separatorColor : bgGreen} + disabledOnPress={() => toast.show('⏳', { + message: isConnecting ? "Connecting to server..." : "Proof is generating", + customData: { + type: "info", + }, + })} + /> + + + {/* {proofStatus && ( + + {proofStatus} + + )} */} + ); }; diff --git a/app/src/screens/RegisterScreen.tsx b/app/src/screens/RegisterScreen.tsx index 35281661..3918e43e 100644 --- a/app/src/screens/RegisterScreen.tsx +++ b/app/src/screens/RegisterScreen.tsx @@ -1,10 +1,11 @@ import React, { useState } from 'react'; import { YStack, XStack, Text, Button, Spinner } from 'tamagui'; -import { LockKeyhole } from '@tamagui/lucide-icons'; -import { borderColor, componentBgColor, componentBgColor2, textColor1, textColor2 } from '../utils/colors'; +import { LockKeyhole, UserPlus } from '@tamagui/lucide-icons'; +import { bgGreen, borderColor, componentBgColor, componentBgColor2, textBlack } from '../utils/colors'; import { Platform } from 'react-native'; import useUserStore from '../stores/userStore'; import useNavigationStore from '../stores/navigationStore'; +import CustomButton from '../components/CustomButton'; const RegisterScreen: React.FC = () => { @@ -16,6 +17,7 @@ const RegisterScreen: React.FC = () => { const handleRegister = async () => { setRegistering(true); useUserStore.getState().registerCommitment(); + setRegisterStep("Generating witness..."); setTimeout(() => { setRegisterStep("Generating proof..."); @@ -29,23 +31,30 @@ const RegisterScreen: React.FC = () => { } return ( - + - - Register - - Join Proof of Passport to start sharing your identity securely. - Easily verify your nationality, humanity, or age and share only what you want to reveal. - + Join Proof of Passport to start sharing your identity securely. + Easily verify your nationality, humanity, or age and share only what you want to reveal. + - - - + + + - Registration does not leak any personal information + Registration does not leak any personal information - + */} ); diff --git a/app/src/screens/SendProofScreen.tsx b/app/src/screens/SendProofScreen.tsx index b5e97034..288122dc 100644 --- a/app/src/screens/SendProofScreen.tsx +++ b/app/src/screens/SendProofScreen.tsx @@ -7,7 +7,7 @@ import ProofGrid from '../components/ProofGrid'; import { Platform } from 'react-native'; import { blueColor, borderColor, componentBgColor, textColor1, textColor2 } from '../utils/colors'; import useNavigationStore from '../stores/navigationStore'; -import { AppType } from '../utils/appType'; +import { AppType } from '../../../common/src/utils/appType'; import { appStoreMapping } from './ProveScreen'; const SendProofScreen: React.FC = () => { diff --git a/app/src/screens/SplashScreen.tsx b/app/src/screens/SplashScreen.tsx new file mode 100644 index 00000000..d58f71de --- /dev/null +++ b/app/src/screens/SplashScreen.tsx @@ -0,0 +1,31 @@ +import React, { useEffect } from 'react'; +import useUserStore from '../stores/userStore'; +import useNavigationStore from '../stores/navigationStore'; +import { YStack, Text, Spinner, XStack } from 'tamagui'; +import { bgGreen, textBlack } from '../utils/colors'; + +const SplashScreen = () => { + const { userLoaded, registered } = useUserStore(); + const { setSelectedTab } = useNavigationStore(); + + // once registered is retrieved from zustand, navigate to the appropriate screen + useEffect(() => { + if (userLoaded) { + if (registered) { + setSelectedTab('app'); + } else { + setSelectedTab('start'); + } + } + }, [userLoaded]); + return ( + + Proof of Passport + + + + ); +}; + + +export default SplashScreen; diff --git a/app/src/screens/StartScreen.tsx b/app/src/screens/StartScreen.tsx new file mode 100644 index 00000000..d5dc9917 --- /dev/null +++ b/app/src/screens/StartScreen.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { YStack, Button, Image, Text, styled } from 'tamagui'; +import { ArrowRight, Camera, SquarePen, UserPlus } from '@tamagui/lucide-icons'; +import { bgColor, bgGreen, borderColor, textBlack, textColor1, textColor2 } from '../utils/colors'; +import { Steps } from "../utils/utils"; +import CustomButton from '../components/CustomButton'; +import useNavigationStore from '../stores/navigationStore'; + +const StartScreen: React.FC = () => { + + const { + setStep, + step, + selectedTab, + setSelectedTab + } = useNavigationStore(); + + return ( + + + + Welcome to Proof of Passport 👋 + Proof of Passport allows you to scan your passport, and to prove your identity in a + secure way. + + You can for example prove that you are over 18 yo while staying fully + anonymous. + + + + + } text="Let's start" onPress={() => { + setSelectedTab("scan"); + }} /> + {/* */} + + ); +}; + +export default StartScreen; diff --git a/app/src/screens/ValidProofScreen.tsx b/app/src/screens/ValidProofScreen.tsx new file mode 100644 index 00000000..68d5ab96 --- /dev/null +++ b/app/src/screens/ValidProofScreen.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { YStack, Button, Image, Text, ScrollView, XStack, Separator } from 'tamagui'; +import { Camera, ShieldCheck, SquarePen, X } from '@tamagui/lucide-icons'; +import { bgColor, bgGreen, borderColor, componentBgColor, componentBgColor2, separatorColor, textBlack, textColor1, textColor2 } from '../utils/colors'; +import SCANHelp from '../images/scan_help.png' +import { startCameraScan } from '../utils/cameraScanner'; +import CustomButton from '../components/CustomButton'; + + +const SuccessScreen: React.FC = () => { + return ( + + + Success, the proof has been verified + + + + + + ); +}; + +export default SuccessScreen; \ No newline at end of file diff --git a/app/src/screens/WrongProofScreen.tsx b/app/src/screens/WrongProofScreen.tsx new file mode 100644 index 00000000..35a5b1ad --- /dev/null +++ b/app/src/screens/WrongProofScreen.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { YStack, Text, XStack } from 'tamagui'; +import { bgGreen, textBlack } from '../utils/colors'; +import useUserStore from '../stores/userStore'; + +const WrongProofScreen: React.FC = () => { + const { proofVerificationResult } = useUserStore(); + + console.log('Raw proofVerificationResult:', JSON.stringify(proofVerificationResult)); + + const formatFieldName = (field: string) => { + return field.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); + }; + + // Remove the parsing step + const parsedResult = proofVerificationResult; + + const fieldsToCheck = [ + 'scope', 'merkle_root', 'attestation_id', 'current_date', 'issuing_state', + 'name', 'passport_number', 'nationality', 'date_of_birth', 'gender', + 'expiry_date', 'older_than', 'owner_of', 'proof' + ]; + + const failedConditions = []; + for (const field of fieldsToCheck) { + console.log(`Checking field ${field}: ${JSON.stringify(parsedResult[field])}`); + if (parsedResult[field] === false) { + failedConditions.push(formatFieldName(field)); + } + } + + console.log('Failed conditions:', JSON.stringify(failedConditions)); + + return ( + + + + Oops, the proof is not valid. + + + Some of the conditions have not been satisfied: + + + {failedConditions.map((condition, index) => ( + + · {condition} + + ))} + + + Check again your eligibility, if you are sure to be eligible to this verification please contact Proof of Passport support. + + + + + ); +}; + +export default WrongProofScreen; \ No newline at end of file diff --git a/app/src/stores/navigationStore.ts b/app/src/stores/navigationStore.ts index 2c615f98..7a2d7e3a 100644 --- a/app/src/stores/navigationStore.ts +++ b/app/src/stores/navigationStore.ts @@ -2,7 +2,7 @@ import { create } from 'zustand' import { IsZkeyDownloading, ShowWarningModalProps } from '../utils/zkeyDownload'; import { Steps } from '../utils/utils'; import { useToastController } from '@tamagui/toast'; -import { AppType } from '../utils/appType'; +import { AppType } from '../../../common/src/utils/appType'; interface NavigationState { step: number @@ -11,12 +11,16 @@ interface NavigationState { hideData: boolean toast: ReturnType selectedTab: string + setSelectedTab: (tab: string) => void selectedApp: AppType | null + setSelectedApp: (app: AppType | null) => void showRegistrationErrorSheet: boolean registrationErrorMessage: string setToast: (toast: ReturnType) => void; setStep: (step: number) => void update: (patch: any) => void + nfcSheetIsOpen: boolean + setNfcSheetIsOpen: (isOpen: boolean) => void } const useNavigationStore = create((set, get) => ({ @@ -41,8 +45,10 @@ const useNavigationStore = create((set, get) => ({ selectedApp: null, setToast: (toast) => set({ toast }), + setSelectedApp: (app) => set({ selectedApp: app }), setStep: (step) => set({ step }), + setSelectedTab: (tab) => set({ selectedTab: tab }), update: (patch) => { set({ @@ -50,6 +56,8 @@ const useNavigationStore = create((set, get) => ({ ...patch, }); }, + nfcSheetIsOpen: false, + setNfcSheetIsOpen: (isOpen) => set({ nfcSheetIsOpen: isOpen }), })) export default useNavigationStore \ No newline at end of file diff --git a/app/src/stores/userStore.ts b/app/src/stores/userStore.ts index 913f32cc..45193d78 100644 --- a/app/src/stores/userStore.ts +++ b/app/src/stores/userStore.ts @@ -20,6 +20,8 @@ import { sendRegisterTransaction } from '../utils/transactions'; import { loadPassportData, loadSecret, loadSecretOrCreateIt, storePassportData } from '../utils/keychain'; import { ethers } from 'ethers'; import { isCommitmentRegistered } from '../utils/registration'; +import { ProofOfPassportVerifierReport } from '@proofofpassport/sdk'; + interface UserState { passportNumber: string @@ -32,6 +34,7 @@ interface UserState { cscaProof: Proof | null localProof: Proof | null dscSecret: string | null + userLoaded: boolean initUserStore: () => void registerPassportData: (passportData: PassportData) => void registerCommitment: (passportData?: PassportData) => void @@ -42,9 +45,13 @@ interface UserState { deleteMrzFields: () => void setRegistered: (registered: boolean) => void setDscSecret: (dscSecret: string) => void + setUserLoaded: (userLoaded: boolean) => void + proofVerificationResult: string, + setProofVerificationResult: (proofVerificationResult: string) => void } const useUserStore = create((set, get) => ({ + userLoaded: false, passportNumber: DEFAULT_PNUMBER ?? "", dateOfBirth: DEFAULT_DOB ?? "", dateOfExpiry: DEFAULT_DOE ?? "", @@ -61,7 +68,13 @@ const useUserStore = create((set, get) => ({ setDscSecret: (dscSecret: string) => { set({ dscSecret }); }, - + setUserLoaded: (userLoaded: boolean) => { + set({ userLoaded }); + }, + proofVerificationResult: "null", + setProofVerificationResult: (proofVerificationResult: string) => { + set({ proofVerificationResult }); + }, // When user opens the app, checks presence of passportData // - If passportData is not present, starts the onboarding flow // - If passportData is present, then secret must be here too (they are always set together). Request the tree. @@ -78,6 +91,9 @@ const useUserStore = create((set, get) => ({ const passportData = await loadPassportData(); if (!passportData) { console.log("No passport data found, starting onboarding flow") + set({ + userLoaded: true, + }); return; } @@ -87,8 +103,10 @@ const useUserStore = create((set, get) => ({ console.log("not registered but passport data found, skipping to nextScreen") set({ passportData: JSON.parse(passportData), + userLoaded: true, }); - useNavigationStore.getState().setStep(Steps.NEXT_SCREEN); + // useNavigationStore.getState().setStep(Steps.NEXT_SCREEN); + return; } @@ -97,7 +115,8 @@ const useUserStore = create((set, get) => ({ passportData: JSON.parse(passportData), registered: true, }); - // useNavigationStore.getState().setStep(Steps.REGISTERED); + useNavigationStore.getState().setStep(Steps.REGISTERED); + set({ userLoaded: true }); }, // When reading passport for the first time: @@ -116,6 +135,7 @@ const useUserStore = create((set, get) => ({ }, registerCommitment: async (mockPassportData?: PassportData) => { + console.log("registerCommitment") const { toast, setStep, @@ -128,6 +148,7 @@ const useUserStore = create((set, get) => ({ } const isAlreadyRegistered = await isCommitmentRegistered(secret, passportData); + console.log("isAlreadyRegistered", isAlreadyRegistered) if (isAlreadyRegistered) { console.log("commitment is already registered") toast.show('Identity already registered, skipping', { @@ -160,7 +181,7 @@ const useUserStore = create((set, get) => ({ ); - amplitude.track(`Sig alg supported: ${passportData.signatureAlgorithm}`); + //amplitude.track(`Sig alg supported: ${passportData.signatureAlgorithm}`); console.log("userStore - inputs - Object.keys(inputs).forEach((key) => {...") Object.keys(inputs).forEach((key) => { if (Array.isArray(inputs[key as keyof typeof inputs])) { @@ -184,7 +205,7 @@ const useUserStore = create((set, get) => ({ const end = Date.now(); console.log('Total proof time from frontend:', end - start); - amplitude.track('Proof generation successful, took ' + ((end - start) / 1000) + ' seconds'); + //amplitude.track('Proof generation successful, took ' + ((end - start) / 1000) + ' seconds'); if ((get().cscaProof !== null) && (get().localProof !== null)) { @@ -199,6 +220,7 @@ const useUserStore = create((set, get) => ({ } set({ registered: true }); setStep(Steps.REGISTERED); + useNavigationStore.getState().setSelectedTab("app"); toast.show('✅', { message: "Registered", customData: { @@ -217,7 +239,7 @@ const useUserStore = create((set, get) => ({ registrationErrorMessage: error.message, }) setStep(Steps.NEXT_SCREEN); - amplitude.track(error.message); + //amplitude.track(error.message); } }, diff --git a/app/src/utils/appType.ts b/app/src/utils/appType.ts deleted file mode 100644 index 7d3defa2..00000000 --- a/app/src/utils/appType.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { CircuitName } from "./zkeyDownload"; - -type DisclosureOption = "required" | "optional"; - -type Disclosure = { - [key: string]: DisclosureOption; -}; - -export type AppType = { - id: string; - - // AppScreen UI - title: string, - description: string, - background?: string, - colorOfTheText: string, - selectable: boolean, - icon: any, - tags: React.JSX.Element[] - - // ProveScreen UI - name: string; - disclosureOptions: Disclosure | {}; - - beforeSendText1: string; - beforeSendText2: string; - sendButtonText: string; - sendingButtonText: string; - - successTitle: string; - successText: string; - - successComponent: () => React.JSX.Element; - finalButtonAction: () => void; - finalButtonText: string; - - scope: string; - circuit: CircuitName; // circuit and witness calculator name - - fields: React.FC[]; - - handleProve: () => void; - handleSendProof: () => void; -} diff --git a/app/src/utils/cameraScanner.ts b/app/src/utils/cameraScanner.ts index c67124e3..a0921b24 100644 --- a/app/src/utils/cameraScanner.ts +++ b/app/src/utils/cameraScanner.ts @@ -5,7 +5,7 @@ import useUserStore from '../stores/userStore'; import useNavigationStore from '../stores/navigationStore'; export const startCameraScan = async () => { - const {toast, setStep} = useNavigationStore.getState(); + const { toast, setSelectedTab } = useNavigationStore.getState(); if (Platform.OS === 'ios') { try { @@ -19,17 +19,15 @@ export const startCameraScan = async () => { dateOfExpiry: formatDateToYYMMDD(result.expiryDate), }) - setStep(Steps.MRZ_SCAN_COMPLETED); + setSelectedTab("nfc"); toast.show("Scan successful", { - message: 'Nice to meet you!', + message: '✅', customData: { type: "success", }, }) - amplitude.track('Camera scan successful'); } catch (e) { console.error(e); - amplitude.track('Camera scan unsuccessful'); } } else { NativeModules.CameraActivityModule.startCameraActivity() @@ -43,22 +41,19 @@ export const startCameraScan = async () => { dateOfExpiry: expiryDate, }) - setStep(Steps.MRZ_SCAN_COMPLETED); - amplitude.track('Camera scan successful'); + setSelectedTab("nfc"); toast.show("Scan successful", { - message: 'Nice to meet you!', + message: '✅', customData: { type: "success", }, - }) + }) } catch (error: any) { console.error('Invalid MRZ format:', error.message); - amplitude.track('Camera scan unsuccessful'); } }) .catch((error: any) => { console.error('Camera Activity Error:', error); - amplitude.track('Camera scan unsuccessful'); }); } }; \ No newline at end of file diff --git a/app/src/utils/colors.ts b/app/src/utils/colors.ts index 894fc530..9ebbdd67 100644 --- a/app/src/utils/colors.ts +++ b/app/src/utils/colors.ts @@ -13,3 +13,8 @@ export const redColorDark = "#3c181a" export const redColorLight = "#e5484d" export const yellowColorDark = "#2d2200" export const yellowColorLight = "#f5d90a" +export const bgWhite = "#F5F5F5" +export const textBlack = "#333333" +export const bgGreen = "#94FBAB" +export const bgBlue = "#69DFFF" +export const separatorColor = "#E0E0E0" \ No newline at end of file diff --git a/app/src/utils/nfcScanner.ts b/app/src/utils/nfcScanner.ts index e57ce7ee..674c8157 100644 --- a/app/src/utils/nfcScanner.ts +++ b/app/src/utils/nfcScanner.ts @@ -22,7 +22,7 @@ export const scan = async (setModalProofStep: (modalProofStep: number) => void) dateOfExpiry, } = useUserStore.getState() - const { toast, setStep } = useNavigationStore.getState(); + const { toast, setStep, nfcSheetIsOpen, setNfcSheetIsOpen } = useNavigationStore.getState(); const check = checkInputs( passportNumber, @@ -57,7 +57,9 @@ const scanAndroid = async (setModalProofStep: (modalProofStep: number) => void) dateOfExpiry, dscCertificate } = useUserStore.getState() - const { toast, setStep } = useNavigationStore.getState(); + const { toast, setNfcSheetIsOpen } = useNavigationStore.getState(); + setNfcSheetIsOpen(true); + try { const response = await PassportReader.scan({ @@ -66,12 +68,13 @@ const scanAndroid = async (setModalProofStep: (modalProofStep: number) => void) dateOfExpiry: dateOfExpiry }); console.log('scanned'); - amplitude.track('NFC scan successful'); + setNfcSheetIsOpen(false); + //amplitude.track('NFC scan successful'); handleResponseAndroid(response, setModalProofStep); } catch (e: any) { console.log('error during scan:', e); - setStep(Steps.MRZ_SCAN_COMPLETED); - amplitude.track('NFC scan unsuccessful', { error: JSON.stringify(e) }); + setNfcSheetIsOpen(false); + //amplitude.track('NFC scan unsuccessful', { error: JSON.stringify(e) }); toast.show('Error', { message: e.message, customData: { @@ -98,11 +101,11 @@ const scanIOS = async (setModalProofStep: (modalProofStep: number) => void) => { ); console.log('scanned'); handleResponseIOS(response, setModalProofStep); - amplitude.track('NFC scan successful'); + //amplitude.track('NFC scan successful'); } catch (e: any) { console.log('error during scan:', e); setStep(Steps.MRZ_SCAN_COMPLETED); - amplitude.track(`NFC scan unsuccessful, error ${e.message}`); + //amplitude.track(`NFC scan unsuccessful, error ${e.message}`); if (!e.message.includes("UserCanceled")) { toast.show('Failed to read passport', { message: e.message, @@ -155,7 +158,7 @@ const handleResponseIOS = async ( const encryptedDigestArray = Array.from(Buffer.from(signatureBase64, 'base64')).map(byte => byte > 127 ? byte - 256 : byte); - amplitude.track('Sig alg before conversion: ' + signatureAlgorithm); + //amplitude.track('Sig alg before conversion: ' + signatureAlgorithm); console.log('signatureAlgorithm before conversion', signatureAlgorithm); const passportData = { mrz, @@ -196,10 +199,11 @@ const handleResponseIOS = async ( sendCSCARequest(inputs_csca, setModalProofStep); useNavigationStore.getState().setStep(Steps.NEXT_SCREEN); + useNavigationStore.getState().setSelectedTab("next"); } catch (e: any) { console.log('error during parsing:', e); useNavigationStore.getState().setStep(Steps.MRZ_SCAN_COMPLETED); - amplitude.track('Signature algorithm unsupported (ecdsa not parsed)', { error: JSON.stringify(e) }); + //amplitude.track('Signature algorithm unsupported (ecdsa not parsed)', { error: JSON.stringify(e) }); toast.show('Error', { message: "Your signature algorithm is not supported at that time. Please try again later.", customData: { @@ -231,7 +235,7 @@ const handleResponseAndroid = async ( documentSigningCertificate } = response; - amplitude.track('Sig alg before conversion: ' + signatureAlgorithm); + //amplitude.track('Sig alg before conversion: ' + signatureAlgorithm); const pem = "-----BEGIN CERTIFICATE-----" + documentSigningCertificate + "-----END CERTIFICATE-----" @@ -255,7 +259,7 @@ const handleResponseAndroid = async ( encryptedDigest: JSON.parse(encryptedDigest), photoBase64: photo.base64, }; - amplitude.track('Sig alg after conversion: ' + passportData.signatureAlgorithm); + //amplitude.track('Sig alg after conversion: ' + passportData.signatureAlgorithm); console.log('passportData', JSON.stringify({ ...passportData, @@ -304,4 +308,5 @@ const handleResponseAndroid = async ( ); sendCSCARequest(inputs_csca, setModalProofStep); useNavigationStore.getState().setStep(Steps.NEXT_SCREEN); + useNavigationStore.getState().setSelectedTab("next"); }; diff --git a/app/src/utils/registration.ts b/app/src/utils/registration.ts index 1ab82331..5b9f8f1a 100644 --- a/app/src/utils/registration.ts +++ b/app/src/utils/registration.ts @@ -8,7 +8,16 @@ import { formatMrz, packBytes } from "../../../common/src/utils/utils"; import { findIndexInTree } from "../../../common/src/utils/generateInputs"; export async function isCommitmentRegistered(secret: string, passportData: PassportData) { - const response = await axios.get(COMMITMENT_TREE_TRACKER_URL) + + + let response; + console.log(COMMITMENT_TREE_TRACKER_URL) + try { + response = await axios.get(COMMITMENT_TREE_TRACKER_URL); + } catch (error) { + console.error('Error fetching commitment tree:', error); + throw error; // rethrow the error after logging + } console.log('response.data:', response.data); const imt = new LeanIMT( @@ -40,7 +49,7 @@ export async function isCommitmentRegistered(secret: string, passportData: Passp try { findIndexInTree(imt as any, commitment); // this will throw if not found return true - } catch(err) { + } catch (err) { return false; } } \ No newline at end of file diff --git a/app/src/utils/utils.ts b/app/src/utils/utils.ts index d9af0204..1445c087 100644 --- a/app/src/utils/utils.ts +++ b/app/src/utils/utils.ts @@ -34,6 +34,7 @@ export function formatDateToYYMMDD(inputDate: string) { } export const Steps = { + START: 0, MRZ_SCAN: 1, MRZ_SCAN_COMPLETED: 2, NFC_SCANNING: 3, diff --git a/app/src/utils/zkeyDownload.ts b/app/src/utils/zkeyDownload.ts index d8895d7e..f874f628 100644 --- a/app/src/utils/zkeyDownload.ts +++ b/app/src/utils/zkeyDownload.ts @@ -43,7 +43,7 @@ export async function downloadZkey( const downloadRequired = await isDownloadRequired(circuit, isZkeyDownloading); if (!downloadRequired) { console.log(`zkey for ${circuit} already downloaded`) - amplitude.track(`zkey for ${circuit} already downloaded`); + //amplitude.track(`zkey for ${circuit} already downloaded`); return; } @@ -107,7 +107,7 @@ export async function fetchZkey( circuit: CircuitName, ) { console.log(`fetching zkey for ${circuit} ...`) - amplitude.track(`fetching zkey for ${circuit} ...`); + //amplitude.track(`fetching zkey for ${circuit} ...`); const { isZkeyDownloading, @@ -171,7 +171,7 @@ export async function fetchZkey( } }); - amplitude.track('zkey download succeeded, took ' + ((Date.now() - startTime) / 1000) + ' seconds'); + //amplitude.track('zkey download succeeded, took ' + ((Date.now() - startTime) / 1000) + ' seconds'); const zipSize = await RNFS.stat(`${RNFS.DocumentDirectoryPath}/${circuit}.zkey.zip`); console.log('zipSize:', zipSize.size); @@ -202,7 +202,7 @@ export async function fetchZkey( [circuit]: false, } }); - amplitude.track('zkey download failed: ' + error.message); + //amplitude.track('zkey download failed: ' + error.message); toast.show('Error', { message: `Error: ${error.message}`, customData: { diff --git a/app/yarn.lock b/app/yarn.lock index 8f0c1319..588768a7 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -73,6 +73,13 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@~7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" @@ -284,6 +291,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" @@ -307,6 +319,16 @@ "@babel/traverse" "^7.23.9" "@babel/types" "^7.23.9" +"@babel/highlight@^7.10.4": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/highlight@^7.23.4": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" @@ -1209,18 +1231,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@emotion/is-prop-valid@^0.8.2": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1258,6 +1268,55 @@ resolved "https://registry.yarnpkg.com/@ethersproject/shims/-/shims-5.7.0.tgz#ee32e543418595774029c5ea6123ea8995e7e154" integrity sha512-WeDptc6oAprov5CCN2LJ/6/+dC9gTonnkdAtLepm/7P5Z+3PRxS5NpfVWmOMs1yE4Vitl2cU8bOPWC0GvGSbVg== +"@expo/config-plugins@~8.0.0": + version "8.0.8" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.8.tgz#294a71905a498ea02c8b79bea950b5e37ab5d748" + integrity sha512-Fvu6IO13EUw0R9WeqxUO37FkM62YJBNcZb9DyJAOgMz7Ez/vaKQGEjKt9cwT+Q6uirtCATMgaq6VWAW7YW8xXw== + dependencies: + "@expo/config-types" "^51.0.0-unreleased" + "@expo/json-file" "~8.3.0" + "@expo/plist" "^0.1.0" + "@expo/sdk-runtime-versions" "^1.0.0" + chalk "^4.1.2" + debug "^4.3.1" + find-up "~5.0.0" + getenv "^1.0.0" + glob "7.1.6" + resolve-from "^5.0.0" + semver "^7.5.4" + slash "^3.0.0" + slugify "^1.6.6" + xcode "^3.0.1" + xml2js "0.6.0" + +"@expo/config-types@^51.0.0-unreleased": + version "51.0.2" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.2.tgz#7385451b180d34d8f2a4eeb5feabe1fe3c5d4f32" + integrity sha512-IglkIoiDwJMY01lYkF/ZSBoe/5cR+O3+Gx6fpLFjLfgZGBTdyPkKa1g8NWoWQCk+D3cKL2MDbszT2DyRRB0YqQ== + +"@expo/json-file@~8.3.0": + version "8.3.3" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.3.tgz#7926e3592f76030ce63d6b1308ac8f5d4d9341f4" + integrity sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.2" + write-file-atomic "^2.3.0" + +"@expo/plist@^0.1.0": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.3.tgz#b4fbee2c4f7a88512a4853d85319f4d95713c529" + integrity sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg== + dependencies: + "@xmldom/xmldom" "~0.7.7" + base64-js "^1.2.3" + xmlbuilder "^14.0.0" + +"@expo/sdk-runtime-versions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" + integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== + "@floating-ui/core@^1.0.0", "@floating-ui/core@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" @@ -1265,42 +1324,47 @@ dependencies: "@floating-ui/utils" "^0.2.1" -"@floating-ui/dom@^1.6.1": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== +"@floating-ui/dom@^1.0.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.8.tgz#45e20532b6d8a061b356a4fb336022cf2609754d" + integrity sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q== dependencies: - "@floating-ui/core" "^1.0.0" - "@floating-ui/utils" "^0.2.0" + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.5" -"@floating-ui/react-dom@^2.0.6", "@floating-ui/react-dom@^2.0.8": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d" - integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== +"@floating-ui/react-dom@^2.1.0", "@floating-ui/react-dom@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" + integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== dependencies: - "@floating-ui/dom" "^1.6.1" + "@floating-ui/dom" "^1.0.0" -"@floating-ui/react-native@^0.10.3": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@floating-ui/react-native/-/react-native-0.10.4.tgz#2a155b1de9d3fcc2147bdf913b6df37adf6ab3ab" - integrity sha512-R0RiZ+XiC+S2Xw11i+HjXj8/ik006edp2SDGKELOlkP55SNE1UMfxackchi/rJfnv+qL9YHQRNySte967+kyVA== +"@floating-ui/react-native@^0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@floating-ui/react-native/-/react-native-0.10.6.tgz#2fb6cdd31c2c782ac95cf6ce651bd1aba0489528" + integrity sha512-/9tXRdwhPFUQhReb4XLWMClVDIi1620+pHDxfqPXXkRrH2cTIb9AJu3Cg7XszbXNArPdrPsB7OILrq92TOVVNg== dependencies: - "@floating-ui/core" "^1.6.0" + "@floating-ui/core" "^1.0.0" -"@floating-ui/react@^0.26.6": - version "0.26.9" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.9.tgz#bbccbefa0e60c8b7f4c0387ba0fc0607bb65f2cc" - integrity sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w== +"@floating-ui/react@^0.26.16": + version "0.26.20" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.20.tgz#49ae23347666626db8671c2aa2df469bbec7db71" + integrity sha512-RixKJJG92fcIsVoqrFr4Onpzh7hlOx4U7NV4aLhMLmtvjZ5oTB/WzXaANYUZATKqXvvW7t9sCxtzejip26N5Ag== dependencies: - "@floating-ui/react-dom" "^2.0.8" - "@floating-ui/utils" "^0.2.1" - tabbable "^6.0.1" + "@floating-ui/react-dom" "^2.1.1" + "@floating-ui/utils" "^0.2.5" + tabbable "^6.0.0" -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": +"@floating-ui/utils@^0.2.1": version "0.2.1" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@floating-ui/utils@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.5.tgz#105c37d9d9620ce69b7f692a20c821bf1ad2cbf9" + integrity sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ== + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1332,6 +1396,19 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@iden3/bigarray@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== + +"@iden3/binfileutils@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" + integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== + dependencies: + fastfile "0.0.20" + ffjavascript "^0.3.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1609,59 +1686,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@motionone/animation@^10.12.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.17.0.tgz#7633c6f684b5fee2b61c405881b8c24662c68fca" - integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg== - dependencies: - "@motionone/easing" "^10.17.0" - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" - tslib "^2.3.1" - -"@motionone/dom@10.12.0": - version "10.12.0" - resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.12.0.tgz#ae30827fd53219efca4e1150a5ff2165c28351ed" - integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== - dependencies: - "@motionone/animation" "^10.12.0" - "@motionone/generators" "^10.12.0" - "@motionone/types" "^10.12.0" - "@motionone/utils" "^10.12.0" - hey-listen "^1.0.8" - tslib "^2.3.1" - -"@motionone/easing@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.17.0.tgz#d66cecf7e3ee30104ad00389fb3f0b2282d81aa9" - integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg== - dependencies: - "@motionone/utils" "^10.17.0" - tslib "^2.3.1" - -"@motionone/generators@^10.12.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.17.0.tgz#878d292539c41434c13310d5f863a87a94e6e689" - integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ== - dependencies: - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" - tslib "^2.3.1" - -"@motionone/types@^10.12.0", "@motionone/types@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.0.tgz#179571ce98851bac78e19a1c3974767227f08ba3" - integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA== - -"@motionone/utils@^10.12.0", "@motionone/utils@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.17.0.tgz#cc0ba8acdc6848ff48d8c1f2d0d3e7602f4f942e" - integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg== - dependencies: - "@motionone/types" "^10.17.0" - hey-listen "^1.0.8" - tslib "^2.3.1" - "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -1702,6 +1726,25 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@proofofpassport/sdk@^1.5.6": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@proofofpassport/sdk/-/sdk-1.6.0.tgz#5c6770ab8a31e5d39f06514a0b8eb06cf8f9a2a9" + integrity sha512-UwCaNGl7kwKJPsEexGfG73HMI4OfTTeGZIg4HZMjsxAHEC4ngJSODR3Teayi3jybHyfFZa+m46f9JM5xF7BKFQ== + dependencies: + "@zk-kit/imt" "^2.0.0-beta.5" + "@zk-kit/lean-imt" "^2.0.1" + axios "^1.7.2" + easyqrcodejs "^4.6.1" + ethers "^6.13.0" + fs "^0.0.1-security" + js-sha1 "^0.7.0" + js-sha256 "^0.11.0" + js-sha512 "^0.9.0" + node-forge "^1.3.1" + poseidon-lite "^0.2.0" + snarkjs "^0.7.4" + socket.io-client "^4.7.5" + "@react-native-async-storage/async-storage@^1.17.11", "@react-native-async-storage/async-storage@^1.23.1": version "1.23.1" resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz#cad3cd4fab7dacfe9838dce6ecb352f79150c883" @@ -2004,961 +2047,976 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@tamagui/accordion@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/accordion/-/accordion-1.94.4.tgz#a7fd5a01f3068924324ecc4ed4b386443a609015" - integrity sha512-DeYJEs9z8m4MHJenN9V9DWieekhqcvzvtmwbCEMEczbR9LnK73w5u40HejAvNMCpVihnZsizj3NpYdcylfNA5A== - dependencies: - "@tamagui/collapsible" "1.94.4" - "@tamagui/collection" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/adapt@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/adapt/-/adapt-1.94.4.tgz#d1383ff0b7f343df2b8758a5221c5803d4dc169a" - integrity sha512-t7vdA0Fua78vgZVTNhtkm5A2jVw5EjkNjVpE3o4YP8BEJPLDKCoKwNd62Lr+RqKh/KzgqaQ3Y06+btihwJOvGA== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/helpers" "1.94.4" - -"@tamagui/alert-dialog@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/alert-dialog/-/alert-dialog-1.94.4.tgz#67b81d2df049ccd2198ac9761401db8abec08aee" - integrity sha512-IphiOKkyhBIYuK8me+sgKMoDynDwtiSek0xM8JqKwCe3Ug+qHLlTx+hMS/C+eyfheqykuQNWmd3/8XREUOgNVQ== - dependencies: - "@tamagui/animate-presence" "1.94.4" - "@tamagui/aria-hidden" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/dialog" "1.94.4" - "@tamagui/dismissable" "1.94.4" - "@tamagui/focus-scope" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/popper" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/remove-scroll" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/animate-presence@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/animate-presence/-/animate-presence-1.94.4.tgz#ff7db46fc35e2fc187bb020680c3e9fab0dcc742" - integrity sha512-azI1KpoVr6yZNcsVx8Pavu0LBhD3mFV3QjfpvGykSBgrMA2GVShM9IWLxYDIJI+WvpS+Lpk0Z9vlcL0r1zkGXw== - dependencies: - "@tamagui/helpers" "1.94.4" - "@tamagui/use-constant" "1.94.4" - "@tamagui/use-force-update" "1.94.4" - "@tamagui/use-presence" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/animate@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/animate/-/animate-1.94.4.tgz#58b5a8a6fb5387ab8604559eaac13693b4521e95" - integrity sha512-WGEQEHktqeyS6IuIYsDBcKXzB9uUtrDWW2ioy6dRuoiUqPfnIdyR4TFS5fYJyjQkNxhms/Ds2Xto3YQlXjPHxQ== - dependencies: - "@tamagui/animate-presence" "1.94.4" - -"@tamagui/animations-css@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/animations-css/-/animations-css-1.94.4.tgz#7d89a1e55d9930c9825bdfc908f181ecd901ab6d" - integrity sha512-EDieSsOWa/wjSlCJR7RJb6naKNDosn/D6Pky1cHV0Aotuqg7ldKre12C63WSFMdYiKYBpxrQQiwzYr2JaMutXA== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/cubic-bezier-animator" "1.94.4" - "@tamagui/use-presence" "1.94.4" - "@tamagui/web" "1.94.4" - react "^18.2.0" - -"@tamagui/animations-moti@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/animations-moti/-/animations-moti-1.94.4.tgz#571f8b6e8b6eff5481d7ec2db1a3c864e5d8a02b" - integrity sha512-6eqJAcIVk0aFQHmxVMFugAuOoAn+tQukPG3vkERdGD8G2StQiqAU5fJ4q56PwBdcKPgTXPWrHTpCsrW7oySIPA== - dependencies: - "@tamagui/use-presence" "1.94.4" - "@tamagui/web" "1.94.4" - moti "^0.27.4" - react "^18.2.0" - -"@tamagui/animations-react-native@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/animations-react-native/-/animations-react-native-1.94.4.tgz#be88b0ac004822fd35d6bb4b734f208dff22bf13" - integrity sha512-IVA3J0aT5INTkF1l5Xr/VlFChZUttsp3/s06VZRSrZpBpYIYGJfyBi9dITo7vHgJprZ9vyMX577reC1wgjcFGA== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/use-presence" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/aria-hidden@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/aria-hidden/-/aria-hidden-1.94.4.tgz#68c10d867bb86f1b8c5cf3885d285634484326ee" - integrity sha512-6dd7cjcgBHv7Aj8BrG/OW+fsPApisRKNAlLlRcGZROGAiigDGIQ9A62iQ7QccIqoeYkWqxLeKrOGzJIvTCXNTg== +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@tamagui/accordion@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/accordion/-/accordion-1.105.8.tgz#9b39fff9974cd0eb96bab7120e50f83085e218f3" + integrity sha512-0mJHPligzmVKLquTcxZIdO32QJ5mXMCfi8QJTU7OYEvOK3O+CHFl9uCqheEC3VjACu3KOxoveExzY2XvUIfr4A== + dependencies: + "@tamagui/collapsible" "1.105.8" + "@tamagui/collection" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/adapt@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/adapt/-/adapt-1.105.8.tgz#3e9f19be6e36a6b3b3e202417c584b087d590b5e" + integrity sha512-FUO+Xt2xO3nYsohpTDcCP7GK4UQfPCPo+sQBkJKCW+j3UkYKoOLrkKmaLrdrixXAYLTmNF8abLYNhkqRldYC6w== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/helpers" "1.105.8" + +"@tamagui/alert-dialog@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/alert-dialog/-/alert-dialog-1.105.8.tgz#137845e5c08381569bed3cc7d85c63b249bb74f7" + integrity sha512-ubkmfh1UU86ALBka3uA+tmx89Hhf2LRs52mwTl59u5SSsugig9I3zDlg+fTmMj7ti0A3/nx3jRSdb9F+YrNwTQ== + dependencies: + "@tamagui/animate-presence" "1.105.8" + "@tamagui/aria-hidden" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/dialog" "1.105.8" + "@tamagui/dismissable" "1.105.8" + "@tamagui/focus-scope" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/popper" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/remove-scroll" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/animate-presence@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/animate-presence/-/animate-presence-1.105.8.tgz#1f3a1d9b7140aa55724a4edbef562c10eed3988b" + integrity sha512-nD9OC/7AoKpuN6FIamfcFSnvmTJx2OsncPP1nO/4crDpV87Ea6mK07G4jl4awLHJw+wACJBY1cCpd9mgDd4DYg== + dependencies: + "@tamagui/helpers" "1.105.8" + "@tamagui/use-constant" "1.105.8" + "@tamagui/use-force-update" "1.105.8" + "@tamagui/use-presence" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/animate@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/animate/-/animate-1.105.8.tgz#7d62bd71507698730238e6a086bbfd658162de90" + integrity sha512-uJ+T2pQSEzJp8LY7OyLEF4SsUdP3VjyjArFOcDHU9CR9Tp7fZWc+Gx3Znp8jPxIdv6O0TSudmPyIBeI+0AuumA== + dependencies: + "@tamagui/animate-presence" "1.105.8" + +"@tamagui/animations-css@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/animations-css/-/animations-css-1.105.8.tgz#a0a6bea1e20e89cb9d8dc6437026e739a604208c" + integrity sha512-wThtL2+ZBPp9elGgtGDcisTBLMeUpOSLyRJ5BzsEvrYyzTBKpCS5JcmC8ZHPtGA2mWHrmfYWQ2NR+9J25K2myw== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/cubic-bezier-animator" "1.105.8" + "@tamagui/use-presence" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/animations-moti@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/animations-moti/-/animations-moti-1.105.8.tgz#16c44308bd4c8cd9a55c5a31efc820cdcc55e8a4" + integrity sha512-Q5OY8ZVZNmk+URc3bRe1QGudjhAJKITXSoDvBpbooZTfkdub80HQRJ43ez9K6il0+XmITSL7Q/+hDdny46pBqA== + dependencies: + "@tamagui/use-presence" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/animations-react-native@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/animations-react-native/-/animations-react-native-1.105.8.tgz#72a574b7d90d4f7005e6e5906fe021f8558eed56" + integrity sha512-3zqNm9whSEfGgQsQC8sPn1Dub+HdPVlWVNP2zWR28bni945EoiEurRn5skd/UZHHuGfzn+8BNdCdlXYzwp+RAg== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/use-presence" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/aria-hidden@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/aria-hidden/-/aria-hidden-1.105.8.tgz#e89d8dfb195c044f1a823e7f530f2af0c86a7e6f" + integrity sha512-Egy/5Ys2/N2kA3+mOoa62WdIWv3twNgJDnBXD38jI64wen1uslH0e50mvI0b23M0RaW6t3FNlgsDf2hjtwwYxw== dependencies: aria-hidden "^1.1.3" -"@tamagui/avatar@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/avatar/-/avatar-1.94.4.tgz#c47807010a001bd49b84a4e160bd9612fea929e5" - integrity sha512-J1p+sJ+0PcXdCkEdNyyEx0j0Uhab7awwI2ikpixwQ7beGya3iWANRZcIrPfwE3/Dk+US4R3QBgmwqW97LlXteg== - dependencies: - "@tamagui/core" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/image" "1.94.4" - "@tamagui/shapes" "1.94.4" - "@tamagui/text" "1.94.4" - -"@tamagui/button@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/button/-/button-1.94.4.tgz#2e0383456f3c50d5b443df7275a0845555d1f21d" - integrity sha512-2VahDlXP/ES8j4nw4wT8aNwNLbpq9eHr0yPso5Vqylqj15Gj2m1cyo+RHcmDWafUOfz47yyUZT6ggb0kH6Ehvw== - dependencies: - "@tamagui/font-size" "1.94.4" - "@tamagui/get-button-sized" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/helpers-tamagui" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/card@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/card/-/card-1.94.4.tgz#20d477e9320d5132dafae5b87ad3e0a8b5b5e71a" - integrity sha512-w3pdv9INuSc8Pp3OCcTGiITEIe5zQoNVI2tkKsJPpr0xmAnQDFWWsjyGCn1Lgd3oxS4ly5Eu4CIx96S4NgyJqg== - dependencies: - "@tamagui/create-context" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/checkbox-headless@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/checkbox-headless/-/checkbox-headless-1.94.4.tgz#a4dbdc8c5afd26db099dd7c712ebffa2f248af34" - integrity sha512-7T7z7G3FjgSlcEwp0H8iYJLckHDDN19mM+Du82GDKrnsBUI9FtqMZ3LTKubKpQoUb9wRdcGdaRK5wKKER5XC3g== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/label" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-previous" "1.94.4" - -"@tamagui/checkbox@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/checkbox/-/checkbox-1.94.4.tgz#4be349421f91a5bde4e21085603d7511cfb2aa2c" - integrity sha512-niVioHgxhJMrkuGIZEAZk6BRsGCECDdWvJuMUC2kmGlv1U54d23oAYEW2ipffoMglMkL+Z/kmMk4gt7olweAOg== - dependencies: - "@tamagui/checkbox-headless" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/font-size" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/helpers-tamagui" "1.94.4" - "@tamagui/label" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-previous" "1.94.4" - -"@tamagui/collapsible@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/collapsible/-/collapsible-1.94.4.tgz#3a2959e0488ad670f3f46470e989954b0dbf73be" - integrity sha512-vatjYy0KRcxJ3Z5COIyoUQ1f4wJBs+JHsMAIWZd5pjAh9QWwv7PFNE4rW7RYeGxqyQsal6okFZkH9Yafc5keNQ== - dependencies: - "@tamagui/animate-presence" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/collection@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/collection/-/collection-1.94.4.tgz#53dd5c6438d9031a045df941b6117efa52133dd5" - integrity sha512-rH81L/xvnOjf7Lj0/WKB9yfJpAKfHEGoRICdyW2JVy3SitbIwzV5PXgnsVjXAoWX47ImsZ+Odyr3CrfpnA9dvQ== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/colors@1.94.4", "@tamagui/colors@^1.94.3": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/colors/-/colors-1.94.4.tgz#c63d91697dd7bff6f35772b979c846f37d795c25" - integrity sha512-unkcJhjSvLSUrgsegAUjTKH8qD1PNTCI35iz4eaG4/1WsfflVb9wK+bkWAWM2fUqCHBtSnTigZdGOrlOV5mxeQ== - -"@tamagui/compose-refs@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/compose-refs/-/compose-refs-1.94.4.tgz#81222d145b82a8c8aa5bb2024aa9a53272693aae" - integrity sha512-94z5zQr9UJ/bk5pbQnffycaIGba6P7+uU4XQ8Pq2OINUvk32JRS8UIvm5jDSP3ueGU23KXVWx58ZpmdqTzSvoQ== - -"@tamagui/config@^1.94.3": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/config/-/config-1.94.4.tgz#ae3604752ff7351408c41cef97362e41bc614ee7" - integrity sha512-YuOPATFd/hVrDLO5eGfBHX3b3UEv35ZHrE/V5lNL4mCWPzIv8A2MeU5rzZF/1/0Rpwk/UItkRLHBdwwk70KSMg== - dependencies: - "@tamagui/animations-css" "1.94.4" - "@tamagui/animations-moti" "1.94.4" - "@tamagui/animations-react-native" "1.94.4" - "@tamagui/colors" "1.94.4" - "@tamagui/font-inter" "1.94.4" - "@tamagui/font-silkscreen" "1.94.4" - "@tamagui/react-native-media-driver" "1.94.4" - "@tamagui/shorthands" "1.94.4" - "@tamagui/themes" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/constants@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/constants/-/constants-1.94.4.tgz#f608e82d2826195ce80b7911a58eb5ee792b34d7" - integrity sha512-6494xbnQl12bXDvIbC15bVzhJcmxRMupeJqp3W9DIOFHfruDFTPF0njP90ISu6kwkV5BeQXPXIW6+EVWxu2dNA== - -"@tamagui/core@1.94.4", "@tamagui/core@^1.94.3": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/core/-/core-1.94.4.tgz#6bc38f2bd35188a0ef11d7ec9724317d4ba3d19e" - integrity sha512-OQIvOpMLpu4JhfQr1tHGvk0nBatCPrv8jyDRgDpXh7kk9XV+ZLBLsm2pZ1AimOYcfMj7p4JceLrZp+SciRFvFg== - dependencies: - "@tamagui/react-native-use-pressable" "1.94.4" - "@tamagui/react-native-use-responder-events" "1.94.4" - "@tamagui/use-event" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/create-context@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/create-context/-/create-context-1.94.4.tgz#6ade373a41b4efa9fc5c3d5fc42ce35f09ded526" - integrity sha512-qTLja0yaZsm++CXxdZxjBpUxiccOKPejX8FC02SN6jj62eQ1RWUBxz2Yziw6kUBjax517Xij4W1039sRXCnQtw== - -"@tamagui/create-theme@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/create-theme/-/create-theme-1.94.4.tgz#8dabfda3aa227d9456b787d9575695db5c765e69" - integrity sha512-w59YMOH1rsGRrLJA1sdaRiwC+hfBDD2DB8mUQyYksIeT+HBekZFUlgoDU6NEwdfvMS3/6cQXvg9M/9d4M/UcVQ== - dependencies: - "@tamagui/web" "1.94.4" - -"@tamagui/cubic-bezier-animator@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/cubic-bezier-animator/-/cubic-bezier-animator-1.94.4.tgz#143da62b162125f2f98b54f44d5d8cc3d83c8705" - integrity sha512-SrE/pjpCa+S/yYqtMz86uB8WehcwEP1P2VKMAKqQ2dUip1fvJLgmZmUzYP9ALUsSTeTI7voF90EZN7WGA6sKnQ== - -"@tamagui/dialog@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/dialog/-/dialog-1.94.4.tgz#b5ca2c0af096f2aaa83c31ba172624f8053901ae" - integrity sha512-L++tDSlvnzdWSmD797RFgUkhyGki3Q6dxBYtyMznpg7uF3DUus+6L8lXQGvNR7pEFg1dMtt/hi+rD/P82GWOHA== - dependencies: - "@tamagui/adapt" "1.94.4" - "@tamagui/animate-presence" "1.94.4" - "@tamagui/aria-hidden" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/dismissable" "1.94.4" - "@tamagui/focus-scope" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/popper" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/remove-scroll" "1.94.4" - "@tamagui/sheet" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/dismissable@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/dismissable/-/dismissable-1.94.4.tgz#462a9d7b2abd9bc8ecac210ba62712ba75fecbe8" - integrity sha512-+Rg/2GYkdtwD+BELzuP6eYcy7qyoZj/2iuFAf3T4TFQJ4I1iBkc+1Uu1eBwYnp1TNBlqf8DJdJgj0RWHoH/Kxw== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/use-escape-keydown" "1.94.4" - "@tamagui/use-event" "1.94.4" - -"@tamagui/elements@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/elements/-/elements-1.94.4.tgz#8e7433a3cde668a957b1060d5136a5376870da7f" - integrity sha512-CRpN+T9JFodOIEynwsSPZGCwjFbA/At9PY5g6u9pMIB62K8/Ne0rc+7srY152zUHal2xVIpUL463g0bC3CZesw== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/fake-react-native@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/fake-react-native/-/fake-react-native-1.94.4.tgz#0608ad6148661e1e23885b8e6a4babf34730ef60" - integrity sha512-CVlA9pd8/PnJ7oAOHXUIZnaqm2wA0JpPsTaxZqmb9T2qfY25kE4wc/KWbd1pmYWOANtSWug2iGY1Ur5C/qnkfw== - -"@tamagui/floating@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/floating/-/floating-1.94.4.tgz#7ec9647cfd0d3021bc75b9d58762822a4eaa9c2f" - integrity sha512-edlxlxrZrzuVo/vHziRnnHXGjm7aEqW2dJD3fu7aAod4De81Sgvyk/zvjsUdH9P/g/PDeokxg3P6+BCut7d/lQ== - dependencies: - "@floating-ui/react-dom" "^2.0.6" - "@floating-ui/react-native" "^0.10.3" - react-dom "^18.2.0" - -"@tamagui/focus-scope@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/focus-scope/-/focus-scope-1.94.4.tgz#1f7e9696c12f6dba510d4841073f415fbb1915e2" - integrity sha512-1MiWkms6wV2bcruAzEIsWQ8q8O1Gqgpvf6gdGmDqYDgtJiY8RWlHUcMtCapETA2OK1BCD7UgeNGAUn0R7QSvLQ== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/use-event" "1.94.4" - -"@tamagui/focusable@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/focusable/-/focusable-1.94.4.tgz#b779ca13dd668f48bb91d0a72b17b5d83885f333" - integrity sha512-4KRkck3Os6WMLYFwDCK7oUu+8DHUZ3DKljFMtBK1Z4KU2TUePYe58zzV21paC4PzFUQynuN2dCWDyB9I59oPfg== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/font-inter@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/font-inter/-/font-inter-1.94.4.tgz#cb33fb6e315f367ae12965874b229fe933d5250a" - integrity sha512-p0jagYHyimeZRIuUBRAEgDg7NFjdQI3FaiT9LyEx5hwksEYMaUYnIe0dxyDfB7faqYgYlA/o0d6yt3gXH1Foxw== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/font-silkscreen@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/font-silkscreen/-/font-silkscreen-1.94.4.tgz#9676d251b4adfa9dcfe9e2a48206f99ceef55dbc" - integrity sha512-tbFjrce5xd3wIU2whbCYB/F4fOVDhC/rhCzrCZInL5RkmBZnVg6YV+60jsV+2VnFh/tCykiJ/NCYL2g6Kqsy8g== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/font-size@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/font-size/-/font-size-1.94.4.tgz#0bcf3610d3750f3cb1c70ef24a9ffdd84691c55a" - integrity sha512-MNkJS0VRr/T6Od1DyxG3bzc4TSgwmtPY1cbqJCQiQQEYCvYW1O7NFijPRsSHyyQQHDjak46fSvZ+IUrDJwPksw== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/form@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/form/-/form-1.94.4.tgz#343bfdafdd2ac7df4409a83090da53b97348d895" - integrity sha512-dTEH+YNkwBMHzPGQSK82pkGJ7dCCnmPgBjWRPTc410KxBr+Qdds1M/Sn1KmJ9qETjIl5xGNqanrShzVbg++2kA== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/get-button-sized" "1.94.4" - "@tamagui/get-font-sized" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/text" "1.94.4" - -"@tamagui/get-button-sized@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/get-button-sized/-/get-button-sized-1.94.4.tgz#d9e4388bcb3708a7dad062319216b28780840d36" - integrity sha512-YmG0T8MHbi5OAp42EJKlayhYob84RdU+CXKX22TtBSoEgC0yvIqq4VpYk3p1dKIS0KL1pbbC14AxK654XqeMLA== - dependencies: - "@tamagui/get-token" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/get-font-sized@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/get-font-sized/-/get-font-sized-1.94.4.tgz#306da0888bcd2ec7f550a6337b7ebadf548fdf12" - integrity sha512-pMYKQRhmlbtjGoptM4WC/NLzbVpnQuaXb6rVogvaf3QwSk3N+4mXGKlsB5kXlnERiL6mCdUDsMxu8lt3hR8r8g== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/get-token@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/get-token/-/get-token-1.94.4.tgz#316afc6e5c3d379bca37ab5257bd9456b1e8a02b" - integrity sha512-9cNmtsJv4RhWPG0q4lZPNBzbPpO3jutgPeg36Q/ub4nlKJA0U+BRRbIYTXtrzE/k2tQSiqlpVRMsmuh3ItfysA== - dependencies: - "@tamagui/web" "1.94.4" - -"@tamagui/group@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/group/-/group-1.94.4.tgz#425a22b6b97affa3e95e07fc65cf1a5b718c3cb9" - integrity sha512-Yot72J9fJhMzixKr+0ON1oE6JETbJ0WK68Rsd8FrzeRW8GRfH4FzSHDDi1HEVbBtZqC7R8jpsxxEQeJtlBWzng== - dependencies: - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" +"@tamagui/avatar@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/avatar/-/avatar-1.105.8.tgz#204d09db17a2f41bf4862d3a52fd33aa328b0f91" + integrity sha512-I0eY9J1JI5f4MpeqOtFwGQz555DeKvkcmP145BnSyHV6fEI8DigzkxXFxrjwIZkcU0KirQaRLyYEYYsfjINR/Q== + dependencies: + "@tamagui/core" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/image" "1.105.8" + "@tamagui/shapes" "1.105.8" + "@tamagui/text" "1.105.8" + +"@tamagui/button@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/button/-/button-1.105.8.tgz#1f652df4f4267549a50cb225609c319f044810f3" + integrity sha512-rHKPKgCtpasEVlZ5Yk+HHOqD8iM1uRDpxXxCcjYO5NDrsMxHMu5Y27HNiBjpIrc5g9eLsB2M0zg5kPTZuFUROg== + dependencies: + "@tamagui/font-size" "1.105.8" + "@tamagui/get-button-sized" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/helpers-tamagui" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/card@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/card/-/card-1.105.8.tgz#3492335b64f9e587a9921226428c0c1b927302fa" + integrity sha512-7Ntu2/NFHl3RGaof7iYRaENO3unDm7ryvL2qXcVYxSm/9JGVUanE3UVvR97DKE88bVtHejVKfZvMnGcBqYIjaw== + dependencies: + "@tamagui/create-context" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/checkbox-headless@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/checkbox-headless/-/checkbox-headless-1.105.8.tgz#3db5bc8660035e695c9fb11cdb4128273bb837fb" + integrity sha512-45iLL3d05IN15D1TIruT3IHxLXcDcZYU9tA0cMDohZ2T7VVnKcyz/67PMdeOSIG5iVDbkdOsCxxiVNNuhPssUw== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/checkbox@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/checkbox/-/checkbox-1.105.8.tgz#7d98d31b5c883a843113ff38729e4fbc8167afd0" + integrity sha512-JTXrkGGE9smSXQzBH4YJB5jHNub36C+ptiMQ4OmYj9nPgWUVyYiRR5O5AkODqmTaX/08mHy5287asg6CS4GbQg== + dependencies: + "@tamagui/checkbox-headless" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/font-size" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/helpers-tamagui" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/collapsible@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/collapsible/-/collapsible-1.105.8.tgz#a5dde4f186384e592a06379fa76996d198beed9d" + integrity sha512-XTQ3TiHu0TItW5dsuNDrYZPP/d9gbnozk647dnYkdasrYANPXeI8CdCSPAjvrJ0x2MCW7vFp28SkRPa/7f8X0w== + dependencies: + "@tamagui/animate-presence" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/collection@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/collection/-/collection-1.105.8.tgz#d945287eec1a7538ca306b8dad03bc8b3e573810" + integrity sha512-jSbxSajYMlJTqVv6tOvZzmwRJhgXctnY73wbKYOTLRj6O275ukaabobQhaa+pMhsYgCrPmRFZglzf3Ho0h4J7A== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/colors@1.105.8", "@tamagui/colors@^1.103.0": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/colors/-/colors-1.105.8.tgz#0485b56e5a679e0a16834b5d4fca54046720ddab" + integrity sha512-hrdEQu1FKO50Al3tUTbxQG1i/I8DemrcIkj6G+sTjxzGrny9q4CbJHsDCUYyGhnkwG5sLOJN3STd/AjXu1v+5A== + +"@tamagui/compose-refs@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/compose-refs/-/compose-refs-1.105.8.tgz#3452cbf92829c41d8a154877d0cd2d1d7e4eeb7b" + integrity sha512-V3+jUvCpP8ewTabWNjhQQ8rF3FoKogKZlg5PxPsYv8MjwGnwVEt9Z0WfFKQoecZOtyxiy3kAXkJTFEcb1AgU4w== + +"@tamagui/config@^1.103.0": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/config/-/config-1.105.8.tgz#058a95573d60cf22e696f3546806fb6b014c7909" + integrity sha512-hsdDH8TBiP5w7lk45sijQ539bLcL9G1PdZozET1a50lqaIMVtgV4hnj6D0a9ERr4ooWNH4Kd59IGuzHCqktdfw== + dependencies: + "@tamagui/animations-css" "1.105.8" + "@tamagui/animations-moti" "1.105.8" + "@tamagui/animations-react-native" "1.105.8" + "@tamagui/colors" "1.105.8" + "@tamagui/font-inter" "1.105.8" + "@tamagui/font-silkscreen" "1.105.8" + "@tamagui/react-native-media-driver" "1.105.8" + "@tamagui/shorthands" "1.105.8" + "@tamagui/themes" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/constants@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/constants/-/constants-1.105.8.tgz#6a691937fb9b1fdda5164a8f3bf613cf6f3e42b4" + integrity sha512-hpZ6eltlbqvPqe9mMFC1uFDa8Yjm0xEXk1bXYuzxUeZpLOQmSlcqmZg/9P4fFzGbS0LexQJ/GnAsxSnSHUySAw== + +"@tamagui/core@1.105.8", "@tamagui/core@^1.103.0": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/core/-/core-1.105.8.tgz#0bc7fb699ea6ce2082188d2d96bb888c1656ea44" + integrity sha512-Aa70LwLGBP+/JrukyHs7p07T+wiNGzN//sWvgAlhUfBCTNJ8Ka7vJk65ZqBLrG6HeFS52eYsahh3CC2z+ISpwg== + dependencies: + "@tamagui/react-native-use-pressable" "1.105.8" + "@tamagui/react-native-use-responder-events" "1.105.8" + "@tamagui/use-event" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/create-context@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/create-context/-/create-context-1.105.8.tgz#96f0a32e324e73bc6f9dff98f4c546c20a5cc01e" + integrity sha512-urjoP3mqMoEOalzAlV6+4LI51lWQX8xbJNLwLvgUaD3HJeqGIy0PenEb5mtn990iho13f1Slte86wOxfyaNFlw== + +"@tamagui/create-theme@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/create-theme/-/create-theme-1.105.8.tgz#3d1b4cbc201fcb93d04731920df3e950e5c3a89e" + integrity sha512-8dmoHAiAbjkCh1qJnTNLB6ct66lmeTa88faFF/eJhm8xc3AFxNxmJysxY0XCwxxQfrdMfhl1X/VYhkVGYy1IRw== + dependencies: + "@tamagui/web" "1.105.8" + +"@tamagui/cubic-bezier-animator@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/cubic-bezier-animator/-/cubic-bezier-animator-1.105.8.tgz#9152f1659f61a3b0829381e7d7c793774ffed8ad" + integrity sha512-Kfp9RckTOsB9EDBjWYppfwD8q8jKKGb0lYaQ3kQs/L1OUkGnSwlzKiGiAU6MkiArgI6eVfqbRFMeaFwNlN0ftA== + +"@tamagui/dialog@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/dialog/-/dialog-1.105.8.tgz#e46b7fb35212162034fabfab31ce0ab484e2bdc4" + integrity sha512-awJZaSNKq5yw2D/B/x6VQ8IAKbcrH6RoTuaEl1GAFLj8Zh88D9iwLh1Iey4+Nt4MiHfMQnhyBvwb9dXm6+dNXw== + dependencies: + "@tamagui/adapt" "1.105.8" + "@tamagui/animate-presence" "1.105.8" + "@tamagui/aria-hidden" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/dismissable" "1.105.8" + "@tamagui/focus-scope" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/popper" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/remove-scroll" "1.105.8" + "@tamagui/sheet" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/dismissable@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/dismissable/-/dismissable-1.105.8.tgz#cab0de4b23e655e29f4ecab18164e25e810a058f" + integrity sha512-MWnsSf3gSPuD3e5YwIzSqJSYnd0yCYlnl2XrcinxuvnQzYLhoyrZRE0Y9D5Ow83r4ib7nINe7C0lXAOoEQw08w== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/use-escape-keydown" "1.105.8" + "@tamagui/use-event" "1.105.8" + +"@tamagui/elements@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/elements/-/elements-1.105.8.tgz#35893ea78b9f0b98c6ebc3fd41a4a3d05e79afab" + integrity sha512-YKXyoj7tBC2XeSvY5YZEgBdMi4VCkCrL3mHWe90+9pTBELM9BcDFwsT/sUyPzNZiq/v8nH+RVR8kZBr9D7zPGw== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/fake-react-native@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/fake-react-native/-/fake-react-native-1.105.8.tgz#1c1c2ac1edd018acd157d6d64e0277548a32fd50" + integrity sha512-RR+DwzPZPHbLf3BxvD/nXU16TTCiNY3D37e0paJn+jmi3pwMMTlWVdNMc6MqPfg/F8DUDjFgKsgvNhb+pSqIrw== + +"@tamagui/floating@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/floating/-/floating-1.105.8.tgz#2aa1d9a1aa67e2f28be1892af1ac791a17aca5cd" + integrity sha512-CiqlwNHKnJlDlp/8AdehaKEHP5IDB6/1UeNnPPmox1dlQooOkDVTSUmUvyxOC9MD05tCIyvknRRoGxBOz3JjPg== + dependencies: + "@floating-ui/react-dom" "^2.1.0" + "@floating-ui/react-native" "^0.10.6" + +"@tamagui/focus-scope@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/focus-scope/-/focus-scope-1.105.8.tgz#8f094fe628ef634732ecace0740b8fc9b23b268a" + integrity sha512-6hRPsxiI5Og2mGJpEC50e0VX0pbrgJnei+PeWBgkzJwMOelIBam5PIwzuHRmblk2hA50OnxDTO0rhi0Ei6/SvA== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/use-event" "1.105.8" + +"@tamagui/focusable@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/focusable/-/focusable-1.105.8.tgz#3fe531ffc55e56433777c10493876f825ca642b5" + integrity sha512-VZ2v9tSQey6UQ9SiUVc0RXFMXPEOwXBIpDs74ph+dDFq3EvlRvaktus+yAP9UnPl9FbPzvVwCueftbLtxYLjSA== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/font-inter@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/font-inter/-/font-inter-1.105.8.tgz#8fc94b1080bfdab0744db030a9db335784a5bb71" + integrity sha512-WfXmzpJanDF8GCLklF/W4z1bhBkoezUqYcq+Eq/RhVgc2onPwy4IUaB+px7owuNmROktlUJSqiTjyUFPSdVC0A== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/font-silkscreen@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/font-silkscreen/-/font-silkscreen-1.105.8.tgz#c6c24823df3294edec66ad723610371cef1dd9ed" + integrity sha512-r8YVgF/e7Rumt3qoN2XYGvE3JYyjJ5GTHZLenQUtBJp1AiYT2jwOtb3toxQLX/2oamj0og3gLfSQiclAkAgbJA== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/font-size@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/font-size/-/font-size-1.105.8.tgz#74194d85c4a1bc1407b4ce3a804840d20d8c1887" + integrity sha512-EqhdHp+XwJyb20mmv2nlWKPeBdBsO9YFj8/YSIQv8rIOqj4FkMlqc7HddHRtZAzN95Alhy7LsQBGM9aHRpgRZg== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/form@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/form/-/form-1.105.8.tgz#71ad7bdc6ba2aa75254c2bdd0ef0553c2a631d89" + integrity sha512-zJU3Ph3fc+mlVkDewhCGTjId7WlS5yemZpi5Udhtp8spIFCiaXoPwy3UXfaZj4bnTCYoXOuVxf6MfUpA+qrGKw== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/get-button-sized" "1.105.8" + "@tamagui/get-font-sized" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/text" "1.105.8" + +"@tamagui/get-button-sized@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/get-button-sized/-/get-button-sized-1.105.8.tgz#e61c193353d8419fc7ccba70e834a8f178aabbf4" + integrity sha512-/mok9MKVjlVbmylw5rWqX7evNcBm2M3I/RP5whC3g3f1ucW6TAWgpazs3ObDfhsjZMTBPrlo0xyI53jZsAro0w== + dependencies: + "@tamagui/get-token" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/get-font-sized@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/get-font-sized/-/get-font-sized-1.105.8.tgz#77f23d2e3065abeea4298ecd2bac4273d0abbc0b" + integrity sha512-mfUtdOnsLcdKFO5jLeXxMDrvoIC8XfSOidLsg3vMNVuNDiEaXxDwkos2Pjfh4s18LYuA3UBpxOOOPvFsLJOH+w== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/get-token@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/get-token/-/get-token-1.105.8.tgz#c2b872d35a91f6cb6f9f17c755cabd76bf3d4a28" + integrity sha512-/H3S+mSyqp+OXjrWKyEwMAR2EBBb0PQzms0yovg4SlrfFiD3X+88ux0/YZh2XOxsHJwaw6mHhWCMDABbCJH3aQ== + dependencies: + "@tamagui/web" "1.105.8" + +"@tamagui/group@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/group/-/group-1.105.8.tgz#76166d7c38bd9a01df38125851e352315cc9c30c" + integrity sha512-/YUmqwhNkld2z5C02w1TyO2AZc0tDzNX6DuJT4cSXbhuWfkQPmQLcNgIVmBPBu0op7XwXXd3VLKmlEZX4bkIJA== + dependencies: + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" reforest "^0.13.0" -"@tamagui/helpers-icon@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/helpers-icon/-/helpers-icon-1.94.4.tgz#2f77916ddd540a9efa52c43d802850f56fa44a8e" - integrity sha512-PqDZiNsuAsgiBAsdCVpH/16EAm0YCfRgayyOIk2dGM5Fz00OQj1nxvt/sCBUaQXlzE4RfzMWO0tl3X+E1t00/A== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/helpers-tamagui@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/helpers-tamagui/-/helpers-tamagui-1.94.4.tgz#0dac25a25985506b815ba28b9b4108d71bc51372" - integrity sha512-ShJSBdIVFS22KsH+GGOZMxkhZcfJ2otUoLk+OATx+aP2rP+0SxWYSme23jwIXSH81hv0aa60/qRM2D//IPmDzg== - dependencies: - "@tamagui/helpers" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/helpers@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/helpers/-/helpers-1.94.4.tgz#a978155a88aeb71dc7a3ec4d6e406c2be335dc8c" - integrity sha512-xXEZSYcScxOHZgkXf7hJQ6jsmhyxMlwBVJN76sD/hBpi3H/XSTGHDYD/PSJUIr4ZclHv8RLblKZxdAqLGT4MOw== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/simple-hash" "1.94.4" - -"@tamagui/image@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/image/-/image-1.94.4.tgz#37f8397f8793e09dc69623e5353c90f6ac213e9e" - integrity sha512-E0DgGN8LgByH07ebVeytjf2u+6y0gR2nOwM7IWE6g9alACeWR18HZMWzjlSF5DSKfw79KI6sv2yBHb3tyaed9A== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - -"@tamagui/label@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/label/-/label-1.94.4.tgz#738be1cd612f3b01da5a3f83309613ec47a33091" - integrity sha512-YaNSttChJseuWsa4PZaTE/cysks9RWMGi4oyMvHUaRVs/bvgMaOazTPQrI7C6W98lKxUlCGangTckPJyUvh9zA== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/get-button-sized" "1.94.4" - "@tamagui/get-font-sized" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/linear-gradient@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/linear-gradient/-/linear-gradient-1.94.4.tgz#ac33b9898e32e368ea5beb38292a0387754c57cf" - integrity sha512-oEDOg8ep+lE7N4YAFi1qJFxHF6yBW5vmhVi9M9Smb1UxW0gA46uOedUHsMhZdfVRLW55rvIf5HAyBrXigsgBHA== - dependencies: - "@tamagui/core" "1.94.4" - "@tamagui/stacks" "1.94.4" - -"@tamagui/list-item@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/list-item/-/list-item-1.94.4.tgz#e3fffbe9d3df3470dfe545bde12b211aa5f280e4" - integrity sha512-qXGhg8PE+oHdk37Pv+accdkYFthrAtR0VEbwzxpMZK+wvI/A24fy5F+ZrM+7SDkW018pqKt0P4ATdiMOti3+/g== - dependencies: - "@tamagui/font-size" "1.94.4" - "@tamagui/get-font-sized" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/helpers-tamagui" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/lucide-icons@^1.94.3": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/lucide-icons/-/lucide-icons-1.94.4.tgz#b9766e14d9df907ec5f777c0aa5a907dce1aaceb" - integrity sha512-qj2dWbU0Kh2qgbNt2NBcy8uLndbscx7m/Qs0XIa/vwygy0+B/2ECNClO1wV5xo91vE3dvKsojXaW0CVSHcHlmA== - dependencies: - "@tamagui/core" "1.94.4" - "@tamagui/helpers-icon" "1.94.4" - -"@tamagui/normalize-css-color@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/normalize-css-color/-/normalize-css-color-1.94.4.tgz#5ca47d3d4b0e89c3062ab88f3bfe0087c5366b38" - integrity sha512-KnJQ5RDMwYyuMvSPz0sk/9XQctqHT8Zr0AC2gfUZu8Ia3Xq6I7YZAQgZ119UFLOlHsM85pYAAdbuIgr8rAIPxQ== +"@tamagui/helpers-icon@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/helpers-icon/-/helpers-icon-1.105.8.tgz#91ef4e7082daf3b787eefbc8f7949fa15a26835a" + integrity sha512-sayuTRTiLUAu7IqsGy1q+ahf7I58e9HJtqcnz9uYEzlaQBbw56KpSbHAuC3zlkcQflQpYe+dNBVhwhT5hXvC9w== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/helpers-tamagui@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/helpers-tamagui/-/helpers-tamagui-1.105.8.tgz#d2c0b032d01af716392c0aa5e7889c638ea79ee1" + integrity sha512-9L4Lv/ymAOKMSQW3aISDWNmr61nu/82aeNQRTmjCH7nbJU21B3IUGaQwfQv5+NVH+tanVRvBKBLIUAD7dCPXNQ== + dependencies: + "@tamagui/helpers" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/helpers@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/helpers/-/helpers-1.105.8.tgz#70922ceda3d1fe5c8e15bfa3244579edb913442a" + integrity sha512-M2r+FITauctiBfi0IruZtQ67JZweIMr/uyIKN1bXlqf6QBfzKr0dnm0KqX4VrqlZzPgHp3VzuiCvoBPeYiJUlw== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/simple-hash" "1.105.8" + +"@tamagui/image@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/image/-/image-1.105.8.tgz#0c9cde74bf2646478525ea41195b1ffad917d85e" + integrity sha512-WOX+NPbEn4eGe086l7eodmW5RCAsO3EsGfl11bidwcTDnhSZWV5S1ho9LPvuStWImyovUyNANkQeEMeDV/PW8Q== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + +"@tamagui/label@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/label/-/label-1.105.8.tgz#5eb2c4dfe78bbfa925f15bca03088e5f34cf459a" + integrity sha512-TIF5pKsLTglG6DNOhHcztnL0HpwZv7haEN8f8R0PMxSovGy9aHBA1P2WX/DeRiIDw2vGzQVbCHSvCZWIPIGoww== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/get-button-sized" "1.105.8" + "@tamagui/get-font-sized" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/linear-gradient@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/linear-gradient/-/linear-gradient-1.105.8.tgz#b694cc92e9c4509b067032a00ac9ad6521d34805" + integrity sha512-3sRPy3OfbRM4WfFhN1t0IMHO0WCSVftfWYoawcUiboVEkkLljxGto/43irP1YFF3vJKcSLxpF6Kf2Ev2L/FCxQ== + dependencies: + "@tamagui/core" "1.105.8" + "@tamagui/stacks" "1.105.8" + +"@tamagui/list-item@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/list-item/-/list-item-1.105.8.tgz#fb4383686b9844ffd42afef77c40aa275d5937e6" + integrity sha512-rH8gPeCaj9H3IbBre6jlxZdgRXbOsZ9ozHQPumtnpEBJ656YFQM9SeMpRMGbW2H7bd/jvoaWCi4A0soyWJeXcg== + dependencies: + "@tamagui/font-size" "1.105.8" + "@tamagui/get-font-sized" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/helpers-tamagui" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/lucide-icons@^1.103.0": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/lucide-icons/-/lucide-icons-1.105.8.tgz#7ffbaeff537d1d29b2ac839f26fe863b3c64a6f4" + integrity sha512-2F+36oDOSSBOeIK5fLlp/JkwPI05kOM2kHIGowOw6uj5Xrdsw6KVuthUV5d3/HeFkmMLW8QGUYWpi5VlJpyxKg== + dependencies: + "@tamagui/core" "1.105.8" + "@tamagui/helpers-icon" "1.105.8" + +"@tamagui/normalize-css-color@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/normalize-css-color/-/normalize-css-color-1.105.8.tgz#47037ec1d63549bd36a8538f47f7c76cc03587ef" + integrity sha512-x8luXtUgHVCyP02/b3Xd1S/3t7xcFp1yEMrA+D3nabbYafAK6gI00k4KFTJNB2znMcWI0FdLXIYqvhjZhzGyGA== dependencies: "@react-native/normalize-color" "^2.1.0" -"@tamagui/polyfill-dev@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/polyfill-dev/-/polyfill-dev-1.94.4.tgz#aa81f5c74a294789e5ffb405460f623d72fb432d" - integrity sha512-8A/mYxuykQjRs5Hod0BuDdZvkJbgcMB4eoY5V40XLvJ70JfqJ++mRKD+uov2KxGbZluIsG9Ih26qlYcSmPemGQ== - -"@tamagui/popover@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/popover/-/popover-1.94.4.tgz#ca8c31ab31c760c32c77b09856eec5c7f85fe10a" - integrity sha512-FXKLgX5us3p4mSFr2n58tjjMI8xf1XoNQOdjUo1nqTulMW1ShYdGFgQckMLCCYF2vwbNAdGSUuG5IuJmohFKWA== - dependencies: - "@floating-ui/react" "^0.26.6" - "@tamagui/adapt" "1.94.4" - "@tamagui/animate" "1.94.4" - "@tamagui/aria-hidden" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/dismissable" "1.94.4" - "@tamagui/floating" "1.94.4" - "@tamagui/focus-scope" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/popper" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/remove-scroll" "1.94.4" - "@tamagui/scroll-view" "1.94.4" - "@tamagui/sheet" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" +"@tamagui/polyfill-dev@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/polyfill-dev/-/polyfill-dev-1.105.8.tgz#08bc81c198ec7ba7733e466377a408a17fef6b7f" + integrity sha512-37aTa8gRCzsHLvvOk7vL58mJSUNGUfjdCCk0WyRA/MC5B0MWHu0rTGm6ChrCac7+OfAXBBSNMnYrWCs3tiRF6Q== + +"@tamagui/popover@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/popover/-/popover-1.105.8.tgz#d1c834c9797fcaabb9e6a253302f2cf133db3c97" + integrity sha512-xoVrjb8ZHb53TwVWOXkajb4mIDOSy4Vj6nBJRkdm4BoCSJQKiIM6fz4c9ZDMwACaWjStrASOvtk/PZzchLgMdA== + dependencies: + "@floating-ui/react" "^0.26.16" + "@tamagui/adapt" "1.105.8" + "@tamagui/animate" "1.105.8" + "@tamagui/aria-hidden" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/dismissable" "1.105.8" + "@tamagui/floating" "1.105.8" + "@tamagui/focus-scope" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/popper" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/remove-scroll" "1.105.8" + "@tamagui/scroll-view" "1.105.8" + "@tamagui/sheet" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" react-freeze "^1.0.3" -"@tamagui/popper@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/popper/-/popper-1.94.4.tgz#7bcf1a77013f757267557290abdab3791b82eeb5" - integrity sha512-MRpKQUs49W2uo/Eq0IPvRJ/QeVyBEJz06hK0kow0zFGCHAx7Ht/HmuAK2cbHz9CX15TwT/vxVEtUix399lyeUA== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/floating" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/portal@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/portal/-/portal-1.94.4.tgz#7c9d3f837a4bea6456bd299181ac86455ea0fd84" - integrity sha512-EXg4BJiGPVJnN3Xze8B61LKXu1qiEtL59h8VJjr4EwGM1WOJ04AoFYKRKYdsHO4Z16ZPYjmdOzv0SoW1Kdbn1w== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-event" "1.94.4" - -"@tamagui/progress@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/progress/-/progress-1.94.4.tgz#9fe335f79ebce4f8764897af9908095e86e13b7b" - integrity sha512-fjaU0WCysNhOQNcCfJuoKU6e3S3DNFBYIUV5cOk771GcX3vmqz+cPT67vO/7NxhWAaxtEOaavesBJul2extiXg== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/stacks" "1.94.4" - -"@tamagui/radio-group@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/radio-group/-/radio-group-1.94.4.tgz#eb7907f3e7579a5c8dcef4263ac958f4171f9a30" - integrity sha512-Kt5HESzoubqI//qyR/Tuj0v0Ir0b4EcfptrycfUXJSrNs29uLLz23INMGBIkaXiy9Jsnhr+x6qpJltiYYnDz8A== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/label" "1.94.4" - "@tamagui/roving-focus" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-previous" "1.94.4" - -"@tamagui/react-native-media-driver@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/react-native-media-driver/-/react-native-media-driver-1.94.4.tgz#07b4c5a910eb4557b345095e24f3480625c1a23a" - integrity sha512-3NhW2Y/IwZfnld/9BuKHHL1p6Lz9Hq6Knz+JbgCJsl2aqpTNfOW0ULmOMWyj1p6xYXwI3lM77DARFat0SFz37Q== - dependencies: - "@tamagui/web" "1.94.4" - -"@tamagui/react-native-use-pressable@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.94.4.tgz#a238c66d80bad3322d316e84587e62b2228c6eb6" - integrity sha512-53Z3VuTvkJpNWGdSgmPadnFll4ukU3uh6p25tuxqUXH1m+tiqRBf/Qh/s1D+cYmf4Zauy6XGecRKr9bcugrGSg== - -"@tamagui/react-native-use-responder-events@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/react-native-use-responder-events/-/react-native-use-responder-events-1.94.4.tgz#0779b0ced0dfef6fbb50646e3696e2610bf2800b" - integrity sha512-IhDR5BuS27iv1o3Smwrw/3TjmJMdDNH6JvbK2lpi2bMTzE60UuqZ6w91gm36ARl+WURhxzgWKFKsO8CJht1+LQ== - -"@tamagui/remove-scroll@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/remove-scroll/-/remove-scroll-1.94.4.tgz#20e89dabf9c85c703f4396b85d9db415cae4321a" - integrity sha512-TUd4EHO7ZNsHl/96AT2mzIXW1wTDjZ7TfFNiAMaFf5i33f5bbeSkU6PPBkh35t1engqfJI8io/X2pnbhHivD5g== +"@tamagui/popper@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/popper/-/popper-1.105.8.tgz#1e957dcc3d4478dfcf3ce7deb03759440020cab5" + integrity sha512-pE/HOi5sldd1rGoqWtrB1IrmjAEGycoAN5enICKYilh8wHw7WVue/08R7pV7bFUbAjwKCBxiuSsQnO0dbbDspQ== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/floating" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/portal@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/portal/-/portal-1.105.8.tgz#965ec39f2f8edba57940ccfd3dda2b0b7b6d3661" + integrity sha512-4T4KpffG0x0yGjmfoFTkRSZDElXV+qO953rpM+VhSoQxhQD+MtWKaEp5y/2tz96DS78JfM9cN6nJIqP2HycW/A== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-did-finish-ssr" "1.105.8" + "@tamagui/use-event" "1.105.8" + +"@tamagui/progress@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/progress/-/progress-1.105.8.tgz#94ab09aced10601c592b40830794027ed2a6f8b4" + integrity sha512-2No/xMW/XKO1u7RC+91jt03+mNgI12h+BCOFymXnHQJngI4xLvakEY8KvTTj4WwwabeSTpdKTL3MPlpTlRhgQA== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/stacks" "1.105.8" + +"@tamagui/radio-group@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/radio-group/-/radio-group-1.105.8.tgz#c28d702b647e36548cff5ec4f4139b169fe49972" + integrity sha512-ISJu2O8UmJR/X7DEgWnTa2ZaWfGoKNKe/v4hLtsyuN53fobxi2rWVjOl2NmR5LQ+PHVzW10zqiUBVIysa1DAlg== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/radio-headless" "1.105.8" + "@tamagui/roving-focus" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/radio-headless@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/radio-headless/-/radio-headless-1.105.8.tgz#abf8cad21fedc420255dcb9e6fcd797999ed92f5" + integrity sha512-qTF1risi3Iybk7VlOkStc/m62ytfkBO+bzgWtow/JGzOIuE/0w+A1S2tdKXbxYUB/UdZl8WoAMheNMotyUCIEw== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/react-native-media-driver@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/react-native-media-driver/-/react-native-media-driver-1.105.8.tgz#f9689d234e7e639a46331f0a6ef96fcd4732d39f" + integrity sha512-VKUeT4O1Ds0THW+fAKGXcbXboNE/CyKxo3wkPf0hDZ1tyCX8LpPuxfXCB1ocn5rtafEbxYe62JiiUjWOJ91jtg== + dependencies: + "@tamagui/web" "1.105.8" + +"@tamagui/react-native-use-pressable@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.105.8.tgz#59b8a954978e05347015a10f0851ec7c60337014" + integrity sha512-gWW6vznbvrUfbwNYzHg3Wnu4Ypkmh1hXAUU4NbnEql/ZxHL8iDUh+AdLnFX5JyttNIFvWHrina0cdeN28lVVlw== + +"@tamagui/react-native-use-responder-events@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/react-native-use-responder-events/-/react-native-use-responder-events-1.105.8.tgz#b671b858ff2e03a66f1503d214256b258ed8bb9e" + integrity sha512-5MQW78mpmP3Vuk53XA/vS7CJOuyEOc5iUo9FtnGlgl7uyJxr3yZ+x8NH0DT87CxVoYdn/d6q2WKmgtObvPBBKw== + +"@tamagui/remove-scroll@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/remove-scroll/-/remove-scroll-1.105.8.tgz#3dc8c2c9c9df8bcbc3ef425bb4053d8786ff6188" + integrity sha512-PqAgv3D8Y33DQ5tlf+JE+SiCqlgLVJbCWZ6ODmpAN5az6TQkqGqt9QRsw1mnlzP3xgAAchEvQxziVQk1fP6LnA== dependencies: react-remove-scroll "2.5.5" -"@tamagui/roving-focus@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/roving-focus/-/roving-focus-1.94.4.tgz#b01c7435a6e54fe9d3ac60642c9b8c607c087d28" - integrity sha512-QGx42u7pktmcJdWNWL2EddvoNPPL0KPKiKJaco0P2NJgLUnvi8y38VSpZI+yRgME74giH8XdutTBcPFXEl4Kag== - dependencies: - "@tamagui/collection" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-direction" "1.94.4" - "@tamagui/use-event" "1.94.4" - -"@tamagui/scroll-view@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/scroll-view/-/scroll-view-1.94.4.tgz#c7b7e6a62afe4b18302c493feeea9c87e433a242" - integrity sha512-1OJ8aT033rvsX8KoTXrlZQdXe70oTB5JZjj+m3fETt2XkefbZK/D5lSm1ppud8S8d/dCQZ1JAtomefcM9CQS4g== - dependencies: - "@tamagui/stacks" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/select@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/select/-/select-1.94.4.tgz#66ba32fdd8e5177b38f14c4a3f7a7a0a1ac4180f" - integrity sha512-mxsTkxHQeSOMYXdd1V+oMIe/jXPf5KsRhYz5IJHuzJcmPhPsKtClRcXg7vun+MpGix7d7PIGP6sDZIB1BKsieA== - dependencies: - "@floating-ui/react" "^0.26.6" - "@floating-ui/react-dom" "^2.0.6" - "@floating-ui/react-native" "^0.10.3" - "@tamagui/adapt" "1.94.4" - "@tamagui/animate-presence" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/dismissable" "1.94.4" - "@tamagui/focus-scope" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/list-item" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/remove-scroll" "1.94.4" - "@tamagui/separator" "1.94.4" - "@tamagui/sheet" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-debounce" "1.94.4" - "@tamagui/use-event" "1.94.4" - "@tamagui/use-previous" "1.94.4" - react-dom "^18.2.0" - -"@tamagui/separator@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/separator/-/separator-1.94.4.tgz#905dd74d72eb16451bad664ae6e1ff94e81fa958" - integrity sha512-0mqwS4cSFWIutmsXDQBgzowxYzhSXeS8fOpcirMwk9+jcPfe+uZfjf2Im67Wcv6xJH3Z8d0MVFp5D4sFu6sOew== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - -"@tamagui/shapes@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/shapes/-/shapes-1.94.4.tgz#2d0c980f3341ca2e86d7a03d547c9cc3a7a59a5e" - integrity sha512-bAf1zALtrvsGQQicEbe5jvGXM1vtylM6ZoQebnG6tQzWZECWWNlxzIQkdHGCTj7/sgJNpW+9mKsoF4GzxhjZFg== - dependencies: - "@tamagui/stacks" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/sheet@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/sheet/-/sheet-1.94.4.tgz#4e9d8f20d9d38c7c5b045e733449d9a9708fa2fc" - integrity sha512-/T+woQZCSMfKZmNw5XbUKAJzGgxHWpbv+PB7KwwRSHfvqjKDyUoW8EgrHVb0E//vRgMQ1CckSUiDxlXGgXDA2A== - dependencies: - "@tamagui/animate-presence" "1.94.4" - "@tamagui/animations-react-native" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/remove-scroll" "1.94.4" - "@tamagui/scroll-view" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-constant" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-keyboard-visible" "1.94.4" - -"@tamagui/shorthands@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/shorthands/-/shorthands-1.94.4.tgz#1b9b7750a4f6c97b254846a51ab71a65f46482d7" - integrity sha512-fIi+XcHRtsw3oHDC9wa0DWECPTQXsEdZvqxXjWN6GDndhl9j1rBxgf0hrYzTRmoFdwJVRMbNkbmNVslcZSGwPw== - -"@tamagui/simple-hash@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/simple-hash/-/simple-hash-1.94.4.tgz#eb333da740b1260354425ab6780c1385e6ffecdf" - integrity sha512-Qqu328+cbsJhZqYcjN6udyi1LBITKSBrkV24o2Iz0HdE+LrpBK3lsTEZd58Uj94vAJ+Jf3AgizSKfTXEsNR4Uw== - -"@tamagui/slider@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/slider/-/slider-1.94.4.tgz#7433c57c8c1fb400d08a91862aed8f8b654f40e0" - integrity sha512-q3oWHT5GfZ04uE46im1+iY0nkVyCBDE0TDLB/0BXvhpUk+l5XUhHDDbIi3TV8uZeTXRkEXvDC4nQnJltj7bpZA== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-direction" "1.94.4" - -"@tamagui/stacks@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/stacks/-/stacks-1.94.4.tgz#e3e23b4db0f3bab8d09b7880f7f4cc375136f6aa" - integrity sha512-Fap4xRSU0D3JuLWzO5fsJOWP6iRs04pLffVbjyKKKMOmkY3zl9YkPDW1TZl3a/fnSXuEBRJF1Z7HBb5eD7007w== - dependencies: - "@tamagui/core" "1.94.4" - -"@tamagui/switch-headless@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/switch-headless/-/switch-headless-1.94.4.tgz#432c78dedb6998a6700cd23b7923c9e61ca463d3" - integrity sha512-vjaOkLnuRx5WyYgVv4Dqj+nuJyzj4XQD2ozvCiQbf2ay+XB+nk2qFbzA3zkE7SxK0dhrwf3lactk8r4azkR0Gw== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/label" "1.94.4" - "@tamagui/use-previous" "1.94.4" - -"@tamagui/switch@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/switch/-/switch-1.94.4.tgz#3c6bd407eb1d9afcc566287a9d559d37e7ff2958" - integrity sha512-+5Oi8fFUji0q1fJ0XTBP0IAgUIaKMylkuyh5Fenbvza/llcwGedQ9mXb0vMlrHweehdq75LkUbMWe7a4Ea5SUw== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/label" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/switch-headless" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-previous" "1.94.4" - -"@tamagui/tabs@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/tabs/-/tabs-1.94.4.tgz#bab8747909dd0e035d1d90e81355b6d8abce46f5" - integrity sha512-alyNFEKRs7eu9ghBD5UvWfEwc9XLdK/WytCaUVLyUimo85RiySKjOMWObnHn9t1/UcENt7Pi0CfmJMYsvEGsQg== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/get-button-sized" "1.94.4" - "@tamagui/group" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/roving-focus" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-direction" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/text@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/text/-/text-1.94.4.tgz#19228cbe9b17367e22eb91862e16d7ea359cc523" - integrity sha512-QThQQ3gl9QCVgce2ukA7IG46cvOsFoNGswwlf/NcXz+dRRfvkJcKrD9drgZPlb8M989Iom6FrLOtCk2WlvDdUw== - dependencies: - "@tamagui/get-font-sized" "1.94.4" - "@tamagui/helpers-tamagui" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/theme-builder@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/theme-builder/-/theme-builder-1.94.4.tgz#d53a9c393cff53e99174fe536b795e12c0e0ec5d" - integrity sha512-3j8302V3YJyGR4NXn0DGIDzVL9SxihgOL5Ii9lKkqCA/R8s5iMHPmMdYeX4lDtEycB3ua7NRhI4oTaTk96EerA== - dependencies: - "@tamagui/create-theme" "1.94.4" +"@tamagui/roving-focus@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/roving-focus/-/roving-focus-1.105.8.tgz#660ae2aac474e2017e8be89de15674ac1a47b5b7" + integrity sha512-GWBIWSXgl6HMP2pSEAb1IfM60Vr3w3ErkJ/hgdrsq11/GhwDeViPLnDYUykZXGFSqVlQ2j4GSSjOAbe1lOpKYA== + dependencies: + "@tamagui/collection" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-direction" "1.105.8" + "@tamagui/use-event" "1.105.8" + +"@tamagui/scroll-view@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/scroll-view/-/scroll-view-1.105.8.tgz#4e5a8a7ab04bac31fc7b40db01cd0f0b1c5539bc" + integrity sha512-9iM/yprEnMAJB24BpJacPMAXU4QSqhErLO2w3CKNzT5HahC5U4HWUv9jAxSwyxi69X+1mIfsc3gf2uDKE+82LA== + dependencies: + "@tamagui/stacks" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/select@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/select/-/select-1.105.8.tgz#bd79d09166762bde196659336d65a9c6621cec77" + integrity sha512-2eddxbOQrd2CUT32dtGj6s1u2ugnYMc2KaktXbnqqGu/KFqz9t6g8ljaE2rW6CV6Rrk/JZyhKBo5EyG7MkugCg== + dependencies: + "@floating-ui/react" "^0.26.16" + "@floating-ui/react-dom" "^2.1.0" + "@floating-ui/react-native" "^0.10.6" + "@tamagui/adapt" "1.105.8" + "@tamagui/animate-presence" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/dismissable" "1.105.8" + "@tamagui/focus-scope" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/list-item" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/remove-scroll" "1.105.8" + "@tamagui/separator" "1.105.8" + "@tamagui/sheet" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-debounce" "1.105.8" + "@tamagui/use-event" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/separator@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/separator/-/separator-1.105.8.tgz#c4d00f347e8c2694238d1dd2aca55f6404e79d99" + integrity sha512-sP750gn4y6lDEhIf49n1rPBWeHsDNyExI1pP+nbFV84HnTK/dH7qYqLMiY2zvDL0t/+PEK4j8WBtBtvxcKY6uA== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + +"@tamagui/shapes@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/shapes/-/shapes-1.105.8.tgz#0fffcd5ec3d99b86d6db1d09955ab63e91d3b8de" + integrity sha512-hsurJ/8bh28vGgspw5ojp6XsHb+7w2x0hSt43Cg2PgTnaWz16gtZf2dv0/i8FNQHR5qLEe6h12h3G/BOHq2ADQ== + dependencies: + "@tamagui/stacks" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/sheet@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/sheet/-/sheet-1.105.8.tgz#0b0d89c7786788f0aa51bc6e6def03fd828bb80a" + integrity sha512-S3XDwKkXeXjEXXnnvXSkwkRHRMkYN3diD3SrlqIJk0DsX3w5/3xizgoL56FYPwktmZPBAlJz4j0VImMOU+kTAw== + dependencies: + "@tamagui/animate-presence" "1.105.8" + "@tamagui/animations-react-native" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/remove-scroll" "1.105.8" + "@tamagui/scroll-view" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-constant" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-keyboard-visible" "1.105.8" + +"@tamagui/shorthands@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/shorthands/-/shorthands-1.105.8.tgz#ec30d6ef86683783043105f7fcd651357808b6e8" + integrity sha512-lKkj7MHZI2ieBr8jjgGURkWwIkC89UHSo/m5sePEdapocS6YfztHrLMwA8Cjp6M9saKuwsDFJESDUs1diIEN5w== + +"@tamagui/simple-hash@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/simple-hash/-/simple-hash-1.105.8.tgz#f88d28510f679e5f7f16db561bef33184d44119c" + integrity sha512-Rjid+ta6dM+D6cKadWKG0TK9jW7VCAYUCRouEj0sk5Ql4jRZ8kb0FEuVST/mDDGsqPoRGhd2fvrhgCsIgDKA2w== + +"@tamagui/slider@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/slider/-/slider-1.105.8.tgz#858da835a148ce8677b48580b46d9381c636c42f" + integrity sha512-xuotlg9Qnh1Go006Y6wll6l/0sMaPDWIzWQu518K593HrGpHqacDININ9X0Gj4VhVzO6Frhqi8BtIIkn4dqvMg== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-debounce" "1.105.8" + "@tamagui/use-direction" "1.105.8" + +"@tamagui/stacks@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/stacks/-/stacks-1.105.8.tgz#39b6131481905e9019841a4aee8a2f20508fbdee" + integrity sha512-gE8kTE1eP65kF/rSERYW3OBknpSiJ5SxlN7rB0P6PVruUpK2/dEMEm6dx0Pq7p1Kvxzjq1cVfRvbdnvSRlvrsg== + dependencies: + "@tamagui/core" "1.105.8" + +"@tamagui/switch-headless@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/switch-headless/-/switch-headless-1.105.8.tgz#7572c83db227519c188a62fc98ad8073a66c7985" + integrity sha512-BXCOd1VUd5BQMt35DrsQRDyoZo6F2toxX5BeppNvcnofjDLaSoltKBIdE94Fv4/p/VNfB+8nMKDTW7czkDOmdg== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/switch@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/switch/-/switch-1.105.8.tgz#0efaca635824120c263454a2fa6765e026680c70" + integrity sha512-pD0dc2AwvPHbJ/4Q1REWci15tbexBh0WT6WT70g7oagxalf398dU2rBQ0EXK/YfedLYVgKSFLOOrTgZewrAfHw== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/switch-headless" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-previous" "1.105.8" + +"@tamagui/tabs@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/tabs/-/tabs-1.105.8.tgz#b249865d9eb97f88125c5e65211e6161a4951ad0" + integrity sha512-vogoQJ9TjcUdqK5rbhkRXNZPBKOL1yXsMFMNYSIHp+5JdjgDpkxBfEb6UH3t0tBCy0bqDep9EWs0kCw8EboUjw== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/get-button-sized" "1.105.8" + "@tamagui/group" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/roving-focus" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-direction" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/text@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/text/-/text-1.105.8.tgz#ba8bcd2b8ffcbdc851d016d07c88cac7085803f4" + integrity sha512-j61zBt8jeI2ZqFYKimAsH0TG1LvLP+AjnDNFe5ZSzijUHx3m3X0XuGFH2rACTGNx9J6q6FNjWortftqDNgULWw== + dependencies: + "@tamagui/get-font-sized" "1.105.8" + "@tamagui/helpers-tamagui" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/theme-builder@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/theme-builder/-/theme-builder-1.105.8.tgz#f6900ecb2456481d246ce65252ca1804ff21883f" + integrity sha512-G2I0te6v98WThr4L1/uIjJPQCAPdfvB/h/HxMkRW49fhCDZzwmVOrh04eJD2q2YdweGSnTGnYv80KA0nW+u2CA== + dependencies: + "@tamagui/create-theme" "1.105.8" color2k "^2.0.2" -"@tamagui/theme@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/theme/-/theme-1.94.4.tgz#297ce7c40460af7b91b785c553562c17aa79e21e" - integrity sha512-o8cGu5FGaGEirO+BZBrbYj+EUG76biFJs9V06MKN3AOumNu3LxyxnE4GbsGRQWgwmba5wmtMe2hmt48Bkdxq0Q== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/themes@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/themes/-/themes-1.94.4.tgz#03582b0b6caa7d5841029028162d18b89eaecd5c" - integrity sha512-SmU63rmMJY98hc8M+XWRGHmrDYvhzdlQXbfZHho7VAwgWn3DKXYFh4+mm+mx6uB1uPV90QZtqNhpqe10NFrPnQ== - dependencies: - "@tamagui/colors" "1.94.4" - "@tamagui/create-theme" "1.94.4" - "@tamagui/theme-builder" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/timer@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/timer/-/timer-1.94.4.tgz#06ad3610f005eaa4e750acc4810b499aff870890" - integrity sha512-r0WBao1o1ZZfCmV5eeMnAb9vZXv8wJblc54xmOv34TrB4vjbs2xhcjpACaJGBpk3WXDWUk/E0y1pu97NFFOzZw== - -"@tamagui/toast@^1.94.3": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/toast/-/toast-1.94.4.tgz#010b9c6d20fc48a1e016837df453a6bc1c54eea1" - integrity sha512-pAcYXidVV1tFbIM83Ddm2or+ZJKkR6bN3JGvV+KioTdD5m4fmrOgRW/TZeXhxMnRExaeXNdDB/3LuffJoubyVw== - dependencies: - "@tamagui/animate-presence" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/dismissable" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/visually-hidden" "1.94.4" - -"@tamagui/toggle-group@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/toggle-group/-/toggle-group-1.94.4.tgz#1ee9ce0cf42c086c94caca27cafe4ac0183d72d5" - integrity sha512-cUbJAXauuxCTiIds03t5l4/mj6AUTFfFmFHQJhwChQdGoLr9tf//A/62ZhnnkvX8QbMeAaL57PzGdRQoys39LA== - dependencies: - "@tamagui/constants" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/font-size" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/group" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/helpers-tamagui" "1.94.4" - "@tamagui/roving-focus" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-direction" "1.94.4" - "@tamagui/web" "1.94.4" - -"@tamagui/tooltip@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/tooltip/-/tooltip-1.94.4.tgz#4cae431625c5a2851733f45d1318f28560850302" - integrity sha512-4bU1nd7tMAduYmr5R/X//lUcFeRZIO0Nzn+TNYnqvltWmYnD7AQ3jeEjIVwkylIWP4CSPmrRxh3AP4Aiypum5A== - dependencies: - "@floating-ui/react" "^0.26.6" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/floating" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/popover" "1.94.4" - "@tamagui/popper" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - -"@tamagui/types@1.94.4", "@tamagui/types@^1.94.3": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/types/-/types-1.94.4.tgz#45554513118fc444140c3d6e883ee17ab92b1f24" - integrity sha512-AH63lHsk2yo95RWWURP8CQxckOxvGW9VQnflKZxv6+7oNafM2473GT+cfWNjtqLXO4o1hGk8ukOuLjU3POEazA== - -"@tamagui/use-callback-ref@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-callback-ref/-/use-callback-ref-1.94.4.tgz#24b5beadafb7fabae08bc073566727a132f78d31" - integrity sha512-9oDXeFFvl3OWBJZA1Wfj8Pl8UBwLQBUOIsLgSdSE9/G7nmVEh1Lkx2CPDvuB9Cw+oxEz00/ww0+IOCOus2mPYA== - -"@tamagui/use-constant@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-constant/-/use-constant-1.94.4.tgz#370789317b0206b17e5849e305eb5ed1c5f0d129" - integrity sha512-nXq7QojhFKtd9cpRHe6Spsj1qut5OX4XczBWjoXFqtQYRW/3bZ1KYBvF89xVfZ+ih5qyPJLgP/mlJIY9ufeOSw== - -"@tamagui/use-controllable-state@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-controllable-state/-/use-controllable-state-1.94.4.tgz#ab2535c7a6ede900849f718a914fd384c981130d" - integrity sha512-aV6Gv/oODcNogfaKLbDpEYATxqOWIy/6wS0PM274MANSOimtPH5iy/cA8hSSXBpOMjc+g49/Qsgpn98l9dUnrw== - dependencies: - "@tamagui/use-event" "1.94.4" - -"@tamagui/use-debounce@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-debounce/-/use-debounce-1.94.4.tgz#97d369f49340586b63347d13da3c206459ad6427" - integrity sha512-uXlUsIhTWXvM7lq4UR1h+cuMYG55RjovBEyGtyYqVvVBd47S9WS0DIuFoBeVnViU8VQINGmOg6ZmKMpkLSHO/Q== - -"@tamagui/use-did-finish-ssr@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-did-finish-ssr/-/use-did-finish-ssr-1.94.4.tgz#89fa3b7eb27f74b19e0a209cdb413c340ecce309" - integrity sha512-W5dGG8qkgANIaaCT5tmS90sTFmb2gcNsf56Xf/+6GTzrzPqlgZXAylc8mqBHMxDPUYJDmZBy8v7VS1qcgM0bdA== - dependencies: - "@tamagui/constants" "1.94.4" - -"@tamagui/use-direction@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-direction/-/use-direction-1.94.4.tgz#dcc63c5e2b23d800c5b1325e51b78a9fce0e6141" - integrity sha512-vYf8d3nBS07tkd4jZlsN00ZHrj0SPsfDgs1qjD8icVVufBId2yf0eEkGjR2IdFcsrnLA6P4qm6M5logyQ7GM+w== - -"@tamagui/use-escape-keydown@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-escape-keydown/-/use-escape-keydown-1.94.4.tgz#a210a6f2dbbc733f407d770948692fa1398a1815" - integrity sha512-UTqEBrWt05bh9MulDS4tHiL9TP0WpThvhQUN1wG/FxF+EvK52DjdA3I3B7Upg+e5JO957/j9UrLOS+5NEdGcgQ== - dependencies: - "@tamagui/use-callback-ref" "1.94.4" - -"@tamagui/use-event@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-event/-/use-event-1.94.4.tgz#16456c3fb071ed0b931539ac1e8dfea2a420676f" - integrity sha512-FwMNNmNy2AEmclcmz+4+8Z0C4POO6SNL/W8fKoiay+dBeSWvqPDjR1V3Hu00j2eLqX8MXTTwgiGSmWneFRb8sA== - dependencies: - "@tamagui/constants" "1.94.4" - -"@tamagui/use-force-update@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-force-update/-/use-force-update-1.94.4.tgz#b39d3b40191bca5e4b89e7333269114edb117541" - integrity sha512-EEnsMDG9jLOzP5QEWQnPwtwEW7CbLTKCgs4rwXmpmGRds//lMUf3luTHJRq/yf6thfeZPGlq2l+w95mHLxdAvQ== - -"@tamagui/use-keyboard-visible@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-keyboard-visible/-/use-keyboard-visible-1.94.4.tgz#78ed10add3311ee9fc5d0a7aa4a50220f4f1b5c6" - integrity sha512-33fBeKCLx2iQXjJGdWUpYqbkMQ4mPpqyVFYJ2hLNUfLSj+jwzP1XwEcovh5IZkdw8+rgQkEdsEzM8LP9RAob/w== - -"@tamagui/use-presence@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-presence/-/use-presence-1.94.4.tgz#9abfdd6bac38b3be690be88c68801239bf765afd" - integrity sha512-tXX5w3+vgSTYdIptGdJyUzjJ6V5ahvt9LoYjt4PV6X0Tc9ogd7O2kb9re8UG+5PpcnrGvAQ8vg+xkJcehnCt7A== - dependencies: - "@tamagui/web" "1.94.4" - -"@tamagui/use-previous@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-previous/-/use-previous-1.94.4.tgz#97829a1fd43ca2e4577ed088ae311ae800e1bb47" - integrity sha512-5cCpp5wFUTpqrl+2IMnb+3S7EzPzkp1M4+11UCjOjqnFSO/ELQZwzMHFpakf5DR4nlVm/2heIqW+hLfR4ir00w== - -"@tamagui/use-window-dimensions@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/use-window-dimensions/-/use-window-dimensions-1.94.4.tgz#de3b301b29ef38b327524439cc60cd50acc39ebc" - integrity sha512-G+UtJHBe29eFlRFXxJBc2zXfE1HoNJzTXMT2MyYjVMpgSHwJh+tT3RGEvBaKGPp2xKnl0VonZrwAvwi1w59BQA== - dependencies: - "@tamagui/constants" "1.94.4" - -"@tamagui/visually-hidden@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/visually-hidden/-/visually-hidden-1.94.4.tgz#1348aab04df515418bbc39340332c7accb0e094b" - integrity sha512-LpqxBMIbhZMyZRAdGFAmADV7It4ogt0jWa8lSC9IkycLz8reF0DWqjPL5Wdxl4Ly3tiLhCbBF0uZM72RCSEJHA== - dependencies: - "@tamagui/web" "1.94.4" - -"@tamagui/web@1.94.4": - version "1.94.4" - resolved "https://registry.yarnpkg.com/@tamagui/web/-/web-1.94.4.tgz#d01e9037675cc728de9f25fbf231d42c90f1e837" - integrity sha512-0CFNBUF1Wrj63I7KtQ5Opd6KToux30S66cyCQHABFpW/9Lls7QfLo5sPCUluvyRi+arOazr1FwBRSTnnFDrQ/A== - dependencies: - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/helpers" "1.94.4" - "@tamagui/normalize-css-color" "1.94.4" - "@tamagui/timer" "1.94.4" - "@tamagui/types" "1.94.4" - "@tamagui/use-did-finish-ssr" "1.94.4" - "@tamagui/use-event" "1.94.4" - "@tamagui/use-force-update" "1.94.4" - react "^18.2.0" - react-dom "^18.2.0" +"@tamagui/theme@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/theme/-/theme-1.105.8.tgz#e7f41a593a5f8547a2672c2fb2aa1682705d15ee" + integrity sha512-x8o4A/NNPNKsolCqY248KIEuETSbZE2Tcj6QiR+rAzWxfYoAHy91Jd5BDLzRF1iUIzzadSsS/3Odkc126RS7sw== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/themes@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/themes/-/themes-1.105.8.tgz#cd55d5f8016a0760682a99bf9e629f1ab1c6e2cb" + integrity sha512-6AlLZO4Kt06QVd0fgNyIBcRN3+nN36oJfDcqRLbqjxWGrvgFZJWWl91sHeggBEu43t2QINetRT/kCnsjJHA0Xg== + dependencies: + "@tamagui/colors" "1.105.8" + "@tamagui/create-theme" "1.105.8" + "@tamagui/theme-builder" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/timer@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/timer/-/timer-1.105.8.tgz#00c425d12a8b28b5e03f238efaaed0220dcc1daf" + integrity sha512-MuMbtuWplc4iqPDXf7crq+0y3GoZOy30umShWXF9Aw85u0t/4t5fI8YFAUet3elr6zaPqzH/5eK8rQkdGVRGkQ== + +"@tamagui/toast@^1.103.0": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/toast/-/toast-1.105.8.tgz#725074455e2a691de7279a9c5cb437b51104d9ab" + integrity sha512-jbuGD/eGxFyvcrEt2Q325/7rGiwdgCxmFbYGONZXNpXAfEOXSiTiT8UFzRuzcDfOS+LQOrxtJyA0fiHAz9cmCg== + dependencies: + "@tamagui/animate-presence" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/dismissable" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/visually-hidden" "1.105.8" + +"@tamagui/toggle-group@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/toggle-group/-/toggle-group-1.105.8.tgz#b57372ad28a5e0c34cca0824c6fed076b93b51a0" + integrity sha512-FhO0u4rqQ/t0Yc6tskGsG8M1Tea5yIJCFjczNqrjfJj5HrixPBacHYO0/jmx8c5w94r8Cs2dpgKOTCfpeNvsNg== + dependencies: + "@tamagui/constants" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/font-size" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/group" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/helpers-tamagui" "1.105.8" + "@tamagui/roving-focus" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-direction" "1.105.8" + "@tamagui/web" "1.105.8" + +"@tamagui/tooltip@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/tooltip/-/tooltip-1.105.8.tgz#208cbdb35ec3fa490fabcb37e1f00e5c4278e9b8" + integrity sha512-48fLueBzKoK0kRBJkKU5JlCdVXyMKSltR1VM0IaRIZYqAFxgQtcUx1fwHaj7Qxg/rdx5XuUMX/gVOgMC0YSwhw== + dependencies: + "@floating-ui/react" "^0.26.16" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/floating" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/popover" "1.105.8" + "@tamagui/popper" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + +"@tamagui/types@1.105.8", "@tamagui/types@^1.103.0": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/types/-/types-1.105.8.tgz#b856522b40d0e4d86426dcf1a4722e4b80de113b" + integrity sha512-weBx9OdNvTq8gHWCjetJaNz2mN25PaYiysnf9f9zprGshavEo9xq+RtAPazkN93Msauh02eOBl5HK8K5CY7Hrw== + +"@tamagui/use-callback-ref@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-callback-ref/-/use-callback-ref-1.105.8.tgz#fb0f5c9b466df9cfef06afecdff0d3d66cef2aec" + integrity sha512-WC/6aBNWw9Oq+0Wi4cdLqBi/iJTxMdW+Epg6cQXvGOypdYVtlaOTjf1p/UqIipU0S36wFu8Y2omVIosLDtjyrg== + +"@tamagui/use-constant@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-constant/-/use-constant-1.105.8.tgz#bcd69952ef0519d5b6726107ab09bcd8529a0781" + integrity sha512-NDqJFT30zH7k6Pncs0xfROPENcma+8md1zbxfUmfnHBSyHWeRXy6muHq10NgFFpAXLM7bigAaWu257xKNVgBvA== + +"@tamagui/use-controllable-state@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-controllable-state/-/use-controllable-state-1.105.8.tgz#73efe35e77c8deb7945923f0671cd84eba1c01fa" + integrity sha512-vMwyHKH9SuO1sselq0Sn7qPGTjsief79qAxmXIlva3EEta6c0q0FvPu+Q+8Aw0gThne0r6RZvNYYM5u3DgsYug== + dependencies: + "@tamagui/use-event" "1.105.8" + +"@tamagui/use-debounce@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-debounce/-/use-debounce-1.105.8.tgz#37e622eda4349c3e0c7987ae3f0d10e903800ef0" + integrity sha512-YqjfW2gYdPqfWOXYPMXX3vaSPCvXco0uy1ShMSxm8YYBnbNTLrMgS10MnRr6IMaBBKgsGXQY1Gp/MRiwdlac/A== + +"@tamagui/use-did-finish-ssr@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-did-finish-ssr/-/use-did-finish-ssr-1.105.8.tgz#b79237756c84cd546014571a6f7d06db39e27d02" + integrity sha512-eSPrlEP/NtacXpQ4Z8YSEQLCKr8K0K6SIrcgk18QDmqITY3pxoR2TqymxI3E9YdrXmaamCBKw9PMALaVXr1i6g== + dependencies: + "@tamagui/constants" "1.105.8" + +"@tamagui/use-direction@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-direction/-/use-direction-1.105.8.tgz#f285a42a250af5fa7f13bc29872b4455621b0690" + integrity sha512-dHgfDjscK41fEXGrsFE3RyrLq/zR/fJkC54fIWtSoDoMqIEiId/RYTeIvVE+zl3uBwypXmlLhB1eHkHT9T9urA== + +"@tamagui/use-escape-keydown@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-escape-keydown/-/use-escape-keydown-1.105.8.tgz#269d0cc02278818d7618157cb1b6519a3abad8a9" + integrity sha512-Ej78musC6LgBEY0WD6K1xmSUQNsVizeybQG6TpLLB4j4WxfaZ3KQMzWgymaAW3e1s5s6I6urf3+tIul/SXARsQ== + dependencies: + "@tamagui/use-callback-ref" "1.105.8" + +"@tamagui/use-event@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-event/-/use-event-1.105.8.tgz#17b1f6a841b13799e0f4bbaccc33a9b6683a479b" + integrity sha512-cE2/WjBrmt6sCg+fjABrud0xE3wFz5wXGLdmN0Km5AjU0etCSSPPqAIQqQuUn1TuTHgQfwu+zLAYXlmW01ppug== + dependencies: + "@tamagui/constants" "1.105.8" + +"@tamagui/use-force-update@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-force-update/-/use-force-update-1.105.8.tgz#8fd31f14d29505f0134d1df02b46323e1e79b052" + integrity sha512-miDWeRaGDrbiPVyWn70hzQRALlBm9Ey555/wNu8bgu6MddwfhmX8gsQY8gmF+9ZFYdjyC/GLARTaZFgpl1o4Gg== + +"@tamagui/use-keyboard-visible@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-keyboard-visible/-/use-keyboard-visible-1.105.8.tgz#e5b26d90bcb2bf66e0928e5a1d667fec220a240b" + integrity sha512-ortCEgGxpRhZTY/iPLd4/B39adhvDk9AxcokfhQWKU9wbaEC5qzHPN2uZrALnsfi3b6H9nJyybasU43IOj7Wlg== + +"@tamagui/use-presence@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-presence/-/use-presence-1.105.8.tgz#27d44267d9f311707cd8b5d627ba84a70a404331" + integrity sha512-IcLYrk1wQH0+wXKLK/om8raV4TQB3IEuqFjyzVt8vgP1AUXtltlEIuCUZWavnUFAr2qkmWejWeu81d51TTDLSA== + dependencies: + "@tamagui/web" "1.105.8" + +"@tamagui/use-previous@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-previous/-/use-previous-1.105.8.tgz#5295fc6315fac70df648c0c1996a595c8fca2e5e" + integrity sha512-83bZibYf5joPt/DJ3549Ppxt8cEfCClrhTZHAQ4ZAh2t460TxJ9B/6YzS0J4YayR1fN4Jaebx9l1IoZIub93NA== + +"@tamagui/use-window-dimensions@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/use-window-dimensions/-/use-window-dimensions-1.105.8.tgz#cfb394af91dd2507fdf1b0b17981923a1a90e484" + integrity sha512-ebDkQwq5o/yhHgjRcXj62sM+y0Ao37zhL0evTwvA1JZRMhEDQmifMxeNKRwlDZxzXFP3A9TV+AiSw0ID+JcnJw== + dependencies: + "@tamagui/constants" "1.105.8" + +"@tamagui/visually-hidden@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/visually-hidden/-/visually-hidden-1.105.8.tgz#961d2f5a5ce3a5f6e07272bb49d1616984270d40" + integrity sha512-mU4XieT2GYlAFRyM9E3ocN8KS4snKCByg/kVDwPY/vznorTlNoEA8tRSdZqSt8DjxrnYP1eM8TOiQqgXmrROlg== + dependencies: + "@tamagui/web" "1.105.8" + +"@tamagui/web@1.105.8": + version "1.105.8" + resolved "https://registry.yarnpkg.com/@tamagui/web/-/web-1.105.8.tgz#40fe5922e851cf06930ae1b20b1a55e210443a43" + integrity sha512-Cu9Wl+pA/aCu2hbACNpXYpx5cKQBv2r/YXFowzwwiZpG5kBIbOmvVF+Mcwv5JGk6jxS2WORGAHn4LWh+uqx6PQ== + dependencies: + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/helpers" "1.105.8" + "@tamagui/normalize-css-color" "1.105.8" + "@tamagui/timer" "1.105.8" + "@tamagui/types" "1.105.8" + "@tamagui/use-did-finish-ssr" "1.105.8" + "@tamagui/use-event" "1.105.8" + "@tamagui/use-force-update" "1.105.8" "@tsconfig/react-native@^3.0.0": version "3.0.3" @@ -3286,10 +3344,41 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@xmldom/xmldom@~0.7.7": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" + integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== + +"@zk-kit/imt@^2.0.0-beta.5": + version "2.0.0-beta.5" + resolved "https://registry.yarnpkg.com/@zk-kit/imt/-/imt-2.0.0-beta.5.tgz#b9a3d7aff9d3752dff37904a852c55ce79d69f28" + integrity sha512-AQQ20fBvfIpZThqQMlrNdFtjn8uItzhv99/Ymn1KRGcjOVaptqbJnbQXMcU3BwNf6Jvg4KDXrRWXivvpRMKa3A== + dependencies: + "@zk-kit/utils" "1.0.0" + "@zk-kit/imt@https://gitpkg.now.sh/0xturboblitz/zk-kit/packages/imt?6d417675": version "2.0.0-beta.1" resolved "https://gitpkg.now.sh/0xturboblitz/zk-kit/packages/imt?6d417675#38244ea6eef75dc1ad7fff3ff2a22dd5f1a2593a" +"@zk-kit/lean-imt@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@zk-kit/lean-imt/-/lean-imt-2.0.1.tgz#78af48b384b083e4a3f003036a40a4ea3cb102c0" + integrity sha512-yc0rh9BCY6VvvKrZUNejfucuWscy1iRb9JrppuJktsiA9HcEukB3oX9CB7N/CUmCtqzmdwybet6N2aglGL/SUQ== + dependencies: + "@zk-kit/utils" "1.0.0" + +"@zk-kit/utils@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@zk-kit/utils/-/utils-1.0.0.tgz#db1af01a4e60f5290734a26c2fd9e863bff049e3" + integrity sha512-v5UjrZiaRNAN2UJmTFHvlMktaA2Efc2qN1Mwd4060ExX12yRhY8ZhzdlDODhnuHkvW5zPukuBHgQhHMScNP3Pg== + dependencies: + buffer "^6.0.3" + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -3508,7 +3597,7 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^3.2.2: +async@^3.2.2, async@^3.2.3: version "3.2.5" resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== @@ -3541,6 +3630,20 @@ axios@^1.6.3: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.0.1: + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -3696,11 +3799,27 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== -base64-js@^1.1.2, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + +big-integer@1.6.x: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -3710,6 +3829,19 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -3751,6 +3883,20 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3888,7 +4034,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3901,6 +4047,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -3911,6 +4062,13 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +circom_runtime@0.1.25: + version "0.1.25" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.25.tgz#62a33b371f4633f30238db7a326c43d988e3a170" + integrity sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA== + dependencies: + ffjavascript "0.3.0" + cjs-module-lexer@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" @@ -4200,6 +4358,13 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +debug@~4.3.1, debug@~4.3.2: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4210,7 +4375,7 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -4345,11 +4510,23 @@ dotenv@^16.4.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +easyqrcodejs@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/easyqrcodejs/-/easyqrcodejs-4.6.1.tgz#e9b2230852cda7a63ecb47d9b3856348cc29a52c" + integrity sha512-J9C7UOJ67sZvu1Ei6JS/YHgmTVfl7jD+zPloxZGMtjGz+r9s0APJVxdPlGIYJsI9JEfgE6Q3ZfMEl/6+TL4BGA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.4.668: version "1.4.681" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz#5f23fad8aa7e1f64cbb7dd9d15c7e39a1cd7e6e3" @@ -4370,6 +4547,22 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +engine.io-client@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.4.tgz#b8bc71ed3f25d0d51d587729262486b4b33bd0d0" + integrity sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + entities@^4.2.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" @@ -4532,6 +4725,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^8.5.0: version "8.10.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" @@ -4685,7 +4890,12 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@~4.0.0: +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -4704,7 +4914,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -4737,6 +4947,19 @@ ethers@^6.11.0: tslib "2.4.0" ws "8.5.0" +ethers@^6.13.0: + version "6.13.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.2.tgz#4b67d4b49e69b59893931a032560999e5e4419fe" + integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.17.1" + event-target-shim@^5.0.0, event-target-shim@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" @@ -4848,7 +5071,7 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -4860,6 +5083,11 @@ fast-xml-parser@^4.0.12: dependencies: strnum "^1.0.5" +fastfile@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -4874,6 +5102,15 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +ffjavascript@0.3.0, ffjavascript@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" + integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -4881,6 +5118,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -4946,7 +5190,7 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: +find-up@^5.0.0, find-up@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -4988,6 +5232,11 @@ follow-redirects@^1.15.4: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -5009,27 +5258,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -framer-motion@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.5.1.tgz#802448a16a6eb764124bf36d8cbdfa6dd6b931a7" - integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== - dependencies: - "@motionone/dom" "10.12.0" - framesync "6.0.1" - hey-listen "^1.0.8" - popmotion "11.0.3" - style-value-types "5.0.0" - tslib "^2.1.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" - -framesync@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.0.1.tgz#5e32fc01f1c42b39c654c35b16440e07a25d6f20" - integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== - dependencies: - tslib "^2.1.0" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -5049,6 +5277,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fs@^0.0.1-security: + version "0.0.1-security" + resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== + fsevents@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -5119,6 +5352,11 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +getenv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" + integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -5133,6 +5371,18 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -5269,10 +5519,10 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" -hey-listen@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" - integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== html-escaper@^2.0.0: version "2.0.2" @@ -5698,6 +5948,16 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" @@ -6093,11 +6353,31 @@ joi@^17.2.1: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +js-sha1@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/js-sha1/-/js-sha1-0.7.0.tgz#fecaf5f36bb09a51b01da46b43a207c8452c9c1e" + integrity sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw== + +js-sha256@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.11.0.tgz#256a921d9292f7fe98905face82e367abaca9576" + integrity sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q== + js-sha256@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha512@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.9.0.tgz#ed569aa1e4bdaf0b83363c29db1ab87b1192d9ae" + integrity sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6188,7 +6468,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^2.1.1, json5@^2.2.3: +json5@^2.1.1, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -6200,6 +6480,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -6240,6 +6529,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -6304,6 +6601,11 @@ logkitty@^0.7.1: dayjs "^1.8.15" yargs "^15.1.0" +logplease@^1.2.15: + version "1.2.15" + resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6982,13 +7284,6 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -moti@^0.27.4: - version "0.27.5" - resolved "https://registry.yarnpkg.com/moti/-/moti-0.27.5.tgz#777a122ff9f00d0a2856b045ed332cdc79a67cef" - integrity sha512-6PbHgNTzSyipTon57TBm5w3/cKKMZVugq/Ey2YLbZbMLxsmL4uz6zGO0uBcZWkKaVqm9O8LcK+WdGMyNiR2yrg== - dependencies: - framer-motion "^6.5.1" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7004,6 +7299,11 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -7209,6 +7509,18 @@ optimist@0.3.x: dependencies: wordwrap "~0.0.2" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -7387,15 +7699,14 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -popmotion@11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.3.tgz#565c5f6590bbcddab7a33a074bb2ba97e24b0cc9" - integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== +plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== dependencies: - framesync "6.0.1" - hey-listen "^1.0.8" - style-value-types "5.0.0" - tslib "^2.1.0" + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" poseidon-lite@^0.2.0: version "0.2.0" @@ -7412,6 +7723,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -7519,6 +7835,16 @@ queue@6.0.2: dependencies: inherits "~2.0.3" +r1csfile@0.0.48: + version "0.0.48" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" + integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== + dependencies: + "@iden3/bigarray" "0.0.2" + "@iden3/binfileutils" "0.0.12" + fastfile "0.0.20" + ffjavascript "0.3.0" + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -7552,14 +7878,6 @@ react-devtools-core@^4.27.2: shell-quote "^1.6.1" ws "^7" -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - react-freeze@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.3.tgz#5e3ca90e682fed1d73a7cb50c2c7402b3e85618d" @@ -7587,6 +7905,11 @@ react-native-canvas@^0.1.39: dependencies: ctx-polyfill "^1.1.4" +react-native-date-picker@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/react-native-date-picker/-/react-native-date-picker-5.0.4.tgz#5965141617463bc11ebe0b16e2b0ea7239758e37" + integrity sha512-UycNfXGd4ipgdU2a+oZGj7h1nvp8Gz49f/Ko+YdWh6nrBKB49MEp0n9eF1QngbxMKqdK0AdY4udb4IdVVWji4g== + react-native-dialog@^9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/react-native-dialog/-/react-native-dialog-9.3.0.tgz#9d745cc51653a1e2ae08076b46f11d99723c47f6" @@ -7619,6 +7942,13 @@ react-native-keychain@^8.2.0: resolved "https://registry.yarnpkg.com/react-native-keychain/-/react-native-keychain-8.2.0.tgz#aea82df37aacbb04f8b567a8e0e6d7292025610a" integrity sha512-SkRtd9McIl1Ss2XSWNLorG+KMEbgeVqX+gV+t3u1EAAqT8q2/OpRmRbxpneT2vnb/dMhiU7g6K/pf3nxLUXRvA== +react-native-nfc-manager@^3.15.1: + version "3.15.1" + resolved "https://registry.yarnpkg.com/react-native-nfc-manager/-/react-native-nfc-manager-3.15.1.tgz#2e4dedd3820c81eb55acfd62b153cb04f5bcfc1d" + integrity sha512-By685fhyU531FFOcIWEEdkhEbyq5iDMoN82URqltthPerPYaMkE5ZTKxMH0reuX64znTu96EwoHy4zdTiDGVHQ== + dependencies: + "@expo/config-plugins" "~8.0.0" + react-native-passport-reader@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/react-native-passport-reader/-/react-native-passport-reader-1.0.3.tgz#3242bbdb3c1ade4c050a8632cca6f11fe0edc648" @@ -7711,6 +8041,11 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" +react-spinners@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.14.1.tgz#de7d7d6b3e6d4f29d9620c65495b502c7dd90812" + integrity sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag== + react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" @@ -7729,7 +8064,7 @@ react-test-renderer@18.2.0: react-shallow-renderer "^16.15.0" scheduler "^0.23.0" -react@18.2.0, react@^18.2.0: +react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -7980,6 +8315,11 @@ safe-regex-test@^1.0.3: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@>=0.6.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + scheduler@0.24.0-canary-efb381bbf-20230505: version "0.24.0-canary-efb381bbf-20230505" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" @@ -8121,6 +8461,15 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-plist@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -8140,6 +8489,45 @@ slice-ansi@^2.0.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slugify@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + +snarkjs@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" + integrity sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w== + dependencies: + "@iden3/binfileutils" "0.0.12" + bfj "^7.0.2" + blake2b-wasm "^2.4.0" + circom_runtime "0.1.25" + ejs "^3.1.6" + fastfile "0.0.20" + ffjavascript "0.3.0" + js-sha3 "^0.8.0" + logplease "^1.2.15" + r1csfile "0.0.48" + +socket.io-client@^4.7.5: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.5.tgz#919be76916989758bdc20eec63f7ee0ae45c05b7" + integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + sonner@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/sonner/-/sonner-0.3.5.tgz#5ef175732cb7b637c6460620ab01a0fba0e6a36b" @@ -8200,6 +8588,13 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -8210,6 +8605,11 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -8322,14 +8722,6 @@ strnum@^1.0.5: resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== -style-value-types@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.0.0.tgz#76c35f0e579843d523187989da866729411fc8ad" - integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== - dependencies: - hey-listen "^1.0.8" - tslib "^2.1.0" - sudo-prompt@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" @@ -8361,68 +8753,68 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tabbable@^6.0.1: +tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -tamagui@^1.94.3: - version "1.94.4" - resolved "https://registry.yarnpkg.com/tamagui/-/tamagui-1.94.4.tgz#8a80aea51f3a63c3db91930a00c2b88276603135" - integrity sha512-VSquY0BXJh8U/D7uEuEN5PIsslcy+hUEeGDkw/ySIwuB/hRsPt0eceguV94OknG721gcuHU5cnu069Nrx/l7pA== - dependencies: - "@tamagui/accordion" "1.94.4" - "@tamagui/adapt" "1.94.4" - "@tamagui/alert-dialog" "1.94.4" - "@tamagui/animate-presence" "1.94.4" - "@tamagui/avatar" "1.94.4" - "@tamagui/button" "1.94.4" - "@tamagui/card" "1.94.4" - "@tamagui/checkbox" "1.94.4" - "@tamagui/compose-refs" "1.94.4" - "@tamagui/constants" "1.94.4" - "@tamagui/core" "1.94.4" - "@tamagui/create-context" "1.94.4" - "@tamagui/dialog" "1.94.4" - "@tamagui/elements" "1.94.4" - "@tamagui/fake-react-native" "1.94.4" - "@tamagui/focusable" "1.94.4" - "@tamagui/font-size" "1.94.4" - "@tamagui/form" "1.94.4" - "@tamagui/get-button-sized" "1.94.4" - "@tamagui/get-font-sized" "1.94.4" - "@tamagui/get-token" "1.94.4" - "@tamagui/group" "1.94.4" - "@tamagui/helpers-tamagui" "1.94.4" - "@tamagui/image" "1.94.4" - "@tamagui/label" "1.94.4" - "@tamagui/linear-gradient" "1.94.4" - "@tamagui/list-item" "1.94.4" - "@tamagui/polyfill-dev" "1.94.4" - "@tamagui/popover" "1.94.4" - "@tamagui/popper" "1.94.4" - "@tamagui/portal" "1.94.4" - "@tamagui/progress" "1.94.4" - "@tamagui/radio-group" "1.94.4" - "@tamagui/react-native-media-driver" "1.94.4" - "@tamagui/scroll-view" "1.94.4" - "@tamagui/select" "1.94.4" - "@tamagui/separator" "1.94.4" - "@tamagui/shapes" "1.94.4" - "@tamagui/sheet" "1.94.4" - "@tamagui/slider" "1.94.4" - "@tamagui/stacks" "1.94.4" - "@tamagui/switch" "1.94.4" - "@tamagui/tabs" "1.94.4" - "@tamagui/text" "1.94.4" - "@tamagui/theme" "1.94.4" - "@tamagui/toggle-group" "1.94.4" - "@tamagui/tooltip" "1.94.4" - "@tamagui/use-controllable-state" "1.94.4" - "@tamagui/use-debounce" "1.94.4" - "@tamagui/use-force-update" "1.94.4" - "@tamagui/use-window-dimensions" "1.94.4" - "@tamagui/visually-hidden" "1.94.4" +tamagui@^1.103.0: + version "1.105.8" + resolved "https://registry.yarnpkg.com/tamagui/-/tamagui-1.105.8.tgz#7612c4e9fa599cb7652d06ae2237fcaa4f76c547" + integrity sha512-j2GKFLpqakLouZM+c4Di+A2F+rXRSib+6kgzlgmqfoQ6D+M2K6F1BzSbBjmMhKrXWQ7m6NRGCF7ElumeGP6wdw== + dependencies: + "@tamagui/accordion" "1.105.8" + "@tamagui/adapt" "1.105.8" + "@tamagui/alert-dialog" "1.105.8" + "@tamagui/animate-presence" "1.105.8" + "@tamagui/avatar" "1.105.8" + "@tamagui/button" "1.105.8" + "@tamagui/card" "1.105.8" + "@tamagui/checkbox" "1.105.8" + "@tamagui/compose-refs" "1.105.8" + "@tamagui/constants" "1.105.8" + "@tamagui/core" "1.105.8" + "@tamagui/create-context" "1.105.8" + "@tamagui/dialog" "1.105.8" + "@tamagui/elements" "1.105.8" + "@tamagui/fake-react-native" "1.105.8" + "@tamagui/focusable" "1.105.8" + "@tamagui/font-size" "1.105.8" + "@tamagui/form" "1.105.8" + "@tamagui/get-button-sized" "1.105.8" + "@tamagui/get-font-sized" "1.105.8" + "@tamagui/get-token" "1.105.8" + "@tamagui/group" "1.105.8" + "@tamagui/helpers-tamagui" "1.105.8" + "@tamagui/image" "1.105.8" + "@tamagui/label" "1.105.8" + "@tamagui/linear-gradient" "1.105.8" + "@tamagui/list-item" "1.105.8" + "@tamagui/polyfill-dev" "1.105.8" + "@tamagui/popover" "1.105.8" + "@tamagui/popper" "1.105.8" + "@tamagui/portal" "1.105.8" + "@tamagui/progress" "1.105.8" + "@tamagui/radio-group" "1.105.8" + "@tamagui/react-native-media-driver" "1.105.8" + "@tamagui/scroll-view" "1.105.8" + "@tamagui/select" "1.105.8" + "@tamagui/separator" "1.105.8" + "@tamagui/shapes" "1.105.8" + "@tamagui/sheet" "1.105.8" + "@tamagui/slider" "1.105.8" + "@tamagui/stacks" "1.105.8" + "@tamagui/switch" "1.105.8" + "@tamagui/tabs" "1.105.8" + "@tamagui/text" "1.105.8" + "@tamagui/theme" "1.105.8" + "@tamagui/toggle-group" "1.105.8" + "@tamagui/tooltip" "1.105.8" + "@tamagui/use-controllable-state" "1.105.8" + "@tamagui/use-debounce" "1.105.8" + "@tamagui/use-force-update" "1.105.8" + "@tamagui/use-window-dimensions" "1.105.8" + "@tamagui/visually-hidden" "1.105.8" temp@^0.8.4: version "0.8.4" @@ -8495,6 +8887,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + tslib@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" @@ -8505,7 +8902,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.1: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.1: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -8524,6 +8921,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -8619,6 +9023,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -8707,6 +9116,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + v8-to-istanbul@^9.0.1: version "9.2.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" @@ -8733,6 +9147,18 @@ walker@^1.0.7, walker@^1.0.8: dependencies: makeerror "1.0.12" +wasmbuilder@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== + +wasmcurves@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== + dependencies: + wasmbuilder "0.0.16" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -8740,6 +9166,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-worker@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -8820,6 +9251,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -8865,6 +9301,11 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@8.17.1, ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + ws@8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" @@ -8882,6 +9323,42 @@ ws@^7, ws@^7.5.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +xcode@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" + integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== + dependencies: + simple-plist "^1.1.0" + uuid "^7.0.3" + +xml2js@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" + integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" + integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== + +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" diff --git a/circuits/tests/disclose/disclose.test.ts b/circuits/tests/disclose/disclose.test.ts index 0175aff8..373ce255 100644 --- a/circuits/tests/disclose/disclose.test.ts +++ b/circuits/tests/disclose/disclose.test.ts @@ -35,7 +35,7 @@ describe('Disclose', function () { const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); attestation_id = poseidon1([BigInt(Buffer.from(attestation_name).readUIntBE(0, 6))]).toString(); - const majority = ['1', '8']; + const majority = '18'; const user_identifier = '0xE6E4b6a802F2e0aeE5676f6010e0AF5C9CDd0a50'; const bitmap = Array(90).fill('1'); const scope = poseidon1([BigInt(Buffer.from('VOTEEEEE').readUIntBE(0, 6))]).toString(); diff --git a/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts b/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts index dc66df73..4268a14e 100644 --- a/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts +++ b/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts @@ -64,6 +64,6 @@ describe('DSC chain certificate - SHA1 RSA', function () { }); it('should compute the correct output', async () => { - const witness = await circuit.calculateWitness(inputs, true); + const witness = await circuit.calculateWitness(inputs.inputs, true); }); }); diff --git a/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts b/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts index b084261a..5cec5096 100644 --- a/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts +++ b/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts @@ -63,6 +63,6 @@ describe('DSC chain certificate - SHA256 RSA', function () { }); it('should compute the correct output', async () => { - const witness = await circuit.calculateWitness(inputs, true); + const witness = await circuit.calculateWitness(inputs.inputs, true); }); }); diff --git a/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts b/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts index 82714963..e729476b 100644 --- a/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts +++ b/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts @@ -94,6 +94,6 @@ describe('DSC chain certificate - SHA256 RSA-PSS', function () { }); it('should compute the correct output', async () => { - const witness = await circuit.calculateWitness(inputs, true); + const witness = await circuit.calculateWitness(inputs.inputs, true); }); }); diff --git a/circuits/tests/utils/rsa_verifier.test.ts b/circuits/tests/utils/rsa_verifier.test.ts index 7d3306c4..17d39158 100644 --- a/circuits/tests/utils/rsa_verifier.test.ts +++ b/circuits/tests/utils/rsa_verifier.test.ts @@ -55,17 +55,17 @@ describe('RSA Verifier', function () { expect(isVerified).to.be.true; }); - it('should extract and log certificate information', async () => { - const csca_inputs = getCSCAInputs('0', dscCert_forge, cscaCert_forge, n, k, n, k, 2048, true); - const tbsCertificateHashFormatted = getTBSHash(dscCert_forge, 'sha256', n, k); + // it('should extract and log certificate information', async () => { + // const csca_inputs = getCSCAInputs('0', dscCert_forge, cscaCert_forge, n, k, n, k, 2048, true); + // const tbsCertificateHashFormatted = getTBSHash(dscCert_forge, 'sha256', n, k); - const inputs = { - message: tbsCertificateHashFormatted, - signature: csca_inputs.dsc_signature, - modulus: csca_inputs.csca_modulus, - }; - const witness = await circuit.calculateWitness(inputs, true); - }); + // const inputs = { + // message: tbsCertificateHashFormatted, + // signature: csca_inputs.inputs.dsc_signature, + // modulus: csca_inputs.inputs.dsc_modulus, + // }; + // const witness = await circuit.calculateWitness(inputs, true); + // }); }); describe('SHA-1 certificates', () => { diff --git a/circuits/tests/utils/rsapss_verifier.test.ts b/circuits/tests/utils/rsapss_verifier.test.ts index 7057efe2..c2d9c59b 100644 --- a/circuits/tests/utils/rsapss_verifier.test.ts +++ b/circuits/tests/utils/rsapss_verifier.test.ts @@ -56,17 +56,17 @@ describe('RSAPSS Verifier', function () { expect(isVerified).to.be.true; }); - it('should extract and log certificate information', async () => { - const csca_inputs = getCSCAInputs('0', dscCert_forge, cscaCert_forge, n, k, n, k, 960, true); - // const tbsCertificateHashFormatted = getTBSHash(dscCert_forge, 'sha256', n, k); + // it('should extract and log certificate information', async () => { + // const csca_inputs = getCSCAInputs('0', dscCert_forge, cscaCert_forge, n, k, n, k, 960, true); + // // const tbsCertificateHashFormatted = getTBSHash(dscCert_forge, 'sha256', n, k); - const inputs = { - raw_message: csca_inputs.raw_dsc_cert, - raw_message_padded_bytes: csca_inputs.raw_dsc_cert_padded_bytes, - signature: csca_inputs.dsc_signature, - modulus: csca_inputs.csca_modulus, - }; - //const witness = await circuit.calculateWitness(inputs, true); - }); + // const inputs = { + // raw_message: csca_inputs.inputs.raw_dsc_cert, + // raw_message_padded_bytes: csca_inputs.inputs.raw_dsc_cert_padded_bytes, + // signature: csca_inputs.inputs.dsc_signature, + // modulus: csca_inputs.inputs.dsc_modulus, + // }; + // /const witness = await circuit.calculateWitness(inputs, true); + // }); }); }); diff --git a/common/package.json b/common/package.json index 09f5b133..f3b0e608 100644 --- a/common/package.json +++ b/common/package.json @@ -3,6 +3,7 @@ "@babel/runtime": "^7.23.4", "@zk-kit/imt": "https://gitpkg.now.sh/0xturboblitz/zk-kit/packages/imt?6d417675", "@zk-kit/lean-imt": "^2.0.1", + "@zk-kit/utils": "^1.2.0", "asn1.js": "^5.4.1", "axios": "^1.7.2", "elliptic": "^6.5.5", @@ -20,4 +21,4 @@ "devDependencies": { "@types/node-forge": "^1.3.10" } -} +} \ No newline at end of file diff --git a/common/src/constants/constants.ts b/common/src/constants/constants.ts index 38615b70..d5559fed 100644 --- a/common/src/constants/constants.ts +++ b/common/src/constants/constants.ts @@ -1,6 +1,6 @@ export const RELAYER_URL = "https://0pw5u65m3a.execute-api.eu-north-1.amazonaws.com/api-stage/mint" -export const COMMITMENT_TREE_TRACKER_URL = "https://app.proofofpassport.com/apiv2/download-merkle-tree" - +//export const COMMITMENT_TREE_TRACKER_URL = "https://app.proofofpassport.com/apiv2/download-merkle-tree" +export const COMMITMENT_TREE_TRACKER_URL = "https://proofofpassport-merkle-tree.xyz/api/download-merkle-tree" export const PUBKEY_TREE_DEPTH = 16 export const CSCA_TREE_DEPTH = 12 export const COMMITMENT_TREE_DEPTH = 16 @@ -14,6 +14,7 @@ export const RPC_URL = "https://opt-mainnet.g.alchemy.com/v2/Mjj_SdklUaCdR6EPfVK // we make it global here because passing it to generateCircuitInputsRegister caused trouble export const DEVELOPMENT_MODE = true +export const DEFAULT_MAJORITY = "18" export enum SignatureAlgorithm { sha256WithRSAEncryption_65537 = 1, @@ -28,6 +29,11 @@ export enum SignatureAlgorithm { sha512WithRSAEncryption_65537 = 10 } +export const signatureOidToName = { + "1.2.840.113549.1.1.11": "sha256_rsa", + "1.2.840.113549.1.1.5": "sha1_rsa" +} + export const attributeToPosition = { issuing_state: [2, 4], name: [5, 43], @@ -312,7 +318,7 @@ qzOBhID0Nxk4k9sW1uT6ocW1xp1SB2WotORssOKIAOLJM8IbPl6n/DkYNcfvyXI7 -----END RSA PUBLIC KEY-----`; export const DEFAULT_RPC_URL = "https://mainnet.optimism.io"; -export const REGISTER_CONTRACT_ADDRESS = "0xEd7495516a957dD7d378d8A78846646461cFF25f"; +export const REGISTER_CONTRACT_ADDRESS = "0x3F346FFdC5d583e4126AF01A02Ac5b9CdB3f1909"; export const SBT_CONTRACT_ADDRESS = "0x601Fd54FD11C5E77DE84d877e55B829aff20f0A6"; /*** ABI ***/ diff --git a/common/src/constants/vkey.ts b/common/src/constants/vkey.ts new file mode 100644 index 00000000..dfacea3b --- /dev/null +++ b/common/src/constants/vkey.ts @@ -0,0 +1,159 @@ +export const vkey_disclose = { + "protocol": "groth16", + "curve": "bn128", + "nPublic": 14, + "vk_alpha_1": [ + "20491192805390485299153009773594534940189261866228447918068658471970481763042", + "9383485363053290200918347156157836566562967994039712273449902621266178545958", + "1" + ], + "vk_beta_2": [ + [ + "6375614351688725206403948262868962793625744043794305715222011528459656738731", + "4252822878758300859123897981450591353533073413197771768651442665752259397132" + ], + [ + "10505242626370262277552901082094356697409835680220590971873171140371331206856", + "21847035105528745403288232691147584728191162732299865338377159692350059136679" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "6942436740229168666595536581519256291593117600832247164924519038970269461046", + "17557865657217054151399710026819127874171362865266657132072043760282335721027" + ], + [ + "15629082942757783052734933529055204330846116501031658743204188522840567440030", + "866803245463331646327183913175583329159450203348438102150009828684148559895" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "2029413683389138792403550203267699914886160938906632433982220835551125967885", + "21072700047562757817161031222997517981543347628379360635925549008442030252106" + ], + [ + "5940354580057074848093997050200682056184807770593307860589430076672439820312", + "12156638873931618554171829126792193045421052652279363021382169897324752428276" + ], + [ + "7898200236362823042373859371574133993780991612861777490112507062703164551277", + "7074218545237549455313236346927434013100842096812539264420499035217050630853" + ] + ], + [ + [ + "7077479683546002997211712695946002074877511277312570035766170199895071832130", + "10093483419865920389913245021038182291233451549023025229112148274109565435465" + ], + [ + "4595479056700221319381530156280926371456704509942304414423590385166031118820", + "19831328484489333784475432780421641293929726139240675179672856274388269393268" + ], + [ + "11934129596455521040620786944827826205713621633706285934057045369193958244500", + "8037395052364110730298837004334506829870972346962140206007064471173334027475" + ] + ] + ], + "IC": [ + [ + "10998553002727424987884583305349753345629818748955483305954960876370686844925", + "18369020735737057562107768810182682586161750799521907185011795199521493953276", + "1" + ], + [ + "3870156317905136354369536369223776179854927352937539086581682263147147725326", + "947908099816727525943796981035826395896386995128918341433720280874486019589", + "1" + ], + [ + "9619614659642762666110070745787072277198407288262286655564043642023793950605", + "1444870940646607538213811271690623291794427513321591343855928143309974143815", + "1" + ], + [ + "10290556281387838061211784545032614883237381276187632418810139452226710406378", + "12820288689147023950592422696432066467590193138126598372596214785570201388663", + "1" + ], + [ + "10044189939644279332588298610988772483187101321076758071894028734198440253205", + "15016612240779620571490237444430121691511928826472608688773111463692886510804", + "1" + ], + [ + "6158786594227478832634691320618082224218218524296943509099128649963428556955", + "2818896662082406397657145229256654653904841140122301210666395782176903475916", + "1" + ], + [ + "200295911748915977788397688942615122670319721182540082686195028815964792730", + "16374098866162622474777608838325780437892472095191094825634065695603492498672", + "1" + ], + [ + "1001933084599581827076405562561115761770358156189382784432273793509010836288", + "13618159500648302749264797924828312592779374840705268445533823753672345860949", + "1" + ], + [ + "12152127135355257668073159516593687751413730484411437719952408933610175077761", + "15590965974244077225547659000022179448961631917634079092877797469009672737373", + "1" + ], + [ + "14643873766083688335082369233094018379987105460165787549629338089338629672719", + "18976194036990056092890684065171543382286602242265347684324001010669281606450", + "1" + ], + [ + "4974359282562923295097396773583362835614429754286473873410152881834388935350", + "2615967425575591157936435871031665935046196308487298765704452331348089292330", + "1" + ], + [ + "16489750714044704248135942822786071904168862423655325973193848507501139487825", + "4644993658884496411511912365771411317040070112230395754480725062427812526601", + "1" + ], + [ + "11801682757910657983396995619983996921870874978799260563404809167285348391422", + "19228652101325919244735412842681375925619382430642205708320466729501949572254", + "1" + ], + [ + "4495248066509783309072792039672520701419947625749866524660708846549914823847", + "4585216314173588273427806971446529726371555267351812069737927114283850919560", + "1" + ], + [ + "18719866673490039760627957665040843673978402675108669037278157044178865894074", + "11183065716352601580915387671262116390467334689778841393328736869598818253587", + "1" + ] + ] +}; \ No newline at end of file diff --git a/common/src/utils/appType.ts b/common/src/utils/appType.ts new file mode 100644 index 00000000..bcbcd732 --- /dev/null +++ b/common/src/utils/appType.ts @@ -0,0 +1,35 @@ +export type CircuitName = "register_sha256WithRSAEncryption_65537" | "disclose"; + +//type DisclosureOption = "required" | "optional"; + +interface Disclosure { + [key: string]: string; +} + +export interface AppType { + id?: string; + name: string; + scope: string; + callbackEndPoint?: string; + userId: string; + disclosureOptions: Disclosure; + circuit: string; + title?: string; + description?: string; + background?: string; + colorOfTheText?: string; + icon?: unknown; +} + +export function createAppType(data: AppType): AppType { + return { + //id: data.id || "", + name: data.name, + scope: data.scope, + //callbackEndPoint: data.callbackEndPoint, + userId: data.userId, + disclosureOptions: data.disclosureOptions, + circuit: data.circuit || "disclose", + ...data + }; +} \ No newline at end of file diff --git a/common/src/utils/commitmentTree.ts b/common/src/utils/commitmentTree.ts new file mode 100644 index 00000000..fa28286b --- /dev/null +++ b/common/src/utils/commitmentTree.ts @@ -0,0 +1,5 @@ +// import { LeanIMT } from "@zk-kit/lean-imt"; +// import { poseidon2 } from "poseidon-lite"; +// import axios from "axios"; +// import { COMMITMENT_TREE_TRACKER_URL } from "../constants/constants"; + diff --git a/common/src/utils/csca.ts b/common/src/utils/csca.ts index 689a99b9..79a69c76 100644 --- a/common/src/utils/csca.ts +++ b/common/src/utils/csca.ts @@ -1,7 +1,7 @@ import { sha1Pad, sha256Pad } from "./shaPad"; import * as forge from "node-forge"; import { splitToWords } from "./utils"; -import { CSCA_AKI_MODULUS, CSCA_TREE_DEPTH, MODAL_SERVER_ADDRESS } from "../constants/constants"; +import { CSCA_AKI_MODULUS, CSCA_TREE_DEPTH, MODAL_SERVER_ADDRESS, signatureOidToName } from "../constants/constants"; import { poseidon16, poseidon2, poseidon4 } from "poseidon-lite"; import { IMT } from "@zk-kit/imt"; import serialized_csca_tree from "../../pubkeys/serialized_csca_tree.json" @@ -131,17 +131,22 @@ export function getCSCAInputs(dscSecret: string, dscCertificate: any, cscaCertif return { - "raw_dsc_cert": dsc_message_padded_formatted, - "raw_dsc_cert_padded_bytes": [dsc_messagePaddedLen_formatted], - "csca_modulus": csca_modulus_formatted, - "dsc_signature": dsc_signature_formatted, - "dsc_modulus": dsc_modulus_formatted, - "start_index": [startIndex_formatted], - "secret": [dscSecret], - "merkle_root": [BigInt(root).toString()], - "path": proof.pathIndices.map(index => index.toString()), - "siblings": proof.siblings.flat().map(sibling => sibling.toString()) + "signature_algorithm": signatureOidToName[signatureAlgorithm], + "inputs": + { + "raw_dsc_cert": dsc_message_padded_formatted, + "raw_dsc_cert_padded_bytes": [dsc_messagePaddedLen_formatted], + "csca_modulus": csca_modulus_formatted, + "dsc_signature": dsc_signature_formatted, + "dsc_modulus": dsc_modulus_formatted, + "start_index": [startIndex_formatted], + "secret": [dscSecret], + "merkle_root": [BigInt(root).toString()], + "path": proof.pathIndices.map(index => index.toString()), + "siblings": proof.siblings.flat().map(sibling => sibling.toString()) + } } + } export function derToBytes(derValue: string) { diff --git a/common/src/utils/generateInputs.ts b/common/src/utils/generateInputs.ts index fce83b4b..10a5c508 100644 --- a/common/src/utils/generateInputs.ts +++ b/common/src/utils/generateInputs.ts @@ -33,13 +33,13 @@ export function generateCircuitInputsRegister( const { mrz, signatureAlgorithm, pubKey, dataGroupHashes, eContent, encryptedDigest } = passportData; - const tree = getCSCAModulusMerkleTree(); + // const tree = getCSCAModulusMerkleTree(); - if (DEVELOPMENT_MODE) { - for (const mockPassportData of mocks) { - tree.insert(getLeaf(mockPassportData).toString()); - } - } + // if (DEVELOPMENT_MODE) { + // for (const mockPassportData of mocks) { + // tree.insert(getLeaf(mockPassportData).toString()); + // } + // } if ( ![ @@ -75,14 +75,14 @@ export function generateCircuitInputsRegister( ...pubKey, }).toString(); - const index = tree.indexOf(leaf); + // const index = tree.indexOf(leaf); // console.log(`Index of pubkey in the registry: ${index}`); - if (index === -1) { - throw new Error('Your public key was not found in the registry'); - } + // if (index === -1) { + // throw new Error('Your public key was not found in the registry'); + // } - const proof = tree.createProof(index); - console.log('verifyProof', tree.verifyProof(proof)); + // const proof = tree.createProof(index); + // console.log('verifyProof', tree.verifyProof(proof)); if (dataGroupHashes.length > MAX_DATAHASHES_LEN) { console.error( @@ -142,7 +142,7 @@ export function generateCircuitInputsDisclose( attestation_id: string, passportData: PassportData, merkletree: LeanIMT, - majority: string[], + majority: string, bitmap: string[], scope: string, user_identifier: string @@ -174,6 +174,9 @@ export function generateCircuitInputsDisclose( PUBKEY_TREE_DEPTH ); + // format majority to bigints + + return { secret: [secret], attestation_id: [attestation_id], @@ -184,9 +187,9 @@ export function generateCircuitInputsDisclose( path: merkleProofIndices.map((index) => BigInt(index).toString()), siblings: merkleProofSiblings.map((index) => BigInt(index).toString()), bitmap: bitmap, - scope: [scope], - current_date: getCurrentDateYYMMDD().map((datePart) => BigInt(datePart).toString()), - majority: majority.map((char) => BigInt(char.charCodeAt(0)).toString()), + scope: [BigInt(scope).toString()], + current_date: getCurrentDateYYMMDD().map(datePart => BigInt(datePart).toString()), + majority: majority.split('').map(char => BigInt(char.charCodeAt(0)).toString()), user_identifier: [user_identifier], }; } diff --git a/common/src/utils/pubkeyTree.ts b/common/src/utils/pubkeyTree.ts index d5133841..f4f2a2fb 100644 --- a/common/src/utils/pubkeyTree.ts +++ b/common/src/utils/pubkeyTree.ts @@ -1,9 +1,10 @@ +import { SignatureAlgorithm, PUBKEY_TREE_DEPTH, COMMITMENT_TREE_TRACKER_URL } from "../constants/constants"; +import { IMT, LeanIMT } from '@zk-kit/imt' +import { formatSigAlgNameForCircuit } from "./utils"; +import { toStandardName } from "./formatNames"; +import axios from "axios"; import { poseidon10, poseidon2, poseidon3, poseidon5, poseidon6, poseidon8 } from 'poseidon-lite'; -import { SignatureAlgorithm, PUBKEY_TREE_DEPTH } from '../constants/constants'; -import { IMT } from '@zk-kit/imt'; import { BigintToArray, hexToDecimal, splitToWords } from './utils'; -import { formatSigAlgNameForCircuit } from './utils'; -import { toStandardName } from './formatNames'; export function buildPubkeyTree(pubkeys: any[]) { let leaves: bigint[] = []; @@ -94,3 +95,13 @@ export function getLeaf(pubkey: any, i?: number): bigint { } } } + +export async function getTreeFromTracker(): Promise { + const response = await axios.get(COMMITMENT_TREE_TRACKER_URL) + const imt = new LeanIMT( + (a: bigint, b: bigint) => poseidon2([a, b]), + [] + ); + imt.import(response.data) + return imt +} \ No newline at end of file diff --git a/common/src/utils/revealBitmap.ts b/common/src/utils/revealBitmap.ts index ad8e21b9..1182c4ec 100644 --- a/common/src/utils/revealBitmap.ts +++ b/common/src/utils/revealBitmap.ts @@ -1,10 +1,10 @@ import { attributeToPosition } from "../constants/constants"; -export function revealBitmapFromMapping(attributeToReveal: {[key: string]: boolean}): string[] { +export function revealBitmapFromMapping(attributeToReveal: { [key: string]: string }): string[] { const reveal_bitmap = Array(90).fill('0'); Object.entries(attributeToReveal).forEach(([attribute, reveal]) => { - if (reveal) { + if (reveal !== "") { const [start, end] = attributeToPosition[attribute as keyof typeof attributeToPosition]; reveal_bitmap.fill('1', start, end + 1); } @@ -12,6 +12,16 @@ export function revealBitmapFromMapping(attributeToReveal: {[key: string]: boole return reveal_bitmap; } +export function revealBitmapFromAttributes(attributeToReveal: { [key: string]: boolean }): string[] { + const reveal_bitmap = Array(90).fill('0'); + + Object.entries(attributeToReveal).forEach(([attribute, reveal]) => { + const [start, end] = attributeToPosition[attribute as keyof typeof attributeToPosition]; + reveal_bitmap.fill('1', start, end + 1); + }); + + return reveal_bitmap; +} export function unpackReveal(revealedData_packed: string[]): string[] { const revealedData_packed_formatted = [ @@ -22,14 +32,14 @@ export function unpackReveal(revealedData_packed: string[]): string[] { const bytesCount = [31, 31, 28]; // nb of bytes in each of the first three field elements const bytesArray = revealedData_packed_formatted.flatMap((element: string, index: number) => { - const bytes = bytesCount[index]; - const elementBigInt = BigInt(element); - const byteMask = BigInt(255); // 0xFF - - const bytesOfElement = [...Array(bytes)].map((_, byteIndex) => { - return (elementBigInt >> (BigInt(byteIndex) * BigInt(8))) & byteMask; - }); - return bytesOfElement; + const bytes = bytesCount[index]; + const elementBigInt = BigInt(element); + const byteMask = BigInt(255); // 0xFF + + const bytesOfElement = [...Array(bytes)].map((_, byteIndex) => { + return (elementBigInt >> (BigInt(byteIndex) * BigInt(8))) & byteMask; + }); + return bytesOfElement; }); return bytesArray.map((byte: bigint) => String.fromCharCode(Number(byte))); diff --git a/contracts/contracts/ProofOfPassportRegister.sol b/contracts/contracts/ProofOfPassportRegister.sol index a14d7329..a22cde03 100644 --- a/contracts/contracts/ProofOfPassportRegister.sol +++ b/contracts/contracts/ProofOfPassportRegister.sol @@ -92,15 +92,11 @@ contract ProofOfPassportRegister is IRegister, Ownable { if (bytes32(proof.attestation_id) != attestationId) { revert("Register__InvalidAttestationId"); } - if ( - !verifyProof( - proof, - proof_csca, - signature_algorithm, - signature_algorithm_csca - ) - ) { - revert("Register__InvalidProof"); + if (!verifyProofRegister(proof, signature_algorithm)) { + revert("Register__InvalidProofRegister"); + } + if (!verifyProofCSCA(proof_csca, signature_algorithm_csca)) { + revert("Register__InvalidProofCSCA"); } if ( bytes32(proof.blinded_dsc_commitment) != @@ -120,14 +116,12 @@ contract ProofOfPassportRegister is IRegister, Ownable { ); } - function verifyProof( + function verifyProofRegister( RegisterProof calldata proof, - CSCAProof calldata proof_csca, - uint256 signature_algorithm, - uint256 signature_algorithm_csca + uint256 signature_algorithm ) public view override returns (bool) { - return - IVerifier(verifiers[signature_algorithm]).verifyProof( + bool register_proof_result = IVerifier(verifiers[signature_algorithm]) + .verifyProof( proof.a, proof.b, proof.c, @@ -137,16 +131,23 @@ contract ProofOfPassportRegister is IRegister, Ownable { uint(proof.commitment), uint(proof.attestation_id) ] - ) && - IVerifierCSCA(cscaVerifier[signature_algorithm_csca]).verifyProof( - proof_csca.a, - proof_csca.b, - proof_csca.c, - [ - uint(proof_csca.blinded_dsc_commitment), - uint(proof_csca.merkle_root) - ] ); + return register_proof_result; + } + + function verifyProofCSCA( + CSCAProof calldata proof, + uint256 signature_algorithm_csca + ) public view override returns (bool) { + bool csca_proof_result = IVerifierCSCA( + cscaVerifier[signature_algorithm_csca] + ).verifyProof( + proof.a, + proof.b, + proof.c, + [uint(proof.blinded_dsc_commitment), uint(proof.merkle_root)] + ); + return csca_proof_result; } function _addCommitment(uint256 commitment) internal { diff --git a/contracts/contracts/Verifier_disclose.sol b/contracts/contracts/Verifier_disclose.sol index 96fbf9c4..8cc81bef 100644 --- a/contracts/contracts/Verifier_disclose.sol +++ b/contracts/contracts/Verifier_disclose.sol @@ -37,10 +37,10 @@ contract Verifier_disclose { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 17557865657217054151399710026819127874171362865266657132072043760282335721027; - uint256 constant deltax2 = 6942436740229168666595536581519256291593117600832247164924519038970269461046; - uint256 constant deltay1 = 866803245463331646327183913175583329159450203348438102150009828684148559895; - uint256 constant deltay2 = 15629082942757783052734933529055204330846116501031658743204188522840567440030; + uint256 constant deltax1 = 15676203424747222008362998300678870836264175060817282396863626616184454326330; + uint256 constant deltax2 = 8595392371605829087851094594557910940660445712429027269022585227622642504554; + uint256 constant deltay1 = 12203872594051358924092008745444424746295079999395247253358361977634312297663; + uint256 constant deltay2 = 12761630983022770637435884556671821605356660389025801528165040076412407626174; uint256 constant IC0x = 10998553002727424987884583305349753345629818748955483305954960876370686844925; diff --git a/contracts/contracts/Verifier_register_sha1WithRSAEncryption_65537.sol b/contracts/contracts/Verifier_register_sha1WithRSAEncryption_65537.sol index 63992e48..8c42aa14 100644 --- a/contracts/contracts/Verifier_register_sha1WithRSAEncryption_65537.sol +++ b/contracts/contracts/Verifier_register_sha1WithRSAEncryption_65537.sol @@ -37,26 +37,26 @@ contract Verifier_register_sha1WithRSAEncryption_65537 { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 13155179383413945275687042601864057745717821721437680053026365184572594484550; - uint256 constant deltax2 = 13419763754509431879614817407927849049139910459488314935101788246897460635978; - uint256 constant deltay1 = 21461827286215648586210619400681535578437522448486174192703397303023830118552; - uint256 constant deltay2 = 12737898342805752317935622271701172371990602062953535674427676773537602957073; + uint256 constant deltax1 = 18253612257067907544176772960107463272624812993732140062961899640928066456080; + uint256 constant deltax2 = 17318353882487500984282554464840296751913352404012464994030577338417525343971; + uint256 constant deltay1 = 721186767351735401414914095792921248540353988754079694804425043629944474130; + uint256 constant deltay2 = 8641160395086880158290557415208090358351831755246287088136583424620790058222; - uint256 constant IC0x = 19950267415749769872984420635469219689637916763338714397594201219209357028767; - uint256 constant IC0y = 11341752974833232963273183460328031645291254337522467099721253089381997536320; + uint256 constant IC0x = 1014191657240367827160282284111839866462582312274715702627427091205567946886; + uint256 constant IC0y = 20064777062727594410930852533508532096138075748869034434640217278789575366962; - uint256 constant IC1x = 11343271873447077701345513372787017979035448895799705910074152336406632103014; - uint256 constant IC1y = 15291140079645029904975407443517463786063189008869473596208133516803303710125; + uint256 constant IC1x = 8040733382730768800444374594157736147847832041657938614863886123469540225889; + uint256 constant IC1y = 15176962615443332259650291303258627816076442767778878415428831772797210231229; - uint256 constant IC2x = 6292918500439751291901422848995771412468846049104271000519437364662679332041; - uint256 constant IC2y = 1878279471168197263319180659589173388877997868101930670989411481503721284369; + uint256 constant IC2x = 11540868305335161307326358835675297677768222525355131845910993931594882318691; + uint256 constant IC2y = 2733531636908192599307790060017802843953773596015693191555967489792529852910; - uint256 constant IC3x = 19090924808474659577406284164688929291816288947267788776359044398392811107731; - uint256 constant IC3y = 13853769554127135937032588662814446560788563521681976738789630741456776650960; + uint256 constant IC3x = 4726489574882911673974820746815872571311765544934541335124510833035518984566; + uint256 constant IC3y = 9959433282395160106486758522716112395005767937241995683289413508988346901679; - uint256 constant IC4x = 10289494778834425299665842959201067528454414592551242737919429067761473110056; - uint256 constant IC4y = 10819880897088345060810729932987810005442991406854600436496172825722441835954; + uint256 constant IC4x = 2726107064980905793685456391217077600902590214827304503877626599879070362829; + uint256 constant IC4y = 20809786446816938445294209618344975739842207809116419224037622667595617959803; // Memory data diff --git a/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol b/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol index 8da2d848..2cf80ca4 100644 --- a/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol +++ b/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol @@ -22,58 +22,87 @@ pragma solidity >=0.7.0 <0.9.0; contract Verifier_register_sha256WithRSAEncryption_65537 { // Scalar field size - uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant r = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Base field size - uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + uint256 constant q = + 21888242871839275222246405745257275088696311157297823662689037894645226208583; // Verification Key data - uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042; - uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958; - uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132; - uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731; - uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679; - uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856; - uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 1037380972141538745399950553909330149820502317843211086553895175257817779372; - uint256 constant deltax2 = 1740815875839241540332417489268947801829496353730386086007108179404337117013; - uint256 constant deltay1 = 6307674282939481529797944800746136626548126296541382914082037305183098846296; - uint256 constant deltay2 = 20598922041836569438727926608870745752734230776330209767048604424081248826810; - - - uint256 constant IC0x = 9720091360134047110754097159401493796660543288592018718226493514433640874991; - uint256 constant IC0y = 9816797761738028831499868308538515271427588347801916552504443254539173856438; - - uint256 constant IC1x = 8321344198478472159116798038892978501539506318034192464536707151301617026931; - uint256 constant IC1y = 5162036085088930928154136912718425414931610304133625063308206440957516700168; - - uint256 constant IC2x = 13177356501445995293332798335857864829950196156174960167346472326702069056696; - uint256 constant IC2y = 10123754129821780550611152311412848695235565741848206360569448620207136999663; - - uint256 constant IC3x = 15800750648534882001293098141511862547516231817837268745140708055565406852893; - uint256 constant IC3y = 3111875870276149539313318494349104168321847784629653817811461001326987877496; - - uint256 constant IC4x = 11374553600031801461260163829101393652119031120393018855112829004013226583739; - uint256 constant IC4y = 11948013189599962904927300285557649747124295332223275928752245757162896852086; - - + uint256 constant alphax = + 20491192805390485299153009773594534940189261866228447918068658471970481763042; + uint256 constant alphay = + 9383485363053290200918347156157836566562967994039712273449902621266178545958; + uint256 constant betax1 = + 4252822878758300859123897981450591353533073413197771768651442665752259397132; + uint256 constant betax2 = + 6375614351688725206403948262868962793625744043794305715222011528459656738731; + uint256 constant betay1 = + 21847035105528745403288232691147584728191162732299865338377159692350059136679; + uint256 constant betay2 = + 10505242626370262277552901082094356697409835680220590971873171140371331206856; + uint256 constant gammax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = + 1037380972141538745399950553909330149820502317843211086553895175257817779372; + uint256 constant deltax2 = + 1740815875839241540332417489268947801829496353730386086007108179404337117013; + uint256 constant deltay1 = + 6307674282939481529797944800746136626548126296541382914082037305183098846296; + uint256 constant deltay2 = + 20598922041836569438727926608870745752734230776330209767048604424081248826810; + + uint256 constant IC0x = + 9720091360134047110754097159401493796660543288592018718226493514433640874991; + uint256 constant IC0y = + 9816797761738028831499868308538515271427588347801916552504443254539173856438; + + uint256 constant IC1x = + 8321344198478472159116798038892978501539506318034192464536707151301617026931; + uint256 constant IC1y = + 5162036085088930928154136912718425414931610304133625063308206440957516700168; + + uint256 constant IC2x = + 13177356501445995293332798335857864829950196156174960167346472326702069056696; + uint256 constant IC2y = + 10123754129821780550611152311412848695235565741848206360569448620207136999663; + + uint256 constant IC3x = + 15800750648534882001293098141511862547516231817837268745140708055565406852893; + uint256 constant IC3y = + 3111875870276149539313318494349104168321847784629653817811461001326987877496; + + uint256 constant IC4x = + 11374553600031801461260163829101393652119031120393018855112829004013226583739; + uint256 constant IC4y = + 11948013189599962904927300285557649747124295332223275928752245757162896852086; + // Memory data uint16 constant pVk = 0; uint16 constant pPairing = 128; uint16 constant pLastMem = 896; - function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[4] calldata _pubSignals) public view returns (bool) { + function verifyProof( + uint[2] calldata _pA, + uint[2][2] calldata _pB, + uint[2] calldata _pC, + uint[4] calldata _pubSignals + ) public view returns (bool) { assembly { function checkField(v) { - if iszero(lt(v, q)) { + if iszero(lt(v, r)) { mstore(0, 0) return(0, 0x20) } } - + // G1 function to multiply a G1 value(x,y) to value in an address function g1_mulAccC(pR, x, y, s) { let success @@ -108,19 +137,21 @@ contract Verifier_register_sha256WithRSAEncryption_65537 { mstore(add(_pVk, 32), IC0y) // Compute the linear combination vk_x - + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - // -A mstore(_pPairing, calldataload(pA)) - mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + mstore( + add(_pPairing, 32), + mod(sub(q, calldataload(add(pA, 32))), q) + ) // B mstore(add(_pPairing, 64), calldataload(pB)) @@ -142,7 +173,6 @@ contract Verifier_register_sha256WithRSAEncryption_65537 { mstore(add(_pPairing, 384), mload(add(pMem, pVk))) mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) - // gamma2 mstore(add(_pPairing, 448), gammax1) mstore(add(_pPairing, 480), gammax2) @@ -159,8 +189,14 @@ contract Verifier_register_sha256WithRSAEncryption_65537 { mstore(add(_pPairing, 704), deltay1) mstore(add(_pPairing, 736), deltay2) - - let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + let success := staticcall( + sub(gas(), 2000), + 8, + _pPairing, + 768, + _pPairing, + 0x20 + ) isOk := and(success, mload(_pPairing)) } @@ -169,23 +205,22 @@ contract Verifier_register_sha256WithRSAEncryption_65537 { mstore(0x40, add(pMem, pLastMem)) // Validate that all evaluations ∈ F - + checkField(calldataload(add(_pubSignals, 0))) - + checkField(calldataload(add(_pubSignals, 32))) - + checkField(calldataload(add(_pubSignals, 64))) - + checkField(calldataload(add(_pubSignals, 96))) - + checkField(calldataload(add(_pubSignals, 128))) - // Validate all evaluations let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) mstore(0, isValid) - return(0, 0x20) - } - } - } + return(0, 0x20) + } + } +} diff --git a/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol.save b/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol.save new file mode 100644 index 00000000..692e9757 --- /dev/null +++ b/contracts/contracts/Verifier_register_sha256WithRSAEncryption_65537.sol.save @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-3.0 +/* + Copyright 2021 0KIMS association. + + This file is generated with [snarkJS](https://github.com/iden3/snarkjs). + + snarkJS is a free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + snarkJS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with snarkJS. If not, see . +*/ + +pragma solidity >=0.7.0 <0.9.0; + +contract Verifier_register_sha256WithRSAEncryption_65537 { + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042; + uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958; + uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132; + uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731; + uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679; + uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856; + uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = 15594951545396927133821323111112838246440151372486640584540136770576637393038; + uint256 constant deltax2 = 16646501228722464486042890930566300897412243452681656199619061425330163109294; + uint256 constant deltay1 = 7391847066598204603635570301223858822745255584907407139867164202959899110336; + uint256 constant deltay2 = 16818942323013965805725851186284589299702074465619454314061881957166689439913; + + + uint256 constant IC0x = 9720091360134047110754097159401493796660543288592018718226493514433640874991; + uint256 constant IC0y = 9816797761738028831499868308538515271427588347801916552504443254539173856438; + + uint256 constant IC1x = 8321344198478472159116798038892978501539506318034192464536707151301617026931; + uint256 constant IC1y = 5162036085088930928154136912718425414931610304133625063308206440957516700168; + + uint256 constant IC2x = 13177356501445995293332798335857864829950196156174960167346472326702069056696; + uint256 constant IC2y = 10123754129821780550611152311412848695235565741848206360569448620207136999663; + + uint256 constant IC3x = 15800750648534882001293098141511862547516231817837268745140708055565406852893; + uint256 constant IC3y = 3111875870276149539313318494349104168321847784629653817811461001326987877496; + + uint256 constant IC4x = 11374553600031801461260163829101393652119031120393018855112829004013226583739; + uint256 constant IC4y = 11948013189599962904927300285557649747124295332223275928752245757162896852086; + + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[4] calldata _pubSignals) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, q)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } + } diff --git a/contracts/contracts/interfaces/IRegister.sol b/contracts/contracts/interfaces/IRegister.sol index 1242b1f4..29733c6f 100644 --- a/contracts/contracts/interfaces/IRegister.sol +++ b/contracts/contracts/interfaces/IRegister.sol @@ -9,7 +9,9 @@ interface IRegister { /// @notice Error thrown when the same nullifier is used more than once error Register__YouAreUsingTheSameNullifierTwice(); /// @notice Error thrown when the proof provided is invalid - error Register__InvalidProof(); + error Register__InvalidProofRegister(); + /// @notice Error thrown when the proof provided is invalid + error Register__InvalidProofCSCA(); /// @notice Error thrown when the signature algorithm provided is invalid error Register__InvalidSignatureAlgorithm(); /// @notice Error thrown when the verifier address is invalid @@ -65,10 +67,16 @@ interface IRegister { /// @notice Verifies a Register proof /// @param proof The Register proof to verify /// @return bool Returns true if the proof is valid, false otherwise - function verifyProof( + function verifyProofRegister( RegisterProof calldata proof, - CSCAProof calldata proof_csca, - uint256 signature_algorithm, + uint256 signature_algorithm + ) external view returns (bool); + + /// @notice Verifies a Register proof + /// @param proof The Register proof to verify + /// @return bool Returns true if the proof is valid, false otherwise + function verifyProofCSCA( + CSCAProof calldata proof, uint256 signature_algorithm_csca ) external view returns (bool); diff --git a/contracts/ignition/modules/Deploy_All.ts b/contracts/ignition/modules/Deploy_All.ts index ad54e46d..2ca27cb7 100644 --- a/contracts/ignition/modules/Deploy_All.ts +++ b/contracts/ignition/modules/Deploy_All.ts @@ -1,7 +1,6 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; import { formatRoot } from "../../../common/src/utils/utils"; import { generateCircuitInputsRegister } from "../../../common/src/utils/generateInputs"; -import { mockPassportData_sha256WithRSAEncryption_65537 } from "../../../common/src/utils/mockPassportData"; import { countryCodes, k_csca, n_csca } from "../../../common/src/constants/constants"; import { getCSCAModulusMerkleTree } from "../../../common/src/utils/csca"; @@ -15,11 +14,11 @@ export default buildModule("Deploy_Registry", (m) => { const register = m.contract("ProofOfPassportRegister", [registry], { libraries: { PoseidonT3: poseidonT3 } }); const Verifier_register_sha256WithRSAEncryption_65537 = m.contract("Verifier_register_sha256WithRSAEncryption_65537"); const Verifier_register_sha1WithRSAEncryption_65537 = m.contract("Verifier_register_sha1WithRSAEncryption_65537"); - const Verifier_dsc_4096 = m.contract("Verifier_dsc_4096"); + const Verifier_dsc_sha256_rsa_4096 = m.contract("Verifier_dsc_sha256_rsa_4096"); m.call(register, "addSignatureAlgorithm", [1, Verifier_register_sha256WithRSAEncryption_65537], { id: "a" }); m.call(register, "addSignatureAlgorithm", [3, Verifier_register_sha1WithRSAEncryption_65537], { id: "b" }); - m.call(register, "addCSCAVerifier", [1, Verifier_dsc_4096], { id: "c" }); + m.call(register, "addCSCAVerifier", [1, Verifier_dsc_sha256_rsa_4096], { id: "c" }); const verifier_disclose = m.contract("Verifier_disclose"); const sbt = m.contract("SBT", [verifier_disclose, formatter, register]); diff --git a/contracts/ignition/modules/scripts/update_merkle_root copy.ts b/contracts/ignition/modules/scripts/update_merkle_root copy.ts new file mode 100644 index 00000000..a8b99c0d --- /dev/null +++ b/contracts/ignition/modules/scripts/update_merkle_root copy.ts @@ -0,0 +1,15 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import { getCSCAModulusMerkleTree } from "../../../../common/src/utils/csca"; +import { formatRoot } from "../../../../common/src/utils/utils"; + +module.exports = buildModule("UpdateMerkleRoot", (m) => { + + const registryAddress = "0xBabF700EdE592Aa69e14B5BAE1859ee4164C3323"; + + const deployedRocketInstance = m.contractAt("Registry", registryAddress); + console.log("Deployed registry instance", deployedRocketInstance); + const merkleRoot = formatRoot(getCSCAModulusMerkleTree().root); + console.log("Merkle root", merkleRoot); + m.call(deployedRocketInstance, "update", [merkleRoot]); + return { deployedRocketInstance }; +}); \ No newline at end of file diff --git a/contracts/ignition/modules/scripts/update_merkle_root.ts b/contracts/ignition/modules/scripts/update_merkle_root.ts new file mode 100644 index 00000000..a8b99c0d --- /dev/null +++ b/contracts/ignition/modules/scripts/update_merkle_root.ts @@ -0,0 +1,15 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import { getCSCAModulusMerkleTree } from "../../../../common/src/utils/csca"; +import { formatRoot } from "../../../../common/src/utils/utils"; + +module.exports = buildModule("UpdateMerkleRoot", (m) => { + + const registryAddress = "0xBabF700EdE592Aa69e14B5BAE1859ee4164C3323"; + + const deployedRocketInstance = m.contractAt("Registry", registryAddress); + console.log("Deployed registry instance", deployedRocketInstance); + const merkleRoot = formatRoot(getCSCAModulusMerkleTree().root); + console.log("Merkle root", merkleRoot); + m.call(deployedRocketInstance, "update", [merkleRoot]); + return { deployedRocketInstance }; +}); \ No newline at end of file diff --git a/contracts/ignition/modules/scripts/update_verifier.ts b/contracts/ignition/modules/scripts/update_verifier.ts new file mode 100644 index 00000000..a8b99c0d --- /dev/null +++ b/contracts/ignition/modules/scripts/update_verifier.ts @@ -0,0 +1,15 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import { getCSCAModulusMerkleTree } from "../../../../common/src/utils/csca"; +import { formatRoot } from "../../../../common/src/utils/utils"; + +module.exports = buildModule("UpdateMerkleRoot", (m) => { + + const registryAddress = "0xBabF700EdE592Aa69e14B5BAE1859ee4164C3323"; + + const deployedRocketInstance = m.contractAt("Registry", registryAddress); + console.log("Deployed registry instance", deployedRocketInstance); + const merkleRoot = formatRoot(getCSCAModulusMerkleTree().root); + console.log("Merkle root", merkleRoot); + m.call(deployedRocketInstance, "update", [merkleRoot]); + return { deployedRocketInstance }; +}); \ No newline at end of file diff --git a/contracts/package.json b/contracts/package.json index cc0b7d49..99c9bbba 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,5 +1,10 @@ { "name": "hardhat-project", + "scripts": { + "test": "npx hardhat test", + "deploy_all": "npx hardhat ignition deploy ignition/modules/Deploy_All.ts --network optimism --verify", + "compile": "npx hardhat compile" + }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.6", "@nomicfoundation/hardhat-ethers": "^3.0.5", @@ -16,7 +21,7 @@ "@types/snarkjs": "^0.7.7", "chai": "^4.4.1", "ethers": "^6.12.1", - "hardhat": "^2.22.3", + "hardhat": "^2.22.6", "hardhat-gas-reporter": "^1.0.10", "solidity-coverage": "^0.8.12", "ts-node": "^10.9.1", @@ -42,4 +47,4 @@ "poseidon-solidity": "^0.0.5", "snarkjs": "^0.7.1" } -} +} \ No newline at end of file diff --git a/contracts/test/RegisterAndDisclose.ts b/contracts/test/RegisterAndDisclose.ts index 63b1bed7..f82ceb9f 100644 --- a/contracts/test/RegisterAndDisclose.ts +++ b/contracts/test/RegisterAndDisclose.ts @@ -1,7 +1,7 @@ import { expect, assert } from "chai"; import { ethers } from "hardhat"; // import { describe } from "mocha"; -import { mockPassportData_sha256WithRSASSAPSS_65537, mockPassportData_sha1WithRSAEncryption_65537, mockPassportData_sha256WithRSAEncryption_65537 } from "../../common/src/utils/mockPassportData"; +import { mockPassportData_sha256_rsa_65537, mockPassportData_sha1_rsa_65537, } from "../../common/src/constants/mockPassportData"; import { countryCodes, PASSPORT_ATTESTATION_ID, SignatureAlgorithm } from "../../common/src/constants/constants"; import { formatRoot } from "../../common/src/utils/utils"; import { groth16 } from 'snarkjs' @@ -12,14 +12,11 @@ import fs from 'fs'; import { LeanIMT } from "@zk-kit/lean-imt"; import { poseidon2 } from "poseidon-lite"; import { Signer } from "ethers"; -import { getCSCAInputs } from "../../common/src/utils/csca"; +import { getCSCAInputs, getCSCAModulusMerkleTree } from "../../common/src/utils/csca"; import forge from "node-forge"; -import { mock_csca_sha256_rsa_4096, mock_dsc_sha256_rsa_4096 } from '../../common/src/constants/mockCertificates'; +import { mock_csca_sha256_rsa_4096, mock_dsc_sha256_rsa_4096, mock_dsc_sha1_rsa_4096, mock_csca_sha1_rsa_4096 } from '../../common/src/constants/mockCertificates'; -//const mock_dsc_sha256_rsa_4096 = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_4096/mock_dsc.pem', 'utf8'); -//const mock_csca_sha256_rsa_4096 = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_4096/mock_csca.pem', 'utf8'); - -type RegisterCircuitArtifacts = { +type CircuitArtifacts = { [key: string]: { wasm: string, zkey: string, @@ -35,18 +32,19 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () this.timeout(0); let proof, publicSignals; + let proof_dsc - const register_circuits: RegisterCircuitArtifacts = { + const register_circuits: CircuitArtifacts = { sha256WithRSAEncryption_65537: { wasm: "../circuits/build/register_sha256WithRSAEncryption_65537_js/register_sha256WithRSAEncryption_65537.wasm", zkey: "../circuits/build/register_sha256WithRSAEncryption_65537_final.zkey", vkey: "../circuits/build/register_sha256WithRSAEncryption_65537_vkey.json" }, - // sha1WithRSAEncryption_65537: { - // wasm: "../circuits/build/register_sha1WithRSAEncryption_65537_js/register_sha1WithRSAEncryption_65537.wasm", - // zkey: "../circuits/build/register_sha1WithRSAEncryption_65537_final.zkey", - // vkey: "../circuits/build/register_sha1WithRSAEncryption_65537_vkey.json" - // }, + sha1WithRSAEncryption_65537: { + wasm: "../circuits/build/register_sha1WithRSAEncryption_65537_js/register_sha1WithRSAEncryption_65537.wasm", + zkey: "../circuits/build/register_sha1WithRSAEncryption_65537_final.zkey", + vkey: "../circuits/build/register_sha1WithRSAEncryption_65537_vkey.json" + }, // sha256WithRSASSAPSS_65537: { // wasm: "../circuits/build/register_sha256WithRSASSAPSS_65537_js/register_sha256WithRSASSAPSS_65537.wasm", // zkey: "../circuits/build/register_sha256WithRSASSAPSS_65537_final.zkey", @@ -54,29 +52,32 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () // } } - const path_dsc_wasm = "../circuits/build/dsc_4096_js/dsc_4096.wasm"; - const path_dsc_zkey = "../circuits/build/dsc_4096_final.zkey"; - const path_dsc_vkey = "../circuits/build/dsc_4096_vkey.json"; + const dsc_circuits: CircuitArtifacts = { + sha256WithRSAEncryption_65537: { + wasm: "../circuits/build/dsc_sha256_rsa_4096_js/dsc_sha256_rsa_4096.wasm", + zkey: "../circuits/build/dsc_sha256_rsa_4096_final.zkey", + vkey: "../circuits/build/dsc_sha256_rsa_4096_vkey.json" + }, + sha1WithRSAEncryption_65537: { + wasm: "../circuits/build/dsc_sha1_rsa_4096_js/dsc_sha1_rsa_4096.wasm", + zkey: "../circuits/build/dsc_sha1_rsa_4096_final.zkey", + vkey: "../circuits/build/dsc_sha1_rsa_4096_vkey.json" + } + } const path_disclose_wasm = "../circuits/build/disclose_js/disclose.wasm"; const path_disclose_zkey = "../circuits/build/disclose_final.zkey"; const path_disclose_vkey = "../circuits/build/disclose_vkey.json"; - // Smart contracts - let Verifier_register: any, verifier_register: any, Registry: any, Formatter: any, Register: any, Verifier_disclose: any, SBT: any, PoseidonT3: any; - let Verifier_dsc: any, verifier_dsc: any, parsedCallData_dsc: any[], formattedCallData_dsc: any; - const n_dsc = 121; const k_dsc = 17; const n_csca = 121; const k_csca = 34; const max_cert_bytes = 1664; - const dscCert = forge.pki.certificateFromPem(mock_dsc_sha256_rsa_4096); - const cscaCert = forge.pki.certificateFromPem(mock_csca_sha256_rsa_4096); - let inputs_csca = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); - let parsedCallData_csca: any; - let formattedCallData_csca: any; - // console.log(inputs_csca); + const dscCert_sha256 = forge.pki.certificateFromPem(mock_dsc_sha256_rsa_4096); + const cscaCert_sha256 = forge.pki.certificateFromPem(mock_csca_sha256_rsa_4096); + const dscCert_sha1 = forge.pki.certificateFromPem(mock_dsc_sha1_rsa_4096); + const cscaCert_sha1 = forge.pki.certificateFromPem(mock_csca_sha1_rsa_4096); let user_identifier, current_date; let registry: any, formatter: any, register: any, verifier_disclose: any, sbt: any, poseidonT3: any @@ -85,7 +86,7 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () let bitmap, scope, user_address, majority, input_disclose: any; let proof_disclose, publicSignals_disclose, proof_result_disclose, vkey_disclose, verified_disclose: any, rawCallData_disclose, parsedCallData_disclose: any[], formattedCallData_disclose: any; - let proof_csca, publicSignals_csca: any; + //let proof_csca, publicSignals_csca: any; let secret: string = BigInt(0).toString(); let attestation_id: string = PASSPORT_ATTESTATION_ID; @@ -99,27 +100,32 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () register_circuits.sha256WithRSAEncryption_65537.inputs = generateCircuitInputsRegister( secret, - BigInt(0).toString(), + secret, attestation_id, - mockPassportData_sha256WithRSAEncryption_65537, + mockPassportData_sha256_rsa_65537, + n_dsc, + k_dsc + ); + register_circuits.sha1WithRSAEncryption_65537.inputs = generateCircuitInputsRegister( + secret, + secret, + attestation_id, + mockPassportData_sha1_rsa_65537, n_dsc, k_dsc - ); - console.log("inputs signature length", register_circuits.sha256WithRSAEncryption_65537.inputs.signature.length); - // register_circuits.sha1WithRSAEncryption_65537.inputs = generateCircuitInputsRegister( - // secret, - // attestation_id, - // mockPassportData_sha1WithRSAEncryption_65537, - // ); + dsc_circuits.sha256WithRSAEncryption_65537.inputs = getCSCAInputs(BigInt(0).toString(), dscCert_sha256, cscaCert_sha256, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); + dsc_circuits.sha1WithRSAEncryption_65537.inputs = getCSCAInputs(BigInt(0).toString(), dscCert_sha1, cscaCert_sha1, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); + + // register_circuits.sha256WithRSASSAPSS_65537.inputs = generateCircuitInputsRegister( // secret, // attestation_id, // mockPassportData_sha256WithRSASSAPSS_65537, // ); - console.log("inputs", register_circuits.sha256WithRSAEncryption_65537.inputs); + //console.log("inputs", register_circuits.sha256WithRSAEncryption_65537.inputs); /*** Deploy contracts ***/ await deployContracts(); @@ -141,10 +147,17 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () }; } - Verifier_dsc = await ethers.getContractFactory("Verifier_dsc_4096"); - verifier_dsc = await Verifier_dsc.deploy(); - await verifier_dsc.waitForDeployment(); - console.log('\x1b[34m%s\x1b[0m', `Verifier_dsc deployed to ${verifier_dsc.target}`); + const Verifier_dsc_sha256_rsa_4096 = await ethers.getContractFactory("Verifier_dsc_sha256_rsa_4096"); + const verifier_dsc_sha256_rsa_4096 = await Verifier_dsc_sha256_rsa_4096.deploy(); + await verifier_dsc_sha256_rsa_4096.waitForDeployment(); + dsc_circuits.sha256WithRSAEncryption_65537.verifier = verifier_dsc_sha256_rsa_4096; + console.log('\x1b[34m%s\x1b[0m', `Verifier_dsc_sha256_rsa_4096 deployed to ${verifier_dsc_sha256_rsa_4096.target}`); + + const Verifier_dsc_sha1_rsa_4096 = await ethers.getContractFactory("Verifier_dsc_sha1_rsa_4096"); + const verifier_dsc_sha1_rsa_4096 = await Verifier_dsc_sha1_rsa_4096.deploy(); + await verifier_dsc_sha1_rsa_4096.waitForDeployment(); + dsc_circuits.sha1WithRSAEncryption_65537.verifier = verifier_dsc_sha1_rsa_4096; + console.log('\x1b[34m%s\x1b[0m', `Verifier_dsc_sha1_rsa_4096 deployed to ${verifier_dsc_sha1_rsa_4096.target}`); const Verifier_register_sha256WithRSAEncryption_65537 = await ethers.getContractFactory("Verifier_register_sha256WithRSAEncryption_65537"); const verifier_register_sha256WithRSAEncryption_65537 = await Verifier_register_sha256WithRSAEncryption_65537.deploy(deployOptions); @@ -152,11 +165,11 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () register_circuits.sha256WithRSAEncryption_65537.verifier = verifier_register_sha256WithRSAEncryption_65537; console.log('\x1b[34m%s\x1b[0m', `Verifier_register_sha256WithRSAEncryption_65537 deployed to ${verifier_register_sha256WithRSAEncryption_65537.target}`); - // const Verifier_register_sha1WithRSAEncryption_65537 = await ethers.getContractFactory("Verifier_register_sha1WithRSAEncryption_65537"); - // const verifier_register_sha1WithRSAEncryption_65537 = await Verifier_register_sha1WithRSAEncryption_65537.deploy(deployOptions); - // await verifier_register_sha1WithRSAEncryption_65537.waitForDeployment(); - // register_circuits.sha1WithRSAEncryption_65537.verifier = verifier_register_sha1WithRSAEncryption_65537; - // console.log('\x1b[34m%s\x1b[0m', `Verifier_register_sha1WithRSAEncryption_65537 deployed to ${verifier_register_sha1WithRSAEncryption_65537.target}`); + const Verifier_register_sha1WithRSAEncryption_65537 = await ethers.getContractFactory("Verifier_register_sha1WithRSAEncryption_65537"); + const verifier_register_sha1WithRSAEncryption_65537 = await Verifier_register_sha1WithRSAEncryption_65537.deploy(deployOptions); + await verifier_register_sha1WithRSAEncryption_65537.waitForDeployment(); + register_circuits.sha1WithRSAEncryption_65537.verifier = verifier_register_sha1WithRSAEncryption_65537; + console.log('\x1b[34m%s\x1b[0m', `Verifier_register_sha1WithRSAEncryption_65537 deployed to ${verifier_register_sha1WithRSAEncryption_65537.target}`); // const Verifier_register_sha256WithRSASSAPSS_65537 = await ethers.getContractFactory("Verifier_register_sha256WithRSASSAPSS_65537"); // const verifier_register_sha256WithRSASSAPSS_65537 = await Verifier_register_sha256WithRSASSAPSS_65537.deploy(deployOptions); @@ -171,7 +184,8 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () console.log('\x1b[34m%s\x1b[0m', `Formatter deployed to ${formatter.target}`); const Registry = await ethers.getContractFactory("Registry"); - registry = await Registry.deploy(formatRoot(inputs_csca.merkle_root.toString()), deployOptions); + const merkleTree = getCSCAModulusMerkleTree(); + registry = await Registry.deploy(formatRoot(merkleTree.root), deployOptions); await registry.waitForDeployment(); console.log('\x1b[34m%s\x1b[0m', `Registry deployed to ${registry.target}`); @@ -190,7 +204,7 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () await register.waitForDeployment(); console.log('\x1b[34m%s\x1b[0m', `Register deployed to ${register.target}`); - console.log("register merkle root:", await registry.getMerkleRoot()); + // console.log("register merkle root:", await registry.getMerkleRoot()); const Verifier_disclose = await ethers.getContractFactory("Verifier_disclose"); verifier_disclose = await Verifier_disclose.deploy(deployOptions); @@ -198,9 +212,9 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () console.log('\x1b[34m%s\x1b[0m', `Verifier_disclose deployed to ${verifier_disclose.target}`); await register.addSignatureAlgorithm(SignatureAlgorithm["sha256WithRSAEncryption_65537"], verifier_register_sha256WithRSAEncryption_65537.target); - await register.addCSCAVerifier(SignatureAlgorithm["sha256WithRSAEncryption_65537"], verifier_dsc.target); - // await register.addSignatureAlgorithm(SignatureAlgorithm["sha1WithRSAEncryption_65537"], verifier_register_sha1WithRSAEncryption_65537.target); - // await register.addSignatureAlgorithm(SignatureAlgorithm["sha256WithRSASSAPSS_65537"], verifier_register_sha256WithRSASSAPSS_65537.target); + await register.addCSCAVerifier(SignatureAlgorithm["sha256WithRSAEncryption_65537"], verifier_dsc_sha256_rsa_4096.target); + await register.addSignatureAlgorithm(SignatureAlgorithm["sha1WithRSAEncryption_65537"], verifier_register_sha1WithRSAEncryption_65537.target); + await register.addCSCAVerifier(SignatureAlgorithm["sha1WithRSAEncryption_65537"], verifier_dsc_sha1_rsa_4096.target); const SBT = await ethers.getContractFactory("SBT"); sbt = await SBT.deploy( @@ -229,24 +243,28 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () /*** Register flow ***/ describe("Proof of Passport - Register flow", function () { - const sigAlgNames = ['sha256WithRSAEncryption_65537'] //, 'sha1WithRSAEncryption_65537', 'sha256WithRSASSAPSS_65537'] + const sigAlgNames = ['sha256WithRSAEncryption_65537', 'sha1WithRSAEncryption_65537'] //, 'sha1WithRSAEncryption_65537', 'sha256WithRSASSAPSS_65537'] before(async function () { await Promise.all(sigAlgNames.map(async (sigAlgName) => { - const sigAlgArtifacts = register_circuits[sigAlgName]; + const sigAlgArtifacts_register = register_circuits[sigAlgName]; /*** Groth16 saga Register***/ // Generate the proofs console.log('\x1b[32m%s\x1b[0m', `Generating proof csca - ${sigAlgName}`); - console.log("csc_modulus_length", inputs_csca.csca_modulus.length); + //console.log("csc_modulus_length", inputs_csca.inputs.csca_modulus.length); const proof_csca_result = await groth16.fullProve( - inputs_csca, - path_dsc_wasm, - path_dsc_zkey + dsc_circuits[sigAlgName].inputs.inputs, + dsc_circuits[sigAlgName].wasm, + dsc_circuits[sigAlgName].zkey ) - proof_csca = proof_csca_result.proof; - publicSignals_csca = proof_csca_result.publicSignals; + const proof_csca = proof_csca_result.proof; + const publicSignals_csca = proof_csca_result.publicSignals; + console.log('\x1b[32m%s\x1b[0m', `Proof generated csca - ${sigAlgName}`); - const vKey_csca = JSON.parse(fs.readFileSync(path_dsc_vkey) as unknown as string); + // console.log("proof_csca", proof_csca); + // console.log("publicSignals_csca", publicSignals_csca); + + const vKey_csca = JSON.parse(fs.readFileSync(dsc_circuits[sigAlgName].vkey) as unknown as string); const verified_csca = await groth16.verify( vKey_csca, publicSignals_csca, @@ -255,20 +273,19 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () assert(verified_csca == true, 'Should verify') console.log('\x1b[32m%s\x1b[0m', `Proof verified csca - ${sigAlgName}`); const rawCallData_csca = await groth16.exportSolidityCallData(proof_csca, publicSignals_csca); - parsedCallData_csca = JSON.parse(`[${rawCallData_csca}]`); - console.log('parsedCallData_csca', parsedCallData_csca); - formattedCallData_csca = formatCallData_dsc(parsedCallData_csca); - console.log('formattedCallData_csca', formattedCallData_csca); + dsc_circuits[sigAlgName].parsedCallData = JSON.parse(`[${rawCallData_csca}]`); + dsc_circuits[sigAlgName].formattedCallData = formatCallData_dsc(dsc_circuits[sigAlgName].parsedCallData); + //console.log('inputs', sigAlgArtifacts_register.inputs); console.log('\x1b[32m%s\x1b[0m', `Generating proof register - ${sigAlgName}`); ({ proof, publicSignals } = await groth16.fullProve( - sigAlgArtifacts.inputs, - sigAlgArtifacts.wasm, - sigAlgArtifacts.zkey + sigAlgArtifacts_register.inputs, + sigAlgArtifacts_register.wasm, + sigAlgArtifacts_register.zkey )) console.log('\x1b[32m%s\x1b[0m', `Proof generated register - ${sigAlgName}`); // Verify the proof - const vKey = JSON.parse(fs.readFileSync(sigAlgArtifacts.vkey) as unknown as string); + const vKey = JSON.parse(fs.readFileSync(sigAlgArtifacts_register.vkey) as unknown as string); const verified = await groth16.verify( vKey, publicSignals, @@ -292,45 +309,47 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () }); for (const sigAlgName of sigAlgNames) { - const sigAlgArtifacts = register_circuits[sigAlgName]; + const sigAlgArtifacts_register = register_circuits[sigAlgName]; + const sigAlgArtifacts_dsc = dsc_circuits[sigAlgName]; const sigAlgIndex = SignatureAlgorithm[sigAlgName as keyof typeof SignatureAlgorithm] it(`Verifier contract verifies a correct proof - Register - ${sigAlgName}`, async function () { expect( - await sigAlgArtifacts.verifier.verifyProof( - sigAlgArtifacts.parsedCallData[0], - sigAlgArtifacts.parsedCallData[1], - sigAlgArtifacts.parsedCallData[2], - sigAlgArtifacts.parsedCallData[3] + await sigAlgArtifacts_register.verifier.verifyProof( + sigAlgArtifacts_register.parsedCallData[0], + sigAlgArtifacts_register.parsedCallData[1], + sigAlgArtifacts_register.parsedCallData[2], + sigAlgArtifacts_register.parsedCallData[3] ) ).to.be.true; }); + it(`Verifier contract verifies a correct proof - DSC - ${sigAlgName}`, async function () { expect( - await verifier_dsc.verifyProof( - parsedCallData_csca[0], - parsedCallData_csca[1], - parsedCallData_csca[2], - parsedCallData_csca[3] + await sigAlgArtifacts_dsc.verifier.verifyProof( + sigAlgArtifacts_dsc.parsedCallData[0], + sigAlgArtifacts_dsc.parsedCallData[1], + sigAlgArtifacts_dsc.parsedCallData[2], + sigAlgArtifacts_dsc.parsedCallData[3] ) ).to.be.true; }); it(`Register with a wrong proof should fail - Register - ${sigAlgName}`, async function () { await expect(register - .validateProof({ ...sigAlgArtifacts.formattedCallData, a: [0, 0] }, formattedCallData_csca, sigAlgIndex, sigAlgIndex)) - .to.be.revertedWith("Register__InvalidProof"); + .validateProof({ ...sigAlgArtifacts_register.formattedCallData, a: [0, 0] }, sigAlgArtifacts_dsc.formattedCallData, sigAlgIndex, sigAlgIndex)) + .to.be.revertedWith("Register__InvalidProofRegister"); }); it(`Register with a wrong attestation id should fail - Register - ${sigAlgName}`, async function () { await expect(register - .validateProof({ ...sigAlgArtifacts.formattedCallData, attestation_id: "10" }, formattedCallData_csca, sigAlgIndex, sigAlgIndex)) + .validateProof({ ...sigAlgArtifacts_register.formattedCallData, attestation_id: "10" }, sigAlgArtifacts_dsc.formattedCallData, sigAlgIndex, sigAlgIndex)) .to.be.revertedWith("Register__InvalidAttestationId") }); it(`Register with a wrong signature algorithm should fail - Register - ${sigAlgName}`, async function () { await expect(register - .validateProof({ ...sigAlgArtifacts.formattedCallData }, formattedCallData_csca, sigAlgIndex + 1, sigAlgIndex)) + .validateProof({ ...sigAlgArtifacts_register.formattedCallData }, sigAlgArtifacts_dsc.formattedCallData, sigAlgIndex + 1, sigAlgIndex)) .to.be.revertedWith("Register__InvalidSignatureAlgorithm()") .catch(error => { assert(error.message.includes("Register__InvalidSignatureAlgorithm()"), "Expected revert with Register__InvalidSignatureAlgorithm(), but got another error"); @@ -339,14 +358,14 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () it(`Register with a wrong merkle root should fail - Register - ${sigAlgName}`, async function () { await expect(register - .validateProof(sigAlgArtifacts.formattedCallData, { ...formattedCallData_csca, merkle_root: 0 }, sigAlgIndex, sigAlgIndex)) + .validateProof(sigAlgArtifacts_register.formattedCallData, { ...sigAlgArtifacts_dsc.formattedCallData, merkle_root: 0 }, sigAlgIndex, sigAlgIndex)) .to.be.revertedWith("Register__InvalidMerkleRoot") }); it(`Register should succeed - Register - ${sigAlgName}`, async function () { await expect(register - .validateProof(sigAlgArtifacts.formattedCallData, formattedCallData_csca, sigAlgIndex, sigAlgIndex)).not.to.be.reverted; - imt.insert(BigInt(sigAlgArtifacts.formattedCallData.commitment)); + .validateProof(sigAlgArtifacts_register.formattedCallData, sigAlgArtifacts_dsc.formattedCallData, sigAlgIndex, sigAlgIndex)).not.to.be.reverted; + imt.insert(BigInt(sigAlgArtifacts_register.formattedCallData.commitment)); /// check if the merkle root is equal to the one from the imt // console.log('\x1b[34m%s\x1b[0m', `IMT Merkle root of TS Object - TS: ${imt.root}`); // console.log('\x1b[34m%s\x1b[0m', `Merkle root of contract - TSx: ${await register.getMerkleRoot()}`); @@ -357,7 +376,7 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () // it(`Register with the same proof should fail - Register - ${sigAlgName}`, async function () { // await expect(register - // .validateProof(sigAlgArtifacts.formattedCallData, sigAlgIndex)) + // .validateProof(sigAlgArtifacts_register.formattedCallData, sigAlgIndex)) // .to.be.revertedWith("Register__YouAreUsingTheSameNullifierTwice()") // .catch(error => { // assert(error.message.includes("Register__YouAreUsingTheSameNullifierTwice()"), "Expected revert with Register__YouAreUsingTheSameNullifierTwice(), but got another error"); @@ -368,99 +387,99 @@ describe("Proof of Passport - Contracts - Register & Disclose flow", function () /*** Disclose flow ***/ - describe("Proof of Passport - Disclose flow", function () { - this.beforeAll(async function () { - user_address = await thirdAccount.getAddress(); - // We only test with the sha256WithRSAEncryption_65537 commitment for now - - // refactor in generate inputs function - bitmap = Array(90).fill("1"); - scope = BigInt(1).toString(); - - majority = ["1", "8"]; - input_disclose = generateCircuitInputsDisclose( - register_circuits.sha256WithRSAEncryption_65537.inputs.secret, - register_circuits.sha256WithRSAEncryption_65537.inputs.attestation_id, - mockPassportData_sha256WithRSAEncryption_65537, - imt as any, - majority, - bitmap, - scope, - BigInt(user_address.toString()).toString() - ); - // Generate the proof - console.log('\x1b[32m%s\x1b[0m', 'Generating proof - Disclose'); - try { - proof_result_disclose = await groth16.fullProve( - input_disclose, - path_disclose_wasm, - path_disclose_zkey - ); - } catch (error) { - console.error("Error generating proof:", error); - throw error; - } - proof_disclose = proof_result_disclose.proof; - publicSignals_disclose = proof_result_disclose.publicSignals; - - console.log('\x1b[32m%s\x1b[0m', 'Proof generated - Disclose'); - // Verify the proof - vkey_disclose = JSON.parse(fs.readFileSync(path_disclose_vkey) as unknown as string); - verified_disclose = await groth16.verify( - vkey_disclose, - publicSignals_disclose, - proof_disclose - ) - console.log('\x1b[32m%s\x1b[0m', 'Proof verified - Disclose'); - rawCallData_disclose = await groth16.exportSolidityCallData(proof_disclose, publicSignals_disclose); - parsedCallData_disclose = JSON.parse(`[${rawCallData_disclose}]`); - formattedCallData_disclose = formatCallData_disclose(parsedCallData_disclose); - console.log('formattedCallData_disclose', formattedCallData_disclose); - - }) - - it("SBT mint should succeed - SBT", async function () { - await expect(sbt.mint(formattedCallData_disclose)) - .to.not.be.reverted; - }); - - - // // refactor in generate inputs function - // bitmap = Array(90).fill("1"); - // scope = BigInt(1).toString(); - // user_address = await thirdAccount.getAddress(); - // majority = ["1", "8"]; - // input_disclose = generateCircuitInputsDisclose( - // inputs.secret, - // inputs.attestation_id, - // passportData, - // imt as any, - // majority, - // bitmap, - // scope, - // BigInt(user_address.toString()).toString() - // ); - // // Generate the proof - // console.log('\x1b[32m%s\x1b[0m', 'Generating proof - Disclose'); - // try { - // proof_result_disclose = await groth16.fullProve( - // input_disclose, - // path_disclose_wasm, - // path_disclose_zkey - // ); - // } catch (error) { - // console.error("Error generating proof:", error); - // throw error; - // } - // proof_disclose = proof_result_disclose.proof; - // publicSignals_disclose = proof_result_disclose.publicSignals; - - - // assert(verified_disclose == true, 'Should verify') - - - - - - }); + // describe("Proof of Passport - Disclose flow", function () { + // this.beforeAll(async function () { + // user_address = await thirdAccount.getAddress(); + // // We only test with the sha256WithRSAEncryption_65537 commitment for now + + // // refactor in generate inputs function + // bitmap = Array(90).fill("1"); + // scope = BigInt(1).toString(); + + // majority = ["1", "8"]; + // input_disclose = generateCircuitInputsDisclose( + // register_circuits.sha256WithRSAEncryption_65537.inputs.secret, + // register_circuits.sha256WithRSAEncryption_65537.inputs.attestation_id, + // mockPassportData_sha256_rsa_65537, + // imt as any, + // majority, + // bitmap, + // scope, + // BigInt(user_address.toString()).toString() + // ); + // // Generate the proof + // console.log('\x1b[32m%s\x1b[0m', 'Generating proof - Disclose'); + // try { + // proof_result_disclose = await groth16.fullProve( + // input_disclose, + // path_disclose_wasm, + // path_disclose_zkey + // ); + // } catch (error) { + // console.error("Error generating proof:", error); + // throw error; + // } + // proof_disclose = proof_result_disclose.proof; + // publicSignals_disclose = proof_result_disclose.publicSignals; + + // console.log('\x1b[32m%s\x1b[0m', 'Proof generated - Disclose'); + // // Verify the proof + // vkey_disclose = JSON.parse(fs.readFileSync(path_disclose_vkey) as unknown as string); + // verified_disclose = await groth16.verify( + // vkey_disclose, + // publicSignals_disclose, + // proof_disclose + // ) + // console.log('\x1b[32m%s\x1b[0m', 'Proof verified - Disclose'); + // rawCallData_disclose = await groth16.exportSolidityCallData(proof_disclose, publicSignals_disclose); + // parsedCallData_disclose = JSON.parse(`[${rawCallData_disclose}]`); + // formattedCallData_disclose = formatCallData_disclose(parsedCallData_disclose); + // // console.log('formattedCallData_disclose', formattedCallData_disclose); + + // }) + + // it("SBT mint should succeed - SBT", async function () { + // await expect(sbt.mint(formattedCallData_disclose)) + // .to.not.be.reverted; + // }); + + + // // // refactor in generate inputs function + // // bitmap = Array(90).fill("1"); + // // scope = BigInt(1).toString(); + // // user_address = await thirdAccount.getAddress(); + // // majority = ["1", "8"]; + // // input_disclose = generateCircuitInputsDisclose( + // // inputs.secret, + // // inputs.attestation_id, + // // passportData, + // // imt as any, + // // majority, + // // bitmap, + // // scope, + // // BigInt(user_address.toString()).toString() + // // ); + // // // Generate the proof + // // console.log('\x1b[32m%s\x1b[0m', 'Generating proof - Disclose'); + // // try { + // // proof_result_disclose = await groth16.fullProve( + // // input_disclose, + // // path_disclose_wasm, + // // path_disclose_zkey + // // ); + // // } catch (error) { + // // console.error("Error generating proof:", error); + // // throw error; + // // } + // // proof_disclose = proof_result_disclose.proof; + // // publicSignals_disclose = proof_result_disclose.publicSignals; + + + // // assert(verified_disclose == true, 'Should verify') + + + + + + // }); }) diff --git a/contracts/yarn.lock b/contracts/yarn.lock index 50657216..eee91c73 100644 --- a/contracts/yarn.lock +++ b/contracts/yarn.lock @@ -544,53 +544,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/edr-darwin-arm64@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.0.tgz#bbb43f0e01f40839b0bd38c2c443cb6910ae955f" - integrity sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg== +"@nomicfoundation/edr-darwin-arm64@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.2.tgz#2ff98535f272c9f2a7d06eeda93fe7b207a348a4" + integrity sha512-S+hhepupfqpBvMa9M1PVS08sVjGXsLnjyAsjhrrsjsNuTHVLhKzhkguvBD5g4If5skrwgOaVqpag4wnQbd15kQ== -"@nomicfoundation/edr-darwin-x64@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.0.tgz#b1ffcd9142418fd8498de34a7336b3f977907c86" - integrity sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg== +"@nomicfoundation/edr-darwin-x64@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.2.tgz#001dcd0e7fa4c52046d283b0dc61e63a60c614dd" + integrity sha512-/zM94AUrXz6CmcsecRNHJ50jABDUFafmGc4iBmkfX/mTp4tVZj7XTyIogrQIt0FnTaeb4CgZoLap2+8tW/Uldg== -"@nomicfoundation/edr-linux-arm64-gnu@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.0.tgz#8173d16d4f6f2b3e82ba7096d2a1ea3619d8bfa7" - integrity sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ== +"@nomicfoundation/edr-linux-arm64-gnu@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.2.tgz#6d19f8265c8ffb22e29bc5bbbb5d1913fe4b306b" + integrity sha512-TV3Pr2tFvvmCfPCi9PaCGLtqn+oLaPKfL2NWpnoCeFFdzDQXi2L930yP1oUPY5RXd78NLdVHMkEkbhb2b6Wuvg== -"@nomicfoundation/edr-linux-arm64-musl@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.0.tgz#b1ce293a7c3e0d9f70391e1aef1a82b83b997567" - integrity sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg== +"@nomicfoundation/edr-linux-arm64-musl@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.2.tgz#0b01aa405fdc8048c7a8e95c737f29b437536a30" + integrity sha512-PALwrLBk1M9rolXyhSX8xdhe5jL0qf/PgiCIF7W7lUyVKrI/I0oiU0EHDk/Xw7yi2UJg4WRyhhZoHYa0g4g8Qg== -"@nomicfoundation/edr-linux-x64-gnu@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.0.tgz#4c12c4e4bfd3d837f5663ad7cbf7cb6d5634ef83" - integrity sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA== +"@nomicfoundation/edr-linux-x64-gnu@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.2.tgz#10959fd4db9b333d3e0559cb893e109611889af0" + integrity sha512-5svkftypDjAZ1LxV1onojlaqPRxrTEjJLkrUwLL+Fao5ZMe7aTnk5QQ1Jv76gW6WYZnMXNgjPhRcnw3oSNrqFA== -"@nomicfoundation/edr-linux-x64-musl@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.0.tgz#8842004aa1a47c504f10863687da28b65dca7baa" - integrity sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw== +"@nomicfoundation/edr-linux-x64-musl@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.2.tgz#8de64a2dfd869dad930dd0eb9572a0593d382379" + integrity sha512-qiMlXQTggdH9zfOB4Eil4rQ95z8s7QdLJcOfz5Aym12qJNkCyF9hi4cc4dDCWA0CdI3x3oLbuf8qb81SF8R45w== -"@nomicfoundation/edr-win32-x64-msvc@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.0.tgz#29d8bbb2edf9912a95f5453855cf17cdcb269957" - integrity sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A== +"@nomicfoundation/edr-win32-x64-msvc@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.2.tgz#13ad4bab9fd68853930e1a3d87c78d69d1d0e2ef" + integrity sha512-hDkAb0iaMmGYwBY/rA1oCX8VpsezfQcHPEPIEGXEcWC3WbnOgIZo0Qkpu/g0OMtFOJSQlWLXvKZuV7blhnrQag== -"@nomicfoundation/edr@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.4.0.tgz#4895ecb6ef321136db837458949c37cce4a29459" - integrity sha512-T96DMSogO8TCdbKKctvxfsDljbhFOUKWc9fHJhSeUh71EEho2qR4951LKQF7t7UWEzguVYh/idQr5L/E3QeaMw== +"@nomicfoundation/edr@^0.4.1": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.4.2.tgz#9d7550182d4f75d7510e265ebd3474c4f6fcb62a" + integrity sha512-U7v0HuZHfrsl/5FpUzuB2FYA0+FUglHHwiO6NhvLtNYKMZcPzdS6iUriMp/7GWs0SVxW3bAht9GinZPxdhVwWg== dependencies: - "@nomicfoundation/edr-darwin-arm64" "0.4.0" - "@nomicfoundation/edr-darwin-x64" "0.4.0" - "@nomicfoundation/edr-linux-arm64-gnu" "0.4.0" - "@nomicfoundation/edr-linux-arm64-musl" "0.4.0" - "@nomicfoundation/edr-linux-x64-gnu" "0.4.0" - "@nomicfoundation/edr-linux-x64-musl" "0.4.0" - "@nomicfoundation/edr-win32-x64-msvc" "0.4.0" + "@nomicfoundation/edr-darwin-arm64" "0.4.2" + "@nomicfoundation/edr-darwin-x64" "0.4.2" + "@nomicfoundation/edr-linux-arm64-gnu" "0.4.2" + "@nomicfoundation/edr-linux-arm64-musl" "0.4.2" + "@nomicfoundation/edr-linux-x64-gnu" "0.4.2" + "@nomicfoundation/edr-linux-x64-musl" "0.4.2" + "@nomicfoundation/edr-win32-x64-msvc" "0.4.2" "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" @@ -1754,10 +1754,10 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== concat-map@0.0.1: version "0.0.1" @@ -2356,17 +2356,6 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -2560,7 +2549,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -2595,14 +2584,14 @@ hardhat-gas-reporter@^1.0.10: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.22.3: - version "2.22.5" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.5.tgz#7e1a4311fa9e34a1cfe337784eae06706f6469a5" - integrity sha512-9Zq+HonbXCSy6/a13GY1cgHglQRfh4qkzmj1tpPlhxJDwNVnhxlReV6K7hCWFKlOrV13EQwsdcD0rjcaQKWRZw== +hardhat@^2.22.6: + version "2.22.6" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.6.tgz#d73caece246cd8219a1815554dabc31d400fa035" + integrity sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.4.0" + "@nomicfoundation/edr" "^0.4.1" "@nomicfoundation/ethereumjs-common" "4.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4" @@ -2636,7 +2625,7 @@ hardhat@^2.22.3: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" @@ -2985,13 +2974,6 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -3036,13 +3018,6 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -3661,7 +3636,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -3697,13 +3672,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -3889,18 +3857,16 @@ snarkjs@^0.7.1: logplease "^1.2.15" r1csfile "0.0.48" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" diff --git a/prover/tests/modal.test.ts b/prover/tests/modal.test.ts index 85b53c1b..bd969884 100644 --- a/prover/tests/modal.test.ts +++ b/prover/tests/modal.test.ts @@ -25,7 +25,7 @@ describe('MODAL PROVER', function () { this.timeout(0); // Disable timeout describe("SHA256 RSA", async () => { it("verify proof", async () => { - const circuitInputs = getCSCAInputs( + const inputs = getCSCAInputs( BigInt(0).toString(), dscCert_sha256_rsa, cscaCert_sha256_rsa, @@ -36,10 +36,6 @@ describe('MODAL PROVER', function () { max_cert_bytes, true ); - const inputs = { - "signature_algorithm": "sha256_rsa", - "inputs": circuitInputs - } //console.log(JSON.stringify(inputs)); console.log('\x1b[34msending request to modal server\x1b[0m'); const response = await sendCSCARequest(inputs); @@ -57,7 +53,7 @@ describe('MODAL PROVER', function () { describe("SHA1 RSA", async () => { it("verify proof", async () => { - const circuitInputs = getCSCAInputs( + const inputs = getCSCAInputs( BigInt(0).toString(), dscCert_sha1_rsa, cscaCert_sha1_rsa, @@ -68,10 +64,6 @@ describe('MODAL PROVER', function () { max_cert_bytes, true ); - const inputs = { - "signature_algorithm": "sha1_rsa", - "inputs": circuitInputs - } console.log(JSON.stringify(inputs)); console.log('\x1b[34msending request to modal server\x1b[0m'); diff --git a/sdk/.env.example b/sdk/.env.example deleted file mode 100644 index de45c19b..00000000 --- a/sdk/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -TEST_ADDRESS = "0x000000000000000000000000000000000000000" -TOKEN_ID = "0" -MOCK_MERKLE_ROOT_CHECK = "false" diff --git a/sdk/.gitignore b/sdk/.gitignore index c77c57cc..99fc6008 100644 --- a/sdk/.gitignore +++ b/sdk/.gitignore @@ -1,3 +1,4 @@ node_modules/ yarn.lock -yarn-error.log \ No newline at end of file +yarn-error.log +dist \ No newline at end of file diff --git a/sdk/ProofOfPassportQRCode.ts b/sdk/ProofOfPassportQRCode.ts new file mode 100644 index 00000000..295fdaad --- /dev/null +++ b/sdk/ProofOfPassportQRCode.ts @@ -0,0 +1,2 @@ +import { QRCodeGenerator } from "./QRCodeGenerator"; + diff --git a/sdk/ProofOfPassportRegister.ts b/sdk/ProofOfPassportRegister.ts new file mode 100644 index 00000000..9bbe810f --- /dev/null +++ b/sdk/ProofOfPassportRegister.ts @@ -0,0 +1,79 @@ +/*** +import { groth16 } from "snarkjs"; +//import path from 'path'; +import { numberToString } from "./common/src/utils/siv"; +import { verifyDSCValidity } from "./utils"; +import { splitToWords } from "./common/src/utils/utils"; +import { k_dsc, n_dsc } from "./common/src/constants/constants"; +import forge from "node-forge"; + +//const path_register_vkey = path.join(__dirname, '..', '..', 'circuits', 'register_sha256WithRSAEncryption_65537_vkey.json'); +const vkey_register = { "protocol": "groth16", "curve": "bn128", "nPublic": 19, "vk_alpha_1": ["20491192805390485299153009773594534940189261866228447918068658471970481763042", "9383485363053290200918347156157836566562967994039712273449902621266178545958", "1"], "vk_beta_2": [["6375614351688725206403948262868962793625744043794305715222011528459656738731", "4252822878758300859123897981450591353533073413197771768651442665752259397132"], ["10505242626370262277552901082094356697409835680220590971873171140371331206856", "21847035105528745403288232691147584728191162732299865338377159692350059136679"], ["1", "0"]], "vk_gamma_2": [["10857046999023057135944570762232829481370756359578518086990519993285655852781", "11559732032986387107991004021392285783925812861821192530917403151452391805634"], ["8495653923123431417604973247489272438418190587263600148770280649306958101930", "4082367875863433681332203403145435568316851327593401208105741076214120093531"], ["1", "0"]], "vk_delta_2": [["15109500350149307323053487883093296007590490684356839614779256936022831777583", "10636099693654578685682169854848153701125336700591728989998545281360544332101"], ["19323843357229983507738572377823827049706873888452670225561178581916096045391", "6787331238819081036010725646646052304698065841480077952318629550899552705954"], ["1", "0"]], "vk_alphabeta_12": [[["2029413683389138792403550203267699914886160938906632433982220835551125967885", "21072700047562757817161031222997517981543347628379360635925549008442030252106"], ["5940354580057074848093997050200682056184807770593307860589430076672439820312", "12156638873931618554171829126792193045421052652279363021382169897324752428276"], ["7898200236362823042373859371574133993780991612861777490112507062703164551277", "7074218545237549455313236346927434013100842096812539264420499035217050630853"]], [["7077479683546002997211712695946002074877511277312570035766170199895071832130", "10093483419865920389913245021038182291233451549023025229112148274109565435465"], ["4595479056700221319381530156280926371456704509942304414423590385166031118820", "19831328484489333784475432780421641293929726139240675179672856274388269393268"], ["11934129596455521040620786944827826205713621633706285934057045369193958244500", "8037395052364110730298837004334506829870972346962140206007064471173334027475"]]], "IC": [["18530914851038160723367808093208218107073162583341603618252574310114972952645", "3491172626993358774007824199310746535787355712297118689300774219634285748447", "1"], ["12459372481602120314275733925078510007916606417959532080966725639916586176503", "3775038408492011989449252562554386051961579730575874174280148278924789506109", "1"], ["5670774023189813595558849632035831702213999749714374699034766279684106435543", "7395828230953517736149600531274140497037210558011828162381375724117795995743", "1"], ["16451739251837686551035841401877180862575441013730243816956218096871312374275", "4262802902678667557117938402728649351052017083062071275187822920555361006292", "1"], ["7525815424565938365580586119072660614216113864870765947611914652889796109347", "18745142749441677185391637105037343220075953355494387414956341359904225762388", "1"], ["13146770653850303881335290750177539565724761456961942134136903507761311057400", "5067174473745434244335634663156814997196347879313616627723153213445496072228", "1"], ["14669632772413356649494472385939231732214310557694216901612307811440440682868", "10670498547103100862651641906697926995316117294372926390634078263879646671718", "1"], ["5012787819330871823219286847404451720950019591568711779515080583974996428059", "17009708731960785878610028065980033879586220286426558906395122780703078961788", "1"], ["8392178513456813497867238448405245069465321402562562312798622649397572449352", "19839066386561013778737915005128403516764802669251119567172212296366535060087", "1"], ["13502212287987704860617768253073815501478440821005297691371839345370316637849", "14881177186278755397896284600972217927608204019364178852478075751180701398114", "1"], ["12517120460533556324180688833217370480091827870973715828027887667938321609129", "2796288928279776250976801453042732111535536569146317216635204647461874351304", "1"], ["11410907513889610502241120691495828390570109760409661245231097362052664927286", "12945190589827395317562145398458678589354704742179791878888103040038927009261", "1"], ["4419963934318847624746830272688987422741628412548324374820120687388414401862", "18495833285240849998035932202640832499144331217672721888398936150096026784688", "1"], ["5707331555787176797440864383381787551010233849497722639533388235942808839733", "12657777409077944843348076735107901045338430415403388055801785078641791743895", "1"], ["4735440059357617347953736631516711907800935346298479716925549228972613073519", "20176283609424518764892959927564998874562883755539946615829572766949262686962", "1"], ["17336700140076484005566198889742688297738240280908426575749569634076471593942", "7653609919365857156810479690026486794869093148995657263400185040364330262979", "1"], ["17739292307555157926873305601936864507271960781305587280105645952229809727903", "9928487377179409063235867872502347982617926832898701368464908508358428077884", "1"], ["3718985959259371504448727642100695646419979577871045553277824083896122606744", "16531036301892233305895268588137930439495204913629967660221691046321252321405", "1"], ["6795089020348614983689661516003180610117302591099005009516734240526696602669", "7678349002437868127622830009687668740539390909675072475881607478913908029942", "1"], ["4793097932723177802233494606966963172024734068941251510270520483805507933121", "2528096240282513877862916807331024358785501587843099663337809711290901143556", "1"]] } +export async function verifyProofs(proof: Proof, dscCertificate_stringified: any, dev_mode: boolean = false) { + const verified_register = await groth16.verify( + vkey_register, + proof.publicSignals, + proof.proof as any + ); + const dscCertificate = forge.pki.certificateFromPem(dscCertificate_stringified); + console.log("proof verified:" + verified_register); + const verified_certificate = verifyDSCValidity(dscCertificate, dev_mode); + console.log("certificate verified:" + verified_register); + + // @ts-ignore + const dsc_modulus = BigInt(dscCertificate.publicKey.n); + const dsc_modulus_words = splitToWords(dsc_modulus, BigInt(n_dsc), BigInt(k_dsc)); + const modulus_from_proof = getDSCModulus(proof); + + const areArraysEqual = (arr1: string[], arr2: string[]) => + arr1.length === arr2.length && + arr1.every((value, index) => value === arr2[index]); + + const verified_modulus = areArraysEqual(dsc_modulus_words, modulus_from_proof); + console.log("modulus verified:" + verified_modulus); + return verified_register && verified_certificate && verified_modulus; +} +export const check_merkle_root = (merkle_root: string, proof_csca: Proof) => { + const formatted_public_signals_csca = parsePublicSignals_csca(proof_csca.publicSignals); + return merkle_root === formatted_public_signals_csca.merkle_root; +} +export const getNullifier = (proof: Proof) => { + const formatted_public_signals = parsePublicSignals(proof.publicSignals); + return formatted_public_signals.nullifier; +} + +export const getDSCModulus = (proof: Proof) => { + const formatted_public_signals = parsePublicSignals(proof.publicSignals); + return formatted_public_signals.dsc_modulus; +} + +export const getSIV = (proof: Proof) => { + const formatted_public_signals = parsePublicSignals(proof.publicSignals); + return numberToString(BigInt(formatted_public_signals.SIV)); +} + +export class Proof { + publicSignals: string[]; + proof: string[]; + + constructor(publicSignals: string[], proof: string[]) { + this.publicSignals = publicSignals; + this.proof = proof; + } +} +export function parsePublicSignals(publicSignals) { + return { + nullifier: publicSignals[0], + dsc_modulus: publicSignals.slice(1, 18), + SIV: publicSignals[18], + } +} + +export function parsePublicSignals_csca(publicSignals) { + return { + blinded_dsc_commitment: publicSignals[0], + merkle_root: publicSignals[1] + } +} + +****/ \ No newline at end of file diff --git a/sdk/ProofOfPassportVerifierReport.ts b/sdk/ProofOfPassportVerifierReport.ts index c34ee60c..39a16f5f 100644 --- a/sdk/ProofOfPassportVerifierReport.ts +++ b/sdk/ProofOfPassportVerifierReport.ts @@ -1,18 +1,18 @@ export class ProofOfPassportVerifierReport { - scope: boolean = false; - merkle_root: boolean = false; - attestation_id: boolean = false; - current_date: boolean = false; - issuing_state: boolean = false; - name: boolean = false; - passport_number: boolean = false; - nationality: boolean = false; - date_of_birth: boolean = false; - gender: boolean = false; - expiry_date: boolean = false; - older_than: boolean = false; - owner_of: boolean = false; - proof: boolean = false; + scope: boolean = true; + merkle_root: boolean = true; + attestation_id: boolean = true; + current_date: boolean = true; + issuing_state: boolean = true; + name: boolean = true; + passport_number: boolean = true; + nationality: boolean = true; + date_of_birth: boolean = true; + gender: boolean = true; + expiry_date: boolean = true; + older_than: boolean = true; + owner_of: boolean = true; + proof: boolean = true; valid: boolean = true; @@ -21,8 +21,9 @@ export class ProofOfPassportVerifierReport { constructor() { } - exposeAttribute(attribute: keyof ProofOfPassportVerifierReport) { - (this[attribute] as boolean) = true; + exposeAttribute(attribute: keyof ProofOfPassportVerifierReport, value: any = "", expectedValue: any = "") { + console.log('exposeAttribute', attribute, "value:", value, "expectedValue:", expectedValue); + (this[attribute] as boolean) = false; this.valid = false; } diff --git a/sdk/ProofOfPassportWeb2Verifier.ts b/sdk/ProofOfPassportWeb2Verifier.ts index 6bf74921..7325cc64 100644 --- a/sdk/ProofOfPassportWeb2Verifier.ts +++ b/sdk/ProofOfPassportWeb2Verifier.ts @@ -1,23 +1,19 @@ import { groth16 } from 'snarkjs'; -import fs from 'fs'; -import { attributeToPosition, countryCodes, DEFAULT_RPC_URL, PASSPORT_ATTESTATION_ID } from '../common/src/constants/constants'; +import { attributeToPosition, countryCodes, DEFAULT_RPC_URL, PASSPORT_ATTESTATION_ID } from './common/src/constants/constants'; import { checkMerkleRoot, getCurrentDateFormatted, parsePublicSignals, unpackReveal } from './utils'; -import dotenv from 'dotenv'; import { ProofOfPassportVerifierReport } from './ProofOfPassportVerifierReport'; +import { vkey_disclose } from './common/src/constants/vkey'; -dotenv.config(); - -const path_disclose_vkey = "../circuits/build/disclose_vkey.json"; -const MOCK_MERKLE_ROOT_CHECK = process.env.MOCK_MERKLE_ROOT_CHECK === 'true' ? true : false; +const MOCK_MERKLE_ROOT_CHECK = false; export class ProofOfPassportWeb2Verifier { scope: string; attestationId: string; - requirements: Array<[string, number | string]>; + requirements: string[][]; rpcUrl: string; report: ProofOfPassportVerifierReport; - constructor(options: { scope: string, attestationId?: string, requirements?: Array<[string, number | string]>, rpcUrl?: string }) { + constructor(options: { scope: string, attestationId?: string, requirements?: string[][], rpcUrl?: string }) { this.scope = options.scope; this.attestationId = options.attestationId || PASSPORT_ATTESTATION_ID; this.requirements = options.requirements || []; @@ -29,7 +25,7 @@ export class ProofOfPassportWeb2Verifier { const parsedPublicSignals = parsePublicSignals(proofOfPassportWeb2Inputs.publicSignals); //1. Verify the scope if (parsedPublicSignals.scope !== this.scope) { - this.report.exposeAttribute('scope'); + this.report.exposeAttribute('scope', parsedPublicSignals.scope, this.scope); } console.log('\x1b[32m%s\x1b[0m', `- scope verified`); @@ -42,13 +38,13 @@ export class ProofOfPassportWeb2Verifier { //3. Verify the attestation_id if (parsedPublicSignals.attestation_id !== this.attestationId) { - this.report.exposeAttribute('attestation_id'); + this.report.exposeAttribute('attestation_id', parsedPublicSignals.attestation_id, this.attestationId); } console.log('\x1b[32m%s\x1b[0m', `- attestation_id verified`); //4. Verify the current_date if (parsedPublicSignals.current_date.toString() !== getCurrentDateFormatted().toString()) { - this.report.exposeAttribute('current_date'); + this.report.exposeAttribute('current_date', parsedPublicSignals.current_date, getCurrentDateFormatted()); } console.log('\x1b[32m%s\x1b[0m', `- current_date verified`); @@ -77,11 +73,14 @@ export class ProofOfPassportWeb2Verifier { } //6. Verify the proof - const vkey_disclose = JSON.parse(fs.readFileSync(path_disclose_vkey) as unknown as string); + + console.log(vkey_disclose); + console.log("publicSignals", proofOfPassportWeb2Inputs.publicSignals); + console.log("proof", proofOfPassportWeb2Inputs.proof); const verified_disclose = await groth16.verify( vkey_disclose, proofOfPassportWeb2Inputs.publicSignals, - proofOfPassportWeb2Inputs.proof + proofOfPassportWeb2Inputs.proof as any ) if (!verified_disclose) { this.report.exposeAttribute('proof'); diff --git a/sdk/ProofOfPassportWeb3Verifier.ts b/sdk/ProofOfPassportWeb3Verifier.ts index 972d074b..060f5545 100644 --- a/sdk/ProofOfPassportWeb3Verifier.ts +++ b/sdk/ProofOfPassportWeb3Verifier.ts @@ -1,7 +1,7 @@ -import { DEFAULT_RPC_URL, PASSPORT_ATTESTATION_ID, SBT_ABI, SBT_CONTRACT_ADDRESS } from '../common/src/constants/constants'; +import { DEFAULT_RPC_URL, PASSPORT_ATTESTATION_ID, SBT_ABI, SBT_CONTRACT_ADDRESS } from './common/src/constants/constants'; import { ethers } from 'ethers'; import { attributeToGetter } from './utils'; -import { ProofOfPassportVerifierReport } from "./ProofOfPassportVerifierReport"; +import { ProofOfPassportVerifierReport } from './ProofOfPassportVerifierReport'; export class ProofOfPassportWeb3Verifier { scope: string; diff --git a/sdk/QRCodeGenerator.ts b/sdk/QRCodeGenerator.ts new file mode 100644 index 00000000..95d3a030 --- /dev/null +++ b/sdk/QRCodeGenerator.ts @@ -0,0 +1,21 @@ +import QRCode from 'easyqrcodejs'; +import { AppType } from "../common/src/utils/appType"; + +export class QRCodeGenerator { + static async generateQRCode(appData: AppType, size: number = 256): Promise { + const qrData = this.serializeAppType(appData); + const options = { + text: qrData, + width: size, + height: size, + }; + const element = document.createElement('div'); + new QRCode(element, options); + return element; + } + + + private static serializeAppType(appType: AppType): string { + return JSON.stringify(appType); + } +} diff --git a/sdk/README.md b/sdk/README.md deleted file mode 100644 index 68b6a5d4..00000000 --- a/sdk/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# SDK - -## Installation - -```bash -yarn add @proofofpassport/sdk -``` - -## Development - -```bash -yarn install-sdk -``` -## Tests - -```bash -yarn test -``` - -## How to use - -### Web2 applications - -To use the `ProofOfPassportWeb2Verifier` in Web2 applications, import and initialize it as follows: - - -```typescript -import { ProofOfPassportWeb2Verifier } from '@proofofpassport/sdk'; -const verifier = new ProofOfPassportWeb2Verifier({ -scope: "yourScope", -requirements: [["older_than", "18"], ["nationality", "France"]] -}); -``` - -#### parameters for `ProofOfPassportWeb2Verifier` - -| Parameter | Optional | Description | -|---------------|----------|-------------| -| `scope` | No | The scope of your application, is unique for each application. | -| `attestationId` | Yes | The ID of the attestation, defaults to `PASSPORT_ATTESTATION_ID`. | -| `requirements` | Yes | An array of requirements, each an array with an attribute and its expected value. | -| `rpcUrl` | Yes | The RPC URL to connect to the blockchain, defaults to `DEFAULT_RPC_URL`. | - -Finally, verify the proof: -The function fired from the Proof of Passport app will send a `ProofOfPassportWeb2Inputs` object. - -```typescript - -const result = await verifier.verify(proofOfPassportWeb2Inputs); // proofOfPassportWeb2Inputs : ProofOfPassportWeb2Inputs -``` - -### Web3 application -For Web3 applications, use the `ProofOfPassportWeb3Verifier` as follows: - -```typescript -import { ProofOfPassportWeb3Verifier } from '@proofofpassport/sdk'; -const verifier = new ProofOfPassportWeb3Verifier({ -scope: "yourScope", -rpcUrl: "https://custom.rpc.url" -}); -``` -#### Parameters for `ProofOfPassportWeb3Verifier` - -| Parameter | Optional | Description | -|---------------|----------|-------------| -| `scope` | No | The scope of the verification. | -| `attestationId` | Yes | The ID of the attestation, defaults to `PASSPORT_ATTESTATION_ID`. | -| `requirements` | Yes | An array of requirements, each an array with an attribute and its expected value. | -| `rpcUrl` | Yes | The RPC URL to connect to the blockchain, defaults to `DEFAULT_RPC_URL`. | - -#### Verify the user owns a sbt which satisfies the requirements: - -```typescript -const result = await verifier.verify(address, tokenId); -``` - -### Handle the report - -Each verification will returns a ProofOfPassportReport object which contains all the informations about the verification of each requirement. - -If a requirement is not satisfied, the corresponding field will be set to `true`. -The `valid` field will be `false` if there is at least one requirement that is not satisfied. - -`nullifier` and `user_identifier` are also accessible as report fields. - -```typescript -const report = await verifier.verify(publicSignals, proof); -const nullifier = report.nullifier; -const userIdentifier = report.user_identifier; -``` - - diff --git a/sdk/WebSocket.ts b/sdk/WebSocket.ts new file mode 100644 index 00000000..4e39784b --- /dev/null +++ b/sdk/WebSocket.ts @@ -0,0 +1,48 @@ +import io, { Socket } from 'socket.io-client'; + +export class ProofWebSocket { + private socket: Socket; + private callbacks: { [key: string]: (data: any) => void } = {}; + + constructor(url: string) { + this.socket = io(url); + this.setupListeners(); + } + + private setupListeners() { + this.socket.on('proof_generation_started', (data) => this.triggerCallback('proofGenerationStarted', data)); + this.socket.on('proof_generation_progress', (data) => this.triggerCallback('proofGenerationProgress', data)); + this.socket.on('proof_submitted', (data) => this.triggerCallback('proofSubmitted', data)); + this.socket.on('proof_verified', (data) => this.triggerCallback('proofVerified', data)); + } + + private triggerCallback(event: string, data: any) { + if (this.callbacks[event]) { + this.callbacks[event](data); + } + } + + on(event: string, callback: (data: any) => void) { + this.callbacks[event] = callback; + } + + emitProofGenerationStarted(userId: string) { + this.socket.emit('proof_generation_started', { userId }); + } + + emitProofGenerationProgress(userId: string, progress: number) { + this.socket.emit('proof_generation_progress', { userId, progress }); + } + + emitProofSubmitted(userId: string, proofId: string) { + this.socket.emit('proof_submitted', { userId, proofId }); + } + + emitProofVerified(userId: string, proofId: string, isValid: boolean) { + this.socket.emit('proof_verified', { userId, proofId, isValid }); + } + + disconnect() { + this.socket.disconnect(); + } +} diff --git a/sdk/certificates.ts b/sdk/certificates.ts new file mode 100644 index 00000000..25648064 --- /dev/null +++ b/sdk/certificates.ts @@ -0,0 +1,368 @@ +export const pem1 = `-----BEGIN CERTIFICATE----- +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 +j/sfUhyHHc9GFJPteLrV +-----END CERTIFICATE----- +` +export const pem2 = `-----BEGIN CERTIFICATE----- +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 +24YnLM+7w0NVPvwClrpt +-----END CERTIFICATE----- +` +export const pem3 = `-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- +` +export const pem4 = `-----BEGIN CERTIFICATE----- +MIIHFDCCBPygAwIBAgIETjLQBjANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1UuUy4gR292ZXJubWVudDEcMBoGA1UECwwTRGVwYXJ0bWVu +dCBvZiBTdGF0ZTENMAsGA1UECwwETVJURDEiMCAGA1UECwwZQ2VydGlmaWNhdGlv +biBBdXRob3JpdGllczEpMCcGA1UECwwgVS5TLiBEZXBhcnRtZW50IG9mIFN0YXRl +IE1SVEQgQ0EwHhcNMTkxMTE0MTYzNzEyWhcNNDAwNTE0MTcwNzEyWjCBozELMAkG +A1UEBhMCVVMxGDAWBgNVBAoMD1UuUy4gR292ZXJubWVudDEcMBoGA1UECwwTRGVw +YXJ0bWVudCBvZiBTdGF0ZTENMAsGA1UECwwETVJURDEiMCAGA1UECwwZQ2VydGlm +aWNhdGlvbiBBdXRob3JpdGllczEpMCcGA1UECwwgVS5TLiBEZXBhcnRtZW50IG9m +IFN0YXRlIE1SVEQgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCj +Mg42Fipd4tZOLauEOb5fZlfU4xSv+PsNmBzrNdntXOxhUH7oBGIhuiTvtLE+2T1l +5Qiq6ONbn0nJv4RSIjqCIhk673NjsED41B+Fl7LDOvVcpeF9E53maZSK/c3Pm6Qw +EXAGgJo4dRyGirCaXfmUKT5fsrc05L74dZufG9FAWo4i2xNxoyDaOn0EX6+YevSd +u5yyLjMDcHNQpaytu9xXTkzgf/KjKu7/m6rwmS1LFvELMreIpdXKLpLBGQ6Il6Rv +O1Uqi4QtCVWGWEZpxQ5Dy5v49NriBFYpUe2HrxiZhbmTXb/YHnYKvMCd3EIZ7B83 +kq8PLnChAQNcdwn472zneWJiNkU1Tlx4v5HjyNShctU+4KZcVAqqjU3+376VZHqJ +xbLy2WUdkayvUYNVfT4Rj7SAlRQtH5I/OwCq3kiAKrQGVD+LPiItRLx8CgezjoBT +e7/Ic1FqkG7dc6orAKZAfYc1S59RnIPnpxVogHMTQgtYrBjsdoRw/bzLQP/746mo +/PjhzxiHAtxJ2ghgkg5vcXMFWyr7UHbdV6pNnwjGkOQjjC6YEvAlL54nXfpcFR6A +vWFBC/kFGtw39eAn3DILjdA353wt8FZRlCh3LuQpcLQq2tq2AfDBrMJ3GXw9HenR +p5du95QFsmbJFBLbuMPKSdythSvOQbxZFaGtbS1RHQIDAQABo4IBTDCCAUgwHAYD +VR0SBBUwE4ERbXJ0ZG9wc0BzdGF0ZS5nb3YwHAYDVR0RBBUwE4ERbXJ0ZG9wc0Bz +dGF0ZS5nb3YwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwgZkG +A1UdHwSBkTCBjjCBi6CBiKCBhYYqaHR0cHM6Ly9wa2Rkb3dubG9hZDEuaWNhby5p +bnQvQ1JMcy9VU0EuY3JshipodHRwczovL3BrZGRvd25sb2FkMi5pY2FvLmludC9D +UkxzL1VTQS5jcmyGK2h0dHA6Ly9jcmxzLnBraS5zdGF0ZS5nb3YvY3Jscy9VU01S +VERDQS5jcmwwKwYDVR0QBCQwIoAPMjAxOTExMTQxNjM3MTJagQ8yMDI1MDUxNTEw +MDkwOVowHQYDVR0OBBYEFPGKi/tqRKNGgzTS1ZIVgViCSkz7MA0GCSqGSIb3DQEB +CwUAA4ICAQARoYLCR1di+iUGqrcBi/ABSFx4oHm2cJzMAT7cs6cUAbzeGhFELYEC +Jzjbwb93lQgg8IpFl8mcBPT4yoMlZDZKKzDiztI9hTwLJw054n5oRk6YJm/45g3Q +1HUb+0wv6HzXfRlCx1fjPsPQFOpcKIKgdNc1QarEaxnUSHG29ie9E2WR3dD8yCFW +kbdGvmlf4FO+P1O+gfUwSbfLuuUg5RDif9bU+D7VBzuC+6QxueKRo6y99ZZcmHTJ +6dsaw/oKABOB+FfSad2RGLvpIynpKjpPNpoFw8H8FcSpOiwpdtSp5tdgLAKVwR/6 +hVMGhuwsSxmxknbLopaKSBC1shp4uZNOlSNjh/d2ssYfGPLrWuTARb/dD9H9SQjg +eqWZV8CJ8cNASsgenIwbygmH70J2p3+qlmA4WLq86qpOzrCUOZaUHYuVSjTEb8fy +CGUjAparnyVnPEUwqeVWOC9tbZtscV9WE4A9c0u8gr1DPVVWIdXrhdpXeOZQwJDm +sKLyTo/yp7GYLMBvNZcMz+orcsyTXoznGk/Xu/7piTpKQZ+EPT8yBp3zb2zNs0Cp +iNTD+szdm/UZE4Wl0kfzCPAz0fSKprZa7ifoiaZZzOwzkpnkpU2SuYcKQqyTw0E+ +Up7Z2qhj2NjkxaikFjTjm4d03dwnU+ojALwufJG1LIj9VShAVQG0ZQ== +-----END CERTIFICATE----- +` + +export const mock_csca = `-----BEGIN CERTIFICATE----- +MIIFpzCCA4+gAwIBAgIUVGoAk38qsh7YYIE2eANMIeZkr+IwDQYJKoZIhvcNAQEL +BQAwYzELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCU1vY2tTdGF0ZTERMA8GA1UEBwwI +TW9ja0NpdHkxGTAXBgNVBAoMEE1vY2tPcmdhbml6YXRpb24xEjAQBgNVBAMMCW1v +Y2tfY3NjYTAeFw0yNDA2MTgxOTA4MzJaFw0yNTA2MTgxOTA4MzJaMGMxCzAJBgNV +BAYTAlhYMRIwEAYDVQQIDAlNb2NrU3RhdGUxETAPBgNVBAcMCE1vY2tDaXR5MRkw +FwYDVQQKDBBNb2NrT3JnYW5pemF0aW9uMRIwEAYDVQQDDAltb2NrX2NzY2EwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDE0JWh/kOzueMgFHwqLHYabpx4 +T0OV58DPuJObuMIKugw8/5l1VLg/Zq2II8/FoATn0Is3JYOidHnFskgkKjW89gxv +RYRlYFPcvRfAxy+3+AO2f3xCnavkNTUI3Jl9q3jBz05SqHgM1cHiYr61ZX5sA980 +OveugRWBbT1mEUNhXTnegfPI9K3b+6YL0QXUePXGpRD9f5lTiCoE/mW8wGkieBYx +QEEskwVpV3cvqwoLCkbdZkRZmIsYE6u7HeAPw2p/yAK6DhqY/vH3svj3LpWvdzBi +Av1wBuuZ6IDgoB0tbgCPOUuc+btezBKhmZXDau0UZc9Y3ND+bMCQEWieXSwCWFYg +y41/onaCaLdT+kcvwdOENNVNvHpaYVDnZGWdt8A95w/dl4Dl19wcL3KkqxoFGB8e +wG+/SDnYTuuGWY3zaROJQ3KYlCqNi3+OuzZTBiJTujaL3Eb/+7Smhy/qtdd6bVUg +mpf3fdBHw+jjl2st+n1rfIYY8rYY7HGrJdome9jXS8pCNfnptp+J8urzgXfEXGFM +qHwMKu/vtfiBt4a1+GC/i2ssaXRcGABiI4xG4BQYXT+4U3p0pAA7cDNH5jN0Wny7 +J5DuEyXzcrRQVFD9hiFmDJfAsc35UwHKpayu9F7JJC4EfWVdahgA9VLhxVIE+eTi +HPRHFyMaVaeqmjrBLQIDAQABo1MwUTAdBgNVHQ4EFgQUVGhgTF0HCJvSxKtE0BvV +tQNMt0cwHwYDVR0jBBgwFoAUVGhgTF0HCJvSxKtE0BvVtQNMt0cwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAtyt8sirr9jc8i5xEnpV3YM6m0poY +bl2S5hDu+xmMRnl8r3lv3v1KE2XrZD0cldV8plYz6oXfWBkCj3j6RUbsNx8w1q27 +Qsb2NC1KZljYG+kHavIIdJty9FOknhgYSYW+UKixSHPuAS+iJxEmGBN8GxhMPpzM +KRzWbpQuPZuBgyKRSeR5ytGqyZrEje9zhkdSg/aFYn3EzLw93CfzrDLrKmXc/dra +vEDyP34ts0Cy7UadCGkJN/SPuZpvF9Fy5f7l8ymHE319ipNZHIMhw50h0l/Puzjd +vn3iHWtwpFw5r+nJTr5zO+3yL4dPcp8XfX3Daa5nDfCJ7dd1wSOf+/1cvBLB5aKc +kyZ/ppvTc3oJAmFHAD2NXf15CUWE18Te/Vy9X2qI8LkFtea6GDF4VBewT2PATg12 +r03xZWa6KFVbgTIq3GUvtZ8UHm+cluTFKX90rFtbzFo658mxQGw5RnE2zp340NzP +v9tNSlP4Tyzr2b1VoQcgmpQ987afINJG39lq2OsSrlK87p9bB4yoFSZwOfqok0nM +IICRxBuTUHLqP3Nhvo+tAl+iK848LDJVf87ZVQHl72JX4lkVvOo5LCXnOQPyowaP +D++J2c6tUj6gs9HAKVX7fH06m/2T5fJHae/OYx36O242yBXPQdHx6qloF/DNvGyM +EHC3NCCjLG5m6G0= +-----END CERTIFICATE----- +` + +export const fr1pem = `-----BEGIN CERTIFICATE----- +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 +3sTE6mYNoV8bK4+Y +-----END CERTIFICATE----- +` + +export const fr2pem = `-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- +` + + +export const fr3pem = `-----BEGIN CERTIFICATE----- +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 +iksuh3S4gaW0c9jK +-----END CERTIFICATE----- +` + +export const fr4pem = `-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- +` +export const mockpem = `-----BEGIN CERTIFICATE----- +MIIFpzCCA4+gAwIBAgIUVGoAk38qsh7YYIE2eANMIeZkr+IwDQYJKoZIhvcNAQEL +BQAwYzELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCU1vY2tTdGF0ZTERMA8GA1UEBwwI +TW9ja0NpdHkxGTAXBgNVBAoMEE1vY2tPcmdhbml6YXRpb24xEjAQBgNVBAMMCW1v +Y2tfY3NjYTAeFw0yNDA2MTgxOTA4MzJaFw0yNTA2MTgxOTA4MzJaMGMxCzAJBgNV +BAYTAlhYMRIwEAYDVQQIDAlNb2NrU3RhdGUxETAPBgNVBAcMCE1vY2tDaXR5MRkw +FwYDVQQKDBBNb2NrT3JnYW5pemF0aW9uMRIwEAYDVQQDDAltb2NrX2NzY2EwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDE0JWh/kOzueMgFHwqLHYabpx4 +T0OV58DPuJObuMIKugw8/5l1VLg/Zq2II8/FoATn0Is3JYOidHnFskgkKjW89gxv +RYRlYFPcvRfAxy+3+AO2f3xCnavkNTUI3Jl9q3jBz05SqHgM1cHiYr61ZX5sA980 +OveugRWBbT1mEUNhXTnegfPI9K3b+6YL0QXUePXGpRD9f5lTiCoE/mW8wGkieBYx +QEEskwVpV3cvqwoLCkbdZkRZmIsYE6u7HeAPw2p/yAK6DhqY/vH3svj3LpWvdzBi +Av1wBuuZ6IDgoB0tbgCPOUuc+btezBKhmZXDau0UZc9Y3ND+bMCQEWieXSwCWFYg +y41/onaCaLdT+kcvwdOENNVNvHpaYVDnZGWdt8A95w/dl4Dl19wcL3KkqxoFGB8e +wG+/SDnYTuuGWY3zaROJQ3KYlCqNi3+OuzZTBiJTujaL3Eb/+7Smhy/qtdd6bVUg +mpf3fdBHw+jjl2st+n1rfIYY8rYY7HGrJdome9jXS8pCNfnptp+J8urzgXfEXGFM +qHwMKu/vtfiBt4a1+GC/i2ssaXRcGABiI4xG4BQYXT+4U3p0pAA7cDNH5jN0Wny7 +J5DuEyXzcrRQVFD9hiFmDJfAsc35UwHKpayu9F7JJC4EfWVdahgA9VLhxVIE+eTi +HPRHFyMaVaeqmjrBLQIDAQABo1MwUTAdBgNVHQ4EFgQUVGhgTF0HCJvSxKtE0BvV +tQNMt0cwHwYDVR0jBBgwFoAUVGhgTF0HCJvSxKtE0BvVtQNMt0cwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAtyt8sirr9jc8i5xEnpV3YM6m0poY +bl2S5hDu+xmMRnl8r3lv3v1KE2XrZD0cldV8plYz6oXfWBkCj3j6RUbsNx8w1q27 +Qsb2NC1KZljYG+kHavIIdJty9FOknhgYSYW+UKixSHPuAS+iJxEmGBN8GxhMPpzM +KRzWbpQuPZuBgyKRSeR5ytGqyZrEje9zhkdSg/aFYn3EzLw93CfzrDLrKmXc/dra +vEDyP34ts0Cy7UadCGkJN/SPuZpvF9Fy5f7l8ymHE319ipNZHIMhw50h0l/Puzjd +vn3iHWtwpFw5r+nJTr5zO+3yL4dPcp8XfX3Daa5nDfCJ7dd1wSOf+/1cvBLB5aKc +kyZ/ppvTc3oJAmFHAD2NXf15CUWE18Te/Vy9X2qI8LkFtea6GDF4VBewT2PATg12 +r03xZWa6KFVbgTIq3GUvtZ8UHm+cluTFKX90rFtbzFo658mxQGw5RnE2zp340NzP +v9tNSlP4Tyzr2b1VoQcgmpQ987afINJG39lq2OsSrlK87p9bB4yoFSZwOfqok0nM +IICRxBuTUHLqP3Nhvo+tAl+iK848LDJVf87ZVQHl72JX4lkVvOo5LCXnOQPyowaP +D++J2c6tUj6gs9HAKVX7fH06m/2T5fJHae/OYx36O242yBXPQdHx6qloF/DNvGyM +EHC3NCCjLG5m6G0= +-----END CERTIFICATE----- +` \ No newline at end of file diff --git a/sdk/circuits/disclose_vkey.json b/sdk/circuits/disclose_vkey.json new file mode 100644 index 00000000..a2edc66c --- /dev/null +++ b/sdk/circuits/disclose_vkey.json @@ -0,0 +1,159 @@ +{ + "protocol": "groth16", + "curve": "bn128", + "nPublic": 14, + "vk_alpha_1": [ + "20491192805390485299153009773594534940189261866228447918068658471970481763042", + "9383485363053290200918347156157836566562967994039712273449902621266178545958", + "1" + ], + "vk_beta_2": [ + [ + "6375614351688725206403948262868962793625744043794305715222011528459656738731", + "4252822878758300859123897981450591353533073413197771768651442665752259397132" + ], + [ + "10505242626370262277552901082094356697409835680220590971873171140371331206856", + "21847035105528745403288232691147584728191162732299865338377159692350059136679" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "6942436740229168666595536581519256291593117600832247164924519038970269461046", + "17557865657217054151399710026819127874171362865266657132072043760282335721027" + ], + [ + "15629082942757783052734933529055204330846116501031658743204188522840567440030", + "866803245463331646327183913175583329159450203348438102150009828684148559895" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "2029413683389138792403550203267699914886160938906632433982220835551125967885", + "21072700047562757817161031222997517981543347628379360635925549008442030252106" + ], + [ + "5940354580057074848093997050200682056184807770593307860589430076672439820312", + "12156638873931618554171829126792193045421052652279363021382169897324752428276" + ], + [ + "7898200236362823042373859371574133993780991612861777490112507062703164551277", + "7074218545237549455313236346927434013100842096812539264420499035217050630853" + ] + ], + [ + [ + "7077479683546002997211712695946002074877511277312570035766170199895071832130", + "10093483419865920389913245021038182291233451549023025229112148274109565435465" + ], + [ + "4595479056700221319381530156280926371456704509942304414423590385166031118820", + "19831328484489333784475432780421641293929726139240675179672856274388269393268" + ], + [ + "11934129596455521040620786944827826205713621633706285934057045369193958244500", + "8037395052364110730298837004334506829870972346962140206007064471173334027475" + ] + ] + ], + "IC": [ + [ + "10998553002727424987884583305349753345629818748955483305954960876370686844925", + "18369020735737057562107768810182682586161750799521907185011795199521493953276", + "1" + ], + [ + "3870156317905136354369536369223776179854927352937539086581682263147147725326", + "947908099816727525943796981035826395896386995128918341433720280874486019589", + "1" + ], + [ + "9619614659642762666110070745787072277198407288262286655564043642023793950605", + "1444870940646607538213811271690623291794427513321591343855928143309974143815", + "1" + ], + [ + "10290556281387838061211784545032614883237381276187632418810139452226710406378", + "12820288689147023950592422696432066467590193138126598372596214785570201388663", + "1" + ], + [ + "10044189939644279332588298610988772483187101321076758071894028734198440253205", + "15016612240779620571490237444430121691511928826472608688773111463692886510804", + "1" + ], + [ + "6158786594227478832634691320618082224218218524296943509099128649963428556955", + "2818896662082406397657145229256654653904841140122301210666395782176903475916", + "1" + ], + [ + "200295911748915977788397688942615122670319721182540082686195028815964792730", + "16374098866162622474777608838325780437892472095191094825634065695603492498672", + "1" + ], + [ + "1001933084599581827076405562561115761770358156189382784432273793509010836288", + "13618159500648302749264797924828312592779374840705268445533823753672345860949", + "1" + ], + [ + "12152127135355257668073159516593687751413730484411437719952408933610175077761", + "15590965974244077225547659000022179448961631917634079092877797469009672737373", + "1" + ], + [ + "14643873766083688335082369233094018379987105460165787549629338089338629672719", + "18976194036990056092890684065171543382286602242265347684324001010669281606450", + "1" + ], + [ + "4974359282562923295097396773583362835614429754286473873410152881834388935350", + "2615967425575591157936435871031665935046196308487298765704452331348089292330", + "1" + ], + [ + "16489750714044704248135942822786071904168862423655325973193848507501139487825", + "4644993658884496411511912365771411317040070112230395754480725062427812526601", + "1" + ], + [ + "11801682757910657983396995619983996921870874978799260563404809167285348391422", + "19228652101325919244735412842681375925619382430642205708320466729501949572254", + "1" + ], + [ + "4495248066509783309072792039672520701419947625749866524660708846549914823847", + "4585216314173588273427806971446529726371555267351812069737927114283850919560", + "1" + ], + [ + "18719866673490039760627957665040843673978402675108669037278157044178865894074", + "11183065716352601580915387671262116390467334689778841393328736869598818253587", + "1" + ] + ] +} \ No newline at end of file diff --git a/sdk/circuits/dsc_4096_vkey.json b/sdk/circuits/dsc_4096_vkey.json new file mode 100644 index 00000000..fbf2eb28 --- /dev/null +++ b/sdk/circuits/dsc_4096_vkey.json @@ -0,0 +1,99 @@ +{ + "protocol": "groth16", + "curve": "bn128", + "nPublic": 2, + "vk_alpha_1": [ + "20491192805390485299153009773594534940189261866228447918068658471970481763042", + "9383485363053290200918347156157836566562967994039712273449902621266178545958", + "1" + ], + "vk_beta_2": [ + [ + "6375614351688725206403948262868962793625744043794305715222011528459656738731", + "4252822878758300859123897981450591353533073413197771768651442665752259397132" + ], + [ + "10505242626370262277552901082094356697409835680220590971873171140371331206856", + "21847035105528745403288232691147584728191162732299865338377159692350059136679" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "5689878758968408864570330769586116386424915777760869435924001045372426387042", + "14835593574773248144471339475507473753186624066904877663229402603601341881110" + ], + [ + "2051149603231436076479384106975809917151570357124249160820058911298166997663", + "628452860859295088428620228489450512026200467380394004198146223506590955249" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "2029413683389138792403550203267699914886160938906632433982220835551125967885", + "21072700047562757817161031222997517981543347628379360635925549008442030252106" + ], + [ + "5940354580057074848093997050200682056184807770593307860589430076672439820312", + "12156638873931618554171829126792193045421052652279363021382169897324752428276" + ], + [ + "7898200236362823042373859371574133993780991612861777490112507062703164551277", + "7074218545237549455313236346927434013100842096812539264420499035217050630853" + ] + ], + [ + [ + "7077479683546002997211712695946002074877511277312570035766170199895071832130", + "10093483419865920389913245021038182291233451549023025229112148274109565435465" + ], + [ + "4595479056700221319381530156280926371456704509942304414423590385166031118820", + "19831328484489333784475432780421641293929726139240675179672856274388269393268" + ], + [ + "11934129596455521040620786944827826205713621633706285934057045369193958244500", + "8037395052364110730298837004334506829870972346962140206007064471173334027475" + ] + ] + ], + "IC": [ + [ + "14532585603301627491293557600415273871129994972736322653869196794622673732921", + "18882397311658692526609112965864523608034856647654838257030831022893270548325", + "1" + ], + [ + "4186298633367159062520988354552715829159959996352603762446141935317873102425", + "3924212783150620566854971503130830169563464952561919541343311327675656189646", + "1" + ], + [ + "4437362653636713552232717650847448346211317604147264938993567382296904710753", + "2938386579388053271692442071404949636853984120968379123259292205410760857324", + "1" + ] + ] +} \ No newline at end of file diff --git a/sdk/circuits/register_sha256WithRSAEncryption_65537_vkey.json b/sdk/circuits/register_sha256WithRSAEncryption_65537_vkey.json new file mode 100644 index 00000000..9e90d6ae --- /dev/null +++ b/sdk/circuits/register_sha256WithRSAEncryption_65537_vkey.json @@ -0,0 +1 @@ +{"protocol":"groth16","curve":"bn128","nPublic":19,"vk_alpha_1":["20491192805390485299153009773594534940189261866228447918068658471970481763042","9383485363053290200918347156157836566562967994039712273449902621266178545958","1"],"vk_beta_2":[["6375614351688725206403948262868962793625744043794305715222011528459656738731","4252822878758300859123897981450591353533073413197771768651442665752259397132"],["10505242626370262277552901082094356697409835680220590971873171140371331206856","21847035105528745403288232691147584728191162732299865338377159692350059136679"],["1","0"]],"vk_gamma_2":[["10857046999023057135944570762232829481370756359578518086990519993285655852781","11559732032986387107991004021392285783925812861821192530917403151452391805634"],["8495653923123431417604973247489272438418190587263600148770280649306958101930","4082367875863433681332203403145435568316851327593401208105741076214120093531"],["1","0"]],"vk_delta_2":[["15109500350149307323053487883093296007590490684356839614779256936022831777583","10636099693654578685682169854848153701125336700591728989998545281360544332101"],["19323843357229983507738572377823827049706873888452670225561178581916096045391","6787331238819081036010725646646052304698065841480077952318629550899552705954"],["1","0"]],"vk_alphabeta_12":[[["2029413683389138792403550203267699914886160938906632433982220835551125967885","21072700047562757817161031222997517981543347628379360635925549008442030252106"],["5940354580057074848093997050200682056184807770593307860589430076672439820312","12156638873931618554171829126792193045421052652279363021382169897324752428276"],["7898200236362823042373859371574133993780991612861777490112507062703164551277","7074218545237549455313236346927434013100842096812539264420499035217050630853"]],[["7077479683546002997211712695946002074877511277312570035766170199895071832130","10093483419865920389913245021038182291233451549023025229112148274109565435465"],["4595479056700221319381530156280926371456704509942304414423590385166031118820","19831328484489333784475432780421641293929726139240675179672856274388269393268"],["11934129596455521040620786944827826205713621633706285934057045369193958244500","8037395052364110730298837004334506829870972346962140206007064471173334027475"]]],"IC":[["18530914851038160723367808093208218107073162583341603618252574310114972952645","3491172626993358774007824199310746535787355712297118689300774219634285748447","1"],["12459372481602120314275733925078510007916606417959532080966725639916586176503","3775038408492011989449252562554386051961579730575874174280148278924789506109","1"],["5670774023189813595558849632035831702213999749714374699034766279684106435543","7395828230953517736149600531274140497037210558011828162381375724117795995743","1"],["16451739251837686551035841401877180862575441013730243816956218096871312374275","4262802902678667557117938402728649351052017083062071275187822920555361006292","1"],["7525815424565938365580586119072660614216113864870765947611914652889796109347","18745142749441677185391637105037343220075953355494387414956341359904225762388","1"],["13146770653850303881335290750177539565724761456961942134136903507761311057400","5067174473745434244335634663156814997196347879313616627723153213445496072228","1"],["14669632772413356649494472385939231732214310557694216901612307811440440682868","10670498547103100862651641906697926995316117294372926390634078263879646671718","1"],["5012787819330871823219286847404451720950019591568711779515080583974996428059","17009708731960785878610028065980033879586220286426558906395122780703078961788","1"],["8392178513456813497867238448405245069465321402562562312798622649397572449352","19839066386561013778737915005128403516764802669251119567172212296366535060087","1"],["13502212287987704860617768253073815501478440821005297691371839345370316637849","14881177186278755397896284600972217927608204019364178852478075751180701398114","1"],["12517120460533556324180688833217370480091827870973715828027887667938321609129","2796288928279776250976801453042732111535536569146317216635204647461874351304","1"],["11410907513889610502241120691495828390570109760409661245231097362052664927286","12945190589827395317562145398458678589354704742179791878888103040038927009261","1"],["4419963934318847624746830272688987422741628412548324374820120687388414401862","18495833285240849998035932202640832499144331217672721888398936150096026784688","1"],["5707331555787176797440864383381787551010233849497722639533388235942808839733","12657777409077944843348076735107901045338430415403388055801785078641791743895","1"],["4735440059357617347953736631516711907800935346298479716925549228972613073519","20176283609424518764892959927564998874562883755539946615829572766949262686962","1"],["17336700140076484005566198889742688297738240280908426575749569634076471593942","7653609919365857156810479690026486794869093148995657263400185040364330262979","1"],["17739292307555157926873305601936864507271960781305587280105645952229809727903","9928487377179409063235867872502347982617926832898701368464908508358428077884","1"],["3718985959259371504448727642100695646419979577871045553277824083896122606744","16531036301892233305895268588137930439495204913629967660221691046321252321405","1"],["6795089020348614983689661516003180610117302591099005009516734240526696602669","7678349002437868127622830009687668740539390909675072475881607478913908029942","1"],["4793097932723177802233494606966963172024734068941251510270520483805507933121","2528096240282513877862916807331024358785501587843099663337809711290901143556","1"]]} \ No newline at end of file diff --git a/sdk/common b/sdk/common new file mode 120000 index 00000000..60d3b0a6 --- /dev/null +++ b/sdk/common @@ -0,0 +1 @@ +../common \ No newline at end of file diff --git a/sdk/index.ts b/sdk/index.ts index af231974..4eefa133 100644 --- a/sdk/index.ts +++ b/sdk/index.ts @@ -1,9 +1,17 @@ import { ProofOfPassportWeb2Verifier } from './ProofOfPassportWeb2Verifier'; import { ProofOfPassportWeb2Inputs } from './ProofOfPassportWeb2Verifier'; -import { ProofOfPassportWeb3Verifier } from './ProofOfPassportWeb3Verifier'; +import { ProofOfPassportVerifierReport } from './ProofOfPassportVerifierReport'; +// import { ProofOfPassportWeb3Verifier } from './ProofOfPassportWeb3Verifier'; +import { countryCodes } from './common/src/constants/constants'; +import { QRCodeGenerator } from './QRCodeGenerator'; +import { AppType } from '../common/src/utils/appType'; export { ProofOfPassportWeb2Verifier, - ProofOfPassportWeb3Verifier, - ProofOfPassportWeb2Inputs -}; \ No newline at end of file + // ProofOfPassportWeb3Verifier, + ProofOfPassportWeb2Inputs, + ProofOfPassportVerifierReport, + QRCodeGenerator, + AppType, + countryCodes +} \ No newline at end of file diff --git a/sdk/package-lock.json b/sdk/package-lock.json new file mode 100644 index 00000000..64af1e87 --- /dev/null +++ b/sdk/package-lock.json @@ -0,0 +1,2540 @@ +{ + "name": "@proofofpassport/sdk", + "version": "1.1.9", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@proofofpassport/sdk", + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "@types/chai-as-promised": "^7.1.8", + "@types/expect": "^24.3.0", + "@types/mocha": "^10.0.6", + "@types/node": "^20.11.19", + "@types/node-forge": "^1.3.5", + "@zk-kit/lean-imt": "^2.0.1", + "chai-as-promised": "^7.1.1", + "dotenv": "^16.4.5", + "ethers": "^6.13.0", + "fs": "^0.0.1-security", + "js-sha1": "^0.7.0", + "js-sha256": "^0.11.0", + "js-sha512": "^0.9.0", + "node-forge": "^1.3.1", + "poseidon-lite": "^0.2.0", + "snarkjs": "^0.7.4", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" + }, + "devDependencies": { + "@types/chai": "^4.3.6", + "@types/circomlibjs": "^0.1.6", + "@types/mocha": "^10.0.6", + "@types/snarkjs": "^0.7.8", + "chai": "^4.3.8", + "mocha": "^10.3.0", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.2" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==", + "license": "GPL-3.0" + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz", + "integrity": "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==", + "license": "GPL-3.0", + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.3.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "license": "MIT" + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "license": "MIT", + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/circomlibjs": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/circomlibjs/-/circomlibjs-0.1.6.tgz", + "integrity": "sha512-yF174bPDaiKgejlZzCSqKwZaqXhlxMcVEHrAtstFohwP05OjtvHXOdxO6HQeTg8WwIdgMg7MJb1WyWZdUCGlPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/expect": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", + "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", + "license": "MIT", + "dependencies": { + "expect": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/mocha": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/snarkjs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.8.tgz", + "integrity": "sha512-x37Jsv1vx6I6RMJdfvYEmDUOLYgzYMecwlk13gniDOcN20xLVe9hy9DlQxWeCPirqpDY/jwugQSqCi2RxehU3g==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@zk-kit/lean-imt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@zk-kit/lean-imt/-/lean-imt-2.0.1.tgz", + "integrity": "sha512-yc0rh9BCY6VvvKrZUNejfucuWscy1iRb9JrppuJktsiA9HcEukB3oX9CB7N/CUmCtqzmdwybet6N2aglGL/SUQ==", + "license": "MIT", + "dependencies": { + "@zk-kit/utils": "1.0.0" + } + }, + "node_modules/@zk-kit/utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@zk-kit/utils/-/utils-1.0.0.tgz", + "integrity": "sha512-v5UjrZiaRNAN2UJmTFHvlMktaA2Efc2qN1Mwd4060ExX12yRhY8ZhzdlDODhnuHkvW5zPukuBHgQhHMScNP3Pg==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "license": "MIT" + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "license": "Apache-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", + "license": "WTFPL", + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/circom_runtime": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.25.tgz", + "integrity": "sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA==", + "license": "Apache-2.0", + "dependencies": { + "ffjavascript": "0.3.0" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ethers": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz", + "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "license": "MIT" + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==", + "license": "GPL-3.0" + }, + "node_modules/ffjavascript": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz", + "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/js-sha1": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.7.0.tgz", + "integrity": "sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==", + "license": "MIT" + }, + "node_modules/js-sha256": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz", + "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==", + "license": "MIT" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/js-sha512": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.9.0.tgz", + "integrity": "sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==", + "license": "MIT" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", + "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/poseidon-lite": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.2.0.tgz", + "integrity": "sha512-vivDZnGmz8W4G/GzVA72PXkfYStjilu83rjjUfpL4PueKcC8nfX6hCPh2XhoC5FBgC6y0TA3YuUeUo5YCcNoig==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/r1csfile": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz", + "integrity": "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==", + "license": "GPL-3.0", + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.12", + "fastfile": "0.0.20", + "ffjavascript": "0.3.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snarkjs": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.4.tgz", + "integrity": "sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w==", + "license": "GPL-3.0", + "dependencies": { + "@iden3/binfileutils": "0.0.12", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.25", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.3.0", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.48" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-node": "7.0.1" + }, + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "optionalDependencies": { + "tsconfig-paths": "^3.5.0" + }, + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X" + } + }, + "node_modules/ts-mocha/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-mocha/node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-mocha/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", + "license": "GPL-3.0" + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "license": "Apache-2.0" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/sdk/package.json b/sdk/package.json index 005fd143..b4d4743e 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,7 +1,8 @@ { "name": "@proofofpassport/sdk", - "version": "1.0.0", - "main": "index.js", + "version": "1.6.0", + "main": "dist/sdk/index.js", + "types": "dist/sdk/index.d.ts", "license": "MIT", "repository": { "type": "git", @@ -9,38 +10,46 @@ }, "author": "turnoffthiscomputer", "dependencies": { - "@types/chai-as-promised": "^7.1.8", - "@types/expect": "^24.3.0", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.19", - "@types/node-forge": "^1.3.5", + "@zk-kit/imt": "^2.0.0-beta.5", "@zk-kit/lean-imt": "^2.0.1", - "chai-as-promised": "^7.1.1", - "dotenv": "^16.4.5", + "axios": "^1.7.2", + "easyqrcodejs": "^4.6.1", "ethers": "^6.13.0", "fs": "^0.0.1-security", "js-sha1": "^0.7.0", "js-sha256": "^0.11.0", "js-sha512": "^0.9.0", - "mocha": "^10.4.0", + "node-forge": "^1.3.1", "poseidon-lite": "^0.2.0", "snarkjs": "^0.7.4", - "ts-mocha": "^10.0.0", - "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "socket.io-client": "^4.7.5" }, "devDependencies": { "@types/chai": "^4.3.6", + "@types/chai-as-promised": "^7.1.8", "@types/circomlibjs": "^0.1.6", + "@types/expect": "^24.3.0", "@types/mocha": "^10.0.6", + "@types/node": "^20.11.19", + "@types/node-forge": "^1.3.5", + "@types/snarkjs": "^0.7.8", "chai": "^4.3.8", + "chai-as-promised": "^7.1.1", + "dotenv": "^16.4.5", "mocha": "^10.3.0", "ts-mocha": "^10.0.0", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "typescript": "^5.4.5" }, "scripts": { "build": "tsc", + "prepublishOnly": "npm run build", "test": "yarn ts-mocha -p ./tsconfig.json tests/sdk.test.ts --exit", "install-sdk": "cd ../common && yarn && cd ../sdk && yarn" - } + }, + "files": [ + "dist", + "common", + "circuits/**/*.json" + ] } \ No newline at end of file diff --git a/sdk/tests/register.test.ts b/sdk/tests/register.test.ts new file mode 100644 index 00000000..c049de91 --- /dev/null +++ b/sdk/tests/register.test.ts @@ -0,0 +1,127 @@ +import { groth16 } from "snarkjs" +import { + generateCircuitInputsRegister +} from "../../common/src/utils/generateInputs" +import { getCSCAInputs } from "../../common/src/utils/csca" +import { describe } from 'mocha' +import fs from "fs"; +import forge from "node-forge"; +import { MODAL_SERVER_ADDRESS } from "../../common/src/constants/constants"; +import { castCSCAProof } from "../../common/src/utils/types"; +const n_dsc = 121; +const k_dsc = 17; +const n_csca = 121; +const k_csca = 34; +const max_cert_bytes = 1664; +const dsc = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_4096/mock_dsc.pem', 'utf8'); +const csca = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_4096/mock_csca.pem', 'utf8'); +const dscCert = forge.pki.certificateFromPem(dsc); +const cscaCert = forge.pki.certificateFromPem(csca); +//const inputs_csca = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); +import { mockPassportData_sha256WithRSAEncryption_65537 } from "../../common/src/utils/mockPassportData"; +async function requestCSCAProof(inputs) { + try { + console.log("inputs_csca before requesting modal server - cscaRequest.ts"); + const response = await fetch(MODAL_SERVER_ADDRESS, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(inputs) + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + const cscaProof = castCSCAProof(data); + console.log('Response from server:', data); + return cscaProof; + } catch (error) { + console.error('Error during request:', error); + throw error; + } +} +let circuit: any; +let inputs: any; +let attestation_id: string; +import path from "path"; +import { poseidon1 } from "poseidon-lite"; +import { getDSCModulus, getNullifier, getSIV, verifyProofs } from "../ProofOfPassportRegister"; +let proof: any; +let publicSignals: any; +let cscaProof: any; +const mock_dsc_path = "../common/src/mock_certificates/sha256_rsa_4096/mock_dsc.pem"; + +describe("Testing the register flow", function () { + this.timeout(0); + before(async () => { + const sha256WithRSAEncryption_65537 = { + wasm: "../circuits/build/register_sha256WithRSAEncryption_65537_js/register_sha256WithRSAEncryption_65537.wasm", + zkey: "../circuits/build/register_sha256WithRSAEncryption_65537_final.zkey", + vkey: "../circuits/build/register_sha256WithRSAEncryption_65537_vkey.json" + } + const secret = BigInt(0).toString(); + console.log("secret", secret); + + const attestation_name = "E-PASSPORT"; + attestation_id = poseidon1([ + BigInt(Buffer.from(attestation_name).readUIntBE(0, 6)) + ]).toString(); + + inputs = generateCircuitInputsRegister( + secret, + BigInt(0).toString(), + attestation_id, + mockPassportData_sha256WithRSAEncryption_65537, + "heyXYZ019aA", + n_dsc, + k_dsc, + [mockPassportData_sha256WithRSAEncryption_65537] + ); + console.log('\x1b[32m%s\x1b[0m', `Generating proof register `); + ({ proof, publicSignals } = await groth16.fullProve( + inputs, + sha256WithRSAEncryption_65537.wasm, + sha256WithRSAEncryption_65537.zkey + )) + }); + + + it('should successfully request and receive a CSCA proof', async () => { + try { + console.log('Not requesting CSCA proof...'); + //cscaProof = await requestCSCAProof(inputs_csca); + // Add assertions here to verify the proof structure + // For example: + // assert.ok(cscaProof.proof, 'Proof should exist'); + // assert.ok(cscaProof.publicSignals, 'Public signals should exist'); + } catch (error) { + console.error('Error in CSCA proof request:', error); + throw error; + } + }); + + it('should successfully verify the proof to register', async () => { + const proof_register = { + proof: proof, + publicSignals: publicSignals + } + console.log(JSON.stringify(proof_register, null, 2)); + + // Read the mock DSC certificate as a PEM string + const mock_dsc_pem = fs.readFileSync(mock_dsc_path, 'utf8'); + console.log(mock_dsc_pem) + + // Pass the PEM string directly to verifyProofs + const result = await verifyProofs(proof_register, mock_dsc_pem, true); + console.log('Verification result:', result); + const dsc_modulus = await getDSCModulus(proof_register); + console.log('dsc_modulus:', dsc_modulus); + const nullifier = await getNullifier(proof_register); + console.log('nullifier:', nullifier); + const SIV = await getSIV(proof_register); + console.log('SIV:', SIV); + }); +}); diff --git a/sdk/tests/sdk.test.ts b/sdk/tests/sdk.test.ts index 6dc3f8f1..7f807de6 100644 --- a/sdk/tests/sdk.test.ts +++ b/sdk/tests/sdk.test.ts @@ -1,27 +1,29 @@ import { assert, expect } from 'chai' +import { describe, it } from 'mocha'; import { groth16 } from 'snarkjs'; import { generateCircuitInputsDisclose } from '../../common/src/utils/generateInputs'; -import { mockPassportData_sha256WithRSAEncryption_65537 } from '../../common/src/utils/mockPassportData'; +import { mockPassportData_sha256_rsa_65537 } from '../../common/src/constants/mockPassportData'; import { LeanIMT } from "@zk-kit/lean-imt"; import { poseidon2, poseidon6 } from "poseidon-lite"; import { PASSPORT_ATTESTATION_ID } from "../../common/src/constants/constants"; import { formatMrz, packBytes } from '../../common/src/utils/utils'; import { getLeaf } from '../../common/src/utils/pubkeyTree'; -import { ProofOfPassportWeb2Inputs, ProofOfPassportWeb2Verifier, ProofOfPassportWeb3Verifier } from '../index'; -import dotenv from 'dotenv'; -dotenv.config(); +import { ProofOfPassportWeb2Inputs, ProofOfPassportWeb2Verifier } from '../index'; +// import dotenv from 'dotenv'; +// dotenv.config(); const path_disclose_wasm = "../circuits/build/disclose_js/disclose.wasm"; -const path_disclose_zkey = "../circuits/build/disclose_final.zkey"; +const path_disclose_zkey = "../circuits/build/disclose.zkey"; -describe('Circuit Proving Tests', () => { - it('proofOfPassportWeb2Verifier - should verify', async () => { +describe('Circuit Proving Tests', function () { + this.timeout(0); + it('proofOfPassportWeb2Verifier - should verify', async function () { /// Generate circuit inputs - const passportData = mockPassportData_sha256WithRSAEncryption_65537; + const passportData = mockPassportData_sha256_rsa_65537; const imt = new LeanIMT((a: bigint, b: bigint) => poseidon2([a, b]), []); const bitmap = Array(90).fill("1"); const scope = BigInt(1).toString(); - const majority = ["1", "8"]; + const majority = ["18"]; const secret = BigInt(0).toString(); const mrz_bytes = packBytes(formatMrz(passportData.mrz)); const pubkey_leaf = getLeaf({ @@ -60,7 +62,7 @@ describe('Circuit Proving Tests', () => { scope: scope, requirements: [["older_than", "18"], ["nationality", "France"]] }); - const proofOfPassportWeb2Inputs = new ProofOfPassportWeb2Inputs(publicSignals, proof); + const proofOfPassportWeb2Inputs = new ProofOfPassportWeb2Inputs(publicSignals, proof as any); const result = await proofOfPassportWeb2Verifier.verify(proofOfPassportWeb2Inputs); @@ -68,25 +70,25 @@ describe('Circuit Proving Tests', () => { expect(result.valid).to.be.true; }); - it('proofOfPassportWeb3Verifier - should succeed', async () => { - const scope = BigInt(1).toString(); - /// Verify using web3 verifier - const proofOfPassportWeb3Verifier = new ProofOfPassportWeb3Verifier({ - scope: scope - }); - const result = await proofOfPassportWeb3Verifier.verify(process.env.TEST_ADDRESS, Number(process.env.TOKEN_ID)); - expect(result.valid).to.be.true; - }); + // it('proofOfPassportWeb3Verifier - should succeed', async () => { + // const scope = BigInt(1).toString(); + // /// Verify using web3 verifier + // const proofOfPassportWeb3Verifier = new ProofOfPassportWeb3Verifier({ + // scope: scope + // }); + // const result = await proofOfPassportWeb3Verifier.verify(process.env.TEST_ADDRESS, Number(process.env.TOKEN_ID)); + // expect(result.valid).to.be.true; + // }); - it('proofOfPassportWeb3Verifier - should fail', async () => { - const scope = BigInt(1).toString(); - /// Verify using web3 verifier - const proofOfPassportWeb3Verifier = new ProofOfPassportWeb3Verifier({ - scope: scope, - requirements: [["older_than", "18"]] - }); - const result = await proofOfPassportWeb3Verifier.verify(process.env.TEST_ADDRESS, Number(process.env.TOKEN_ID)); - expect(result.older_than).to.be.true; - expect(result.valid).to.be.false; - }); -}); + // it('proofOfPassportWeb3Verifier - should fail', async () => { + // const scope = BigInt(1).toString(); + // /// Verify using web3 verifier + // const proofOfPassportWeb3Verifier = new ProofOfPassportWeb3Verifier({ + // scope: scope, + // requirements: [["older_than", "18"]] + // }); + // const result = await proofOfPassportWeb3Verifier.verify(process.env.TEST_ADDRESS, Number(process.env.TOKEN_ID)); + // expect(result.older_than).to.be.true; + // expect(result.valid).to.be.false; + // }); +}); \ No newline at end of file diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index ff88f6da..13342f75 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -1,9 +1,26 @@ { "compilerOptions": { - "resolveJsonModule": true, - "esModuleInterop": true, "target": "ES2020", - "moduleResolution": "node", - "module": "CommonJS", - } + "module": "commonjs", + "declaration": true, + "outDir": "./dist", + "strict": false, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + }, + "include": [ + "index.ts", + "src/**/*", + "common/**/*", + "circuits/**/*", + "circuits/**/*.json" + ], + "exclude": [ + "node_modules", + "**/__tests__/*", + "dist", + "common/src/utils/csca.ts" + ] } \ No newline at end of file diff --git a/sdk/unique_pem_us/1.pem b/sdk/unique_pem_us/1.pem new file mode 100644 index 00000000..e59a8e19 --- /dev/null +++ b/sdk/unique_pem_us/1.pem @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +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 +j/sfUhyHHc9GFJPteLrV +-----END CERTIFICATE----- diff --git a/sdk/unique_pem_us/2.pem b/sdk/unique_pem_us/2.pem new file mode 100644 index 00000000..2732ec7a --- /dev/null +++ b/sdk/unique_pem_us/2.pem @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +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 +24YnLM+7w0NVPvwClrpt +-----END CERTIFICATE----- diff --git a/sdk/unique_pem_us/3.pem b/sdk/unique_pem_us/3.pem new file mode 100644 index 00000000..3792341a --- /dev/null +++ b/sdk/unique_pem_us/3.pem @@ -0,0 +1,36 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- diff --git a/sdk/unique_pem_us/4.pem b/sdk/unique_pem_us/4.pem new file mode 100644 index 00000000..4ccc3bfa --- /dev/null +++ b/sdk/unique_pem_us/4.pem @@ -0,0 +1,40 @@ +-----BEGIN CERTIFICATE----- +MIIHFDCCBPygAwIBAgIETjLQBjANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1UuUy4gR292ZXJubWVudDEcMBoGA1UECwwTRGVwYXJ0bWVu +dCBvZiBTdGF0ZTENMAsGA1UECwwETVJURDEiMCAGA1UECwwZQ2VydGlmaWNhdGlv +biBBdXRob3JpdGllczEpMCcGA1UECwwgVS5TLiBEZXBhcnRtZW50IG9mIFN0YXRl +IE1SVEQgQ0EwHhcNMTkxMTE0MTYzNzEyWhcNNDAwNTE0MTcwNzEyWjCBozELMAkG +A1UEBhMCVVMxGDAWBgNVBAoMD1UuUy4gR292ZXJubWVudDEcMBoGA1UECwwTRGVw +YXJ0bWVudCBvZiBTdGF0ZTENMAsGA1UECwwETVJURDEiMCAGA1UECwwZQ2VydGlm +aWNhdGlvbiBBdXRob3JpdGllczEpMCcGA1UECwwgVS5TLiBEZXBhcnRtZW50IG9m +IFN0YXRlIE1SVEQgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCj +Mg42Fipd4tZOLauEOb5fZlfU4xSv+PsNmBzrNdntXOxhUH7oBGIhuiTvtLE+2T1l +5Qiq6ONbn0nJv4RSIjqCIhk673NjsED41B+Fl7LDOvVcpeF9E53maZSK/c3Pm6Qw +EXAGgJo4dRyGirCaXfmUKT5fsrc05L74dZufG9FAWo4i2xNxoyDaOn0EX6+YevSd +u5yyLjMDcHNQpaytu9xXTkzgf/KjKu7/m6rwmS1LFvELMreIpdXKLpLBGQ6Il6Rv +O1Uqi4QtCVWGWEZpxQ5Dy5v49NriBFYpUe2HrxiZhbmTXb/YHnYKvMCd3EIZ7B83 +kq8PLnChAQNcdwn472zneWJiNkU1Tlx4v5HjyNShctU+4KZcVAqqjU3+376VZHqJ +xbLy2WUdkayvUYNVfT4Rj7SAlRQtH5I/OwCq3kiAKrQGVD+LPiItRLx8CgezjoBT +e7/Ic1FqkG7dc6orAKZAfYc1S59RnIPnpxVogHMTQgtYrBjsdoRw/bzLQP/746mo +/PjhzxiHAtxJ2ghgkg5vcXMFWyr7UHbdV6pNnwjGkOQjjC6YEvAlL54nXfpcFR6A +vWFBC/kFGtw39eAn3DILjdA353wt8FZRlCh3LuQpcLQq2tq2AfDBrMJ3GXw9HenR +p5du95QFsmbJFBLbuMPKSdythSvOQbxZFaGtbS1RHQIDAQABo4IBTDCCAUgwHAYD +VR0SBBUwE4ERbXJ0ZG9wc0BzdGF0ZS5nb3YwHAYDVR0RBBUwE4ERbXJ0ZG9wc0Bz +dGF0ZS5nb3YwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwgZkG +A1UdHwSBkTCBjjCBi6CBiKCBhYYqaHR0cHM6Ly9wa2Rkb3dubG9hZDEuaWNhby5p +bnQvQ1JMcy9VU0EuY3JshipodHRwczovL3BrZGRvd25sb2FkMi5pY2FvLmludC9D +UkxzL1VTQS5jcmyGK2h0dHA6Ly9jcmxzLnBraS5zdGF0ZS5nb3YvY3Jscy9VU01S +VERDQS5jcmwwKwYDVR0QBCQwIoAPMjAxOTExMTQxNjM3MTJagQ8yMDI1MDUxNTEw +MDkwOVowHQYDVR0OBBYEFPGKi/tqRKNGgzTS1ZIVgViCSkz7MA0GCSqGSIb3DQEB +CwUAA4ICAQARoYLCR1di+iUGqrcBi/ABSFx4oHm2cJzMAT7cs6cUAbzeGhFELYEC +Jzjbwb93lQgg8IpFl8mcBPT4yoMlZDZKKzDiztI9hTwLJw054n5oRk6YJm/45g3Q +1HUb+0wv6HzXfRlCx1fjPsPQFOpcKIKgdNc1QarEaxnUSHG29ie9E2WR3dD8yCFW +kbdGvmlf4FO+P1O+gfUwSbfLuuUg5RDif9bU+D7VBzuC+6QxueKRo6y99ZZcmHTJ +6dsaw/oKABOB+FfSad2RGLvpIynpKjpPNpoFw8H8FcSpOiwpdtSp5tdgLAKVwR/6 +hVMGhuwsSxmxknbLopaKSBC1shp4uZNOlSNjh/d2ssYfGPLrWuTARb/dD9H9SQjg +eqWZV8CJ8cNASsgenIwbygmH70J2p3+qlmA4WLq86qpOzrCUOZaUHYuVSjTEb8fy +CGUjAparnyVnPEUwqeVWOC9tbZtscV9WE4A9c0u8gr1DPVVWIdXrhdpXeOZQwJDm +sKLyTo/yp7GYLMBvNZcMz+orcsyTXoznGk/Xu/7piTpKQZ+EPT8yBp3zb2zNs0Cp +iNTD+szdm/UZE4Wl0kfzCPAz0fSKprZa7ifoiaZZzOwzkpnkpU2SuYcKQqyTw0E+ +Up7Z2qhj2NjkxaikFjTjm4d03dwnU+ojALwufJG1LIj9VShAVQG0ZQ== +-----END CERTIFICATE----- diff --git a/sdk/unique_pem_us/mock_csca.pem b/sdk/unique_pem_us/mock_csca.pem new file mode 100644 index 00000000..81252181 --- /dev/null +++ b/sdk/unique_pem_us/mock_csca.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFpzCCA4+gAwIBAgIUVGoAk38qsh7YYIE2eANMIeZkr+IwDQYJKoZIhvcNAQEL +BQAwYzELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCU1vY2tTdGF0ZTERMA8GA1UEBwwI +TW9ja0NpdHkxGTAXBgNVBAoMEE1vY2tPcmdhbml6YXRpb24xEjAQBgNVBAMMCW1v +Y2tfY3NjYTAeFw0yNDA2MTgxOTA4MzJaFw0yNTA2MTgxOTA4MzJaMGMxCzAJBgNV +BAYTAlhYMRIwEAYDVQQIDAlNb2NrU3RhdGUxETAPBgNVBAcMCE1vY2tDaXR5MRkw +FwYDVQQKDBBNb2NrT3JnYW5pemF0aW9uMRIwEAYDVQQDDAltb2NrX2NzY2EwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDE0JWh/kOzueMgFHwqLHYabpx4 +T0OV58DPuJObuMIKugw8/5l1VLg/Zq2II8/FoATn0Is3JYOidHnFskgkKjW89gxv +RYRlYFPcvRfAxy+3+AO2f3xCnavkNTUI3Jl9q3jBz05SqHgM1cHiYr61ZX5sA980 +OveugRWBbT1mEUNhXTnegfPI9K3b+6YL0QXUePXGpRD9f5lTiCoE/mW8wGkieBYx +QEEskwVpV3cvqwoLCkbdZkRZmIsYE6u7HeAPw2p/yAK6DhqY/vH3svj3LpWvdzBi +Av1wBuuZ6IDgoB0tbgCPOUuc+btezBKhmZXDau0UZc9Y3ND+bMCQEWieXSwCWFYg +y41/onaCaLdT+kcvwdOENNVNvHpaYVDnZGWdt8A95w/dl4Dl19wcL3KkqxoFGB8e +wG+/SDnYTuuGWY3zaROJQ3KYlCqNi3+OuzZTBiJTujaL3Eb/+7Smhy/qtdd6bVUg +mpf3fdBHw+jjl2st+n1rfIYY8rYY7HGrJdome9jXS8pCNfnptp+J8urzgXfEXGFM +qHwMKu/vtfiBt4a1+GC/i2ssaXRcGABiI4xG4BQYXT+4U3p0pAA7cDNH5jN0Wny7 +J5DuEyXzcrRQVFD9hiFmDJfAsc35UwHKpayu9F7JJC4EfWVdahgA9VLhxVIE+eTi +HPRHFyMaVaeqmjrBLQIDAQABo1MwUTAdBgNVHQ4EFgQUVGhgTF0HCJvSxKtE0BvV +tQNMt0cwHwYDVR0jBBgwFoAUVGhgTF0HCJvSxKtE0BvVtQNMt0cwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAtyt8sirr9jc8i5xEnpV3YM6m0poY +bl2S5hDu+xmMRnl8r3lv3v1KE2XrZD0cldV8plYz6oXfWBkCj3j6RUbsNx8w1q27 +Qsb2NC1KZljYG+kHavIIdJty9FOknhgYSYW+UKixSHPuAS+iJxEmGBN8GxhMPpzM +KRzWbpQuPZuBgyKRSeR5ytGqyZrEje9zhkdSg/aFYn3EzLw93CfzrDLrKmXc/dra +vEDyP34ts0Cy7UadCGkJN/SPuZpvF9Fy5f7l8ymHE319ipNZHIMhw50h0l/Puzjd +vn3iHWtwpFw5r+nJTr5zO+3yL4dPcp8XfX3Daa5nDfCJ7dd1wSOf+/1cvBLB5aKc +kyZ/ppvTc3oJAmFHAD2NXf15CUWE18Te/Vy9X2qI8LkFtea6GDF4VBewT2PATg12 +r03xZWa6KFVbgTIq3GUvtZ8UHm+cluTFKX90rFtbzFo658mxQGw5RnE2zp340NzP +v9tNSlP4Tyzr2b1VoQcgmpQ987afINJG39lq2OsSrlK87p9bB4yoFSZwOfqok0nM +IICRxBuTUHLqP3Nhvo+tAl+iK848LDJVf87ZVQHl72JX4lkVvOo5LCXnOQPyowaP +D++J2c6tUj6gs9HAKVX7fH06m/2T5fJHae/OYx36O242yBXPQdHx6qloF/DNvGyM +EHC3NCCjLG5m6G0= +-----END CERTIFICATE----- diff --git a/sdk/utils.ts b/sdk/utils.ts index f671db26..0bcd3745 100644 --- a/sdk/utils.ts +++ b/sdk/utils.ts @@ -1,6 +1,10 @@ import { ethers } from "ethers"; import { getCurrentDateYYMMDD } from "../common/src/utils/utils"; import { REGISTER_ABI, REGISTER_CONTRACT_ADDRESS } from "../common/src/constants/constants"; +import { derToBytes } from "./common/src/utils/csca"; +import forge from 'node-forge' +import { pem1, pem2, pem3, pem4, mock_csca } from './certificates'; +import { fr1pem, fr2pem, fr3pem, fr4pem, mockpem } from './certificates'; export const attributeToGetter = { "nationality": "getNationalityOf", @@ -45,3 +49,87 @@ export function unpackReveal(revealedData_packed: string[]): string[] { return bytesArray.map((byte: bigint) => String.fromCharCode(Number(byte))); } + +export function verifyDSCValidity(dscCertificate: any, dev_mode: boolean = false) { + const authorityKeyIdentifierExt = dscCertificate.extensions.find( + (ext) => ext.name === 'authorityKeyIdentifier' + ); + const value = authorityKeyIdentifierExt.value; + const byteArray = derToBytes(value); + const formattedValue = byteArray.map(byte => byte.toString(16).padStart(2, '0').toUpperCase()).join(':'); + const formattedValueAdjusted = formattedValue.substring(12); // Remove the first '30:16:80:14:' from the formatted string + + const csca_pem = getCscaPem(formattedValueAdjusted, dev_mode); + console.log("CSCA PEM used:", csca_pem.substring(0, 50) + "..."); // Log the first 50 characters of the PEM + + const csca_certificate = forge.pki.certificateFromPem(csca_pem); + try { + // Create a CAStore containing the CSCA certificate + const caStore = forge.pki.createCaStore([csca_certificate]); + + // Verify the DSC certificate's signature using the CSCA certificate + const verified = forge.pki.verifyCertificateChain(caStore, [dscCertificate]); + + if (!verified) { + throw new Error('DSC certificate verification failed'); + } + + // Check if the DSC certificate is within its validity period + const currentDate = new Date(); + if (currentDate < dscCertificate.validity.notBefore || currentDate > dscCertificate.validity.notAfter) { + throw new Error('DSC certificate is not within its validity period'); + } + + return true; + } catch (error) { + console.error('DSC certificate validation error:', error); + return false; + } +} + +function getCscaPem(formattedValueAdjusted: string, dev_mode: boolean): string { + const pemMap = dev_mode ? AKI_PEM_DEV : AKI_PEM_PROD; + const pemKey = pemMap[formattedValueAdjusted as keyof typeof AKI_PEM_PROD]; + + switch (pemKey) { + case "fr1pem": return fr1pem; + case "fr2pem": return fr2pem; + case "fr3pem": return fr3pem; + case "fr4pem": return fr4pem; + case "pem1": return pem1; + case "pem2": return pem2; + case "pem3": return pem3; + case "pem4": return pem4; + case "mock_csca.pem": return mock_csca; + case "mock": return mockpem; + default: + throw new Error(`No matching PEM found for key: ${formattedValueAdjusted}`); + } +} + +export const AKI_PEM_DEV = { + "22:F3:83:20:A5:73:42:2C:AF:46:AB:8C:3D:EE:76:4D:BB:E5:C5:02": "fr2pem", + "0F:CC:32:51:E4:E9:2A:50:65:8C:AF:6A:68:71:BC:9E:8F:C8:6D:59": "fr3pem", + "BE:8A:2E:D6:C9:F9:20:4E:3A:27:03:08:97:4D:EC:FD:D9:7D:C5:E6": "fr1pem", + "66:36:B0:9B:26:D2:F2:80:54:5E:DA:C7:66:C8:F0:12:4D:B5:3B:B4": "fr4pem", + "F1:8A:8B:FB:6A:44:A3:46:83:34:D2:D5:92:15:81:58:82:4A:4C:FB": "pem4", + "E6:2D:65:16:F6:15:A8:6A:E7:89:EE:81:3C:BF:3E:1D:C2:A0:80:F4": "pem3", + "BA:A6:B6:2F:13:7B:13:31:C9:C8:81:31:9E:55:21:86:3D:7B:8F:3A": "pem2", + "B1:1A:1D:F8:23:A2:96:94:8E:E7:EA:49:A8:CC:87:72:C6:FA:DE:9A": "pem1", + "54:68:60:4C:5D:07:08:9B:D2:C4:AB:44:D0:1B:D5:B5:03:4C:B7:47": "mock" +} +export const AKI_PEM_PROD = { + "F1:8A:8B:FB:6A:44:A3:46:83:34:D2:D5:92:15:81:58:82:4A:4C:FB": "pem4", + "E6:2D:65:16:F6:15:A8:6A:E7:89:EE:81:3C:BF:3E:1D:C2:A0:80:F4": "pem3", + "BA:A6:B6:2F:13:7B:13:31:C9:C8:81:31:9E:55:21:86:3D:7B:8F:3A": "pem2", + "B1:1A:1D:F8:23:A2:96:94:8E:E7:EA:49:A8:CC:87:72:C6:FA:DE:9A": "pem1" +} + + + +export const AKI_MODULUS = { + "F1:8A:8B:FB:6A:44:A3:46:83:34:D2:D5:92:15:81:58:82:4A:4C:FB": "00:a3:32:0e:36:16:2a:5d:e2:d6:4e:2d:ab:84:39:be:5f:66:57:d4:e3:14:af:f8:fb:0d:98:1c:eb:35:d9:ed:5c:ec:61:50:7e:e8:04:62:21:ba:24:ef:b4:b1:3e:d9:3d:65:e5:08:aa:e8:e3:5b:9f:49:c9:bf:84:52:22:3a:82:22:19:3a:ef:73:63:b0:40:f8:d4:1f:85:97:b2:c3:3a:f5:5c:a5:e1:7d:13:9d:e6:69:94:8a:fd:cd:cf:9b:a4:30:11:70:06:80:9a:38:75:1c:86:8a:b0:9a:5d:f9:94:29:3e:5f:b2:b7:34:e4:be:f8:75:9b:9f:1b:d1:40:5a:8e:22:db:13:71:a3:20:da:3a:7d:04:5f:af:98:7a:f4:9d:bb:9c:b2:2e:33:03:70:73:50:a5:ac:ad:bb:dc:57:4e:4c:e0:7f:f2:a3:2a:ee:ff:9b:aa:f0:99:2d:4b:16:f1:0b:32:b7:88:a5:d5:ca:2e:92:c1:19:0e:88:97:a4:6f:3b:55:2a:8b:84:2d:09:55:86:58:46:69:c5:0e:43:cb:9b:f8:f4:da:e2:04:56:29:51:ed:87:af:18:99:85:b9:93:5d:bf:d8:1e:76:0a:bc:c0:9d:dc:42:19:ec:1f:37:92:af:0f:2e:70:a1:01:03:5c:77:09:f8:ef:6c:e7:79:62:62:36:45:35:4e:5c:78:bf:91:e3:c8:d4:a1:72:d5:3e:e0:a6:5c:54:0a:aa:8d:4d:fe:df:be:95:64:7a:89:c5:b2:f2:d9:65:1d:91:ac:af:51:83:55:7d:3e:11:8f:b4:80:95:14:2d:1f:92:3f:3b:00:aa:de:48:80:2a:b4:06:54:3f:8b:3e:22:2d:44:bc:7c:0a:07:b3:8e:80:53:7b:bf:c8:73:51:6a:90:6e:dd:73:aa:2b:00:a6:40:7d:87:35:4b:9f:51:9c:83:e7:a7:15:68:80:73:13:42:0b:58:ac:18:ec:76:84:70:fd:bc:cb:40:ff:fb:e3:a9:a8:fc:f8:e1:cf:18:87:02:dc:49:da:08:60:92:0e:6f:71:73:05:5b:2a:fb:50:76:dd:57:aa:4d:9f:08:c6:90:e4:23:8c:2e:98:12:f0:25:2f:9e:27:5d:fa:5c:15:1e:80:bd:61:41:0b:f9:05:1a:dc:37:f5:e0:27:dc:32:0b:8d:d0:37:e7:7c:2d:f0:56:51:94:28:77:2e:e4:29:70:b4:2a:da:da:b6:01:f0:c1:ac:c2:77:19:7c:3d:1d:e9:d1:a7:97:6e:f7:94:05:b2:66:c9:14:12:db:b8:c3:ca:49:dc:ad:85:2b:ce:41:bc:59:15:a1:ad:6d:2d:51:1d", + "E6:2D:65:16:F6:15:A8:6A:E7:89:EE:81:3C:BF:3E:1D:C2:A0:80:F4": "00:c3:85:46:1e:7a:f7:8e:c2:3f:fd:bb:f8:7c:a0:66:19:82:dc:ad:d7:00:06:44:0d:99:5a:fc:c6:49:a5:4b:bc:71:90:31:10:0a:88:67:cc:a4:a4:f2:fd:13:f8:bd:32:a7:78:7e:59:cb:4e:d5:9c:2c:68:97:d4:d0:70:dd:32:88:03:98:4b:f7:49:ea:0d:22:63:ae:aa:2a:1f:ce:40:cb:74:7e:bf:21:60:3f:25:f1:30:05:80:f3:fb:57:27:ef:fa:db:1e:e1:42:c2:8f:dd:90:f3:49:91:e1:3b:3a:b2:c6:77:d8:3a:b6:c8:fc:62:26:cc:66:b0:7c:37:b9:c8:56:01:1a:f5:03:84:8a:a5:e6:51:45:78:28:d2:8a:45:92:4b:bb:f4:5a:5b:36:46:36:af:89:aa:55:e0:00:d2:af:4b:02:96:55:6f:9a:20:d6:fc:e1:47:e4:04:87:5b:3d:f2:24:12:ae:89:31:da:24:f9:82:10:c8:77:a6:10:fe:a7:c6:71:c0:55:0c:0e:61:19:20:1e:27:70:f5:81:d7:65:99:07:82:1e:f9:79:f8:b1:32:80:32:dc:b4:31:be:89:27:10:2a:e5:a5:98:31:a8:8a:5d:ba:9f:80:c2:c1:16:f2:1a:09:65:ba:5d:dc:3c:5e:6f:6e:c0:00:5d:d1:97:d2:c1:18:f8:b5:b6:17:75:03:84:1b:fc:08:d5:0e:d2:32:41:a5:3a:d9:c1:e8:ed:f1:06:71:6e:64:56:0f:c1:2c:68:4a:1f:e4:49:28:ea:84:66:81:bc:6f:cd:17:d2:3b:ff:67:65:4d:36:d0:d4:ff:c7:e5:70:a1:bd:0e:40:fe:77:e9:20:8c:c4:00:c8:f0:8e:8c:2d:9a:72:10:dc:2b:96:5c:d5:0f:3f:b6:ad:13:db:9c:7a:1a:84:63:6f:16:9d:a9:1e:8c:2a:b0:18:68:ff:0a:38:b0:ab:2f:43:09:b2:3b:dc:7c:3d:cc:fa:17:72:25:72:4f:37:fe:d3:78:2c:8a:6c:af:9d:06:f5:42:93:d0:5e:3e:2e:a5:04:a9:a9:ea:51:07:8f:2c:b2:76:03:41:07:36:4f:ad:33:5f:e6:5e:b4:3a:1f:5e:5a:96:88:a1:31:dc:99:3a:12:eb:32:95:7d:f1:5b:fd:d5:a7:90:24:c5:d4:10:6e:cb:55:60:24:d7:88:b2:99:fc:9f:53:e1:63:94:36:de:ab:d5:f2:af:90:d5:36:b5:5f:74:c5:1a:4b:c0:6f:54:97:1a:23:d0:5b:81:dd:d8:9a:c5:24:40:68:f0:08:7c:9e:7f:2b:40:a5:fd:f7:d3:cb:23:e0:27:d5:a7", + "BA:A6:B6:2F:13:7B:13:31:C9:C8:81:31:9E:55:21:86:3D:7B:8F:3A": "00:c3:d3:e6:fa:f2:cc:b8:4f:e1:d3:4e:44:2b:2e:8d:55:78:48:f9:a7:d1:f6:26:94:46:7e:84:35:53:ab:03:2f:90:04:db:e8:97:8b:cd:44:20:aa:11:c1:f0:ad:cd:b5:7b:c2:a6:46:81:6a:a0:de:da:d7:f6:22:76:86:4a:22:c0:46:ff:c1:e4:8a:d1:6a:3d:7e:fa:16:e7:55:71:8d:67:a6:ac:d1:14:c9:6f:fb:79:1f:e5:80:0d:ae:16:f3:0a:a5:65:a3:55:02:19:73:9f:44:9c:19:50:a8:09:43:d5:9b:fb:e3:8c:48:c9:b3:48:9c:20:5d:03:fd:6f:14:54:44:74:65:1a:5f:37:dc:20:ae:76:b7:47:6a:32:9f:10:5d:1f:fd:fe:56:37:1e:3f:b3:6f:c3:6d:f0:5a:5b:e1:4a:f4:b0:1e:5c:8a:a3:16:44:bc:c4:31:af:d4:b6:bb:f3:98:28:86:92:03:02:4e:9d:6c:a3:21:55:65:93:ed:8c:0f:9b:74:f9:a3:1d:84:e7:d2:08:37:ae:6a:27:39:8a:78:a2:9d:85:a6:5d:af:b6:73:af:18:58:57:15:63:71:ee:8a:15:39:5c:ac:dd:5f:aa:d0:27:02:37:84:4c:41:04:9d:f2:20:c3:8b:65:57:cd:bb:3e:6d:52:f5:d1:19:9c:7c:e4:c5:69:ae:b1:1a:35:50:d7:90:c3:ba:5d:3b:fb:00:bb:2d:f8:b9:54:40:f4:20:61:74:44:f1:4e:f4:4c:a4:1a:e7:cc:cd:46:e6:60:7b:1f:b9:6d:b1:2d:13:d8:6a:7c:42:24:71:69:74:7d:0a:7a:49:00:8d:c1:8a:5e:a5:24:9f:df:28:9c:15:cb:3a:fb:c5:1f:5c:db:0b:38:0c:82:7f:ba:1d:09:83:2f:30:91:e5:4e:89:ed:1a:bd:ae:8a:10:8e:cf:0b:3d:0d:d8:63:73:d0:97:76:b0:05:d4:04:3b:1f:b3:f9:cd:2b:0e:ca:da:4e:47:2c:9f:f9:6c:9c:fd:d1:df:13:c2:81:3a:8f:9c:5a:07:63:9b:3a:10:b0:04:5c:93:6f:40:ac:2e:b5:a7:68:8b:bf:67:22:6b:d0:ff:cd:a9:66:1a:65:78:6f:e2:82:1e:a2:eb:14:1c:49:78:aa:9b:e7:ec:af:61:54:d2:93:d5:ce:ea:00:a1:f7:64:46:cb:12:7c:55:e4:36:21:e6:ab:11:c0:89:ad:e0:cf:41:e4:b2:6c:16:88:c9:db:c4:ea:38:4d:43:07:ee:03:aa:0f:66:85:0f:82:69:7d:6c:d5:4a:f0:ec:fa:8e:a8:0f:2e:fd:eb:a4:d1:8c:43:f3:a9", + "B1:1A:1D:F8:23:A2:96:94:8E:E7:EA:49:A8:CC:87:72:C6:FA:DE:9A": "00:bd:bc:15:fb:39:7f:bc:1c:cb:58:06:9d:ae:d4:d2:a4:2f:65:ff:33:8e:cc:04:0a:6f:08:55:5c:21:8f:28:ad:12:7c:e8:e2:a8:82:52:55:f6:e8:43:e4:ef:cf:ae:c5:83:16:fc:2c:38:54:27:3a:14:4b:11:e3:87:b3:ef:3b:c3:58:c0:65:cc:85:0a:f0:d0:9c:c0:01:18:cf:a9:b1:94:49:3d:ea:5c:ef:c3:7c:4c:00:8a:51:4a:c7:53:6f:9a:5a:f1:66:00:12:eb:88:88:a9:48:e5:ec:81:b0:60:0a:40:2c:4d:4e:93:98:e4:12:f6:03:4c:4d:7a:b8:27:b9:45:0c:f4:be:ea:9a:29:c8:22:ae:b8:70:21:6e:82:e2:bd:b0:c7:d1:b5:c6:be:ff:a6:22:08:ed:fa:3d:ec:3e:e1:e7:2d:36:d3:a3:b0:b2:10:a5:1c:09:90:d2:9e:0b:48:af:8d:c5:ec:69:ea:c5:9a:0e:c6:ff:13:b8:ca:8c:b7:31:91:c2:89:2e:c6:b2:18:5e:7c:79:d5:b8:7e:72:3d:d8:1b:88:de:90:21:3d:22:69:32:60:88:99:d3:7c:2e:f1:77:da:8d:23:9d:89:98:3e:c4:45:94:bb:23:db:e5:04:02:71:f5:dd:bb:35:a9:2d:3b:be:f4:67:c7:70:97:98:f6:13:1a:5e:9a:9a:56:e6:78:f6:8c:0e:05:78:a9:63:3c:7b:bd:5d:75:58:23:d6:3c:99:00:d8:33:c7:87:c3:4f:d0:7c:d8:0f:3e:23:0d:77:64:ea:54:fe:b0:56:f4:e6:77:46:4d:9a:48:e9:85:0b:af:55:ab:5d:9c:6d:8a:df:5e:86:dc:dc:65:f2:43:f8:5b:e3:23:22:de:d7:cd:4b:69:ea:79:eb:1b:d9:ae:7f:1a:bc:4a:87:03:88:88:da:c9:70:29:67:cd:39:6a:ad:d7:23:10:77:59:60:25:d3:e2:44:7a:c2:96:c6:01:03:6b:b9:ec:3f:05:62:2e:5a:b1:ae:81:73:c1:f1:a8:7c:7f:cb:6d:2d:eb:46:3b:9e:64:31:a3:c3:6e:4f:99:5d:8e:83:94:38:c3:2f:39:ee:ac:5d:1b:13:36:62:35:c4:66:51:0f:29:da:ba:53:a1:1a:a6:1f:f5:e7:b4:4d:0e:81:ab:06:cc:19:9c:25:7e:68:30:d0:be:ef:3b:c4:2c:12:5c:73:d6:33:30:88:17:5f:b4:79:56:52:39:fc:6b:e7:9e:7e:31:ea:59:a2:8a:8e:45:59:bd:e4:b0:c7:35:31:66:13:37:66:e6:93:9b:72:c8:ac:6f:43:a6:78:ad:97:71:fb:55" +} \ No newline at end of file