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 && (
+ paginate(-1)}
+ zi={100}
+ />
+ )}
+
+
+
+ {currentSlide.header}
+ {currentSlide.subtitle}
+
+
+
+
+ private and secured
+
+
+
+ handleNfcScan?.() : () => paginate(+1)}
+ text={currentSlide.acknowledgment}
+ Icon={isLastImage ? : undefined}
+ blueVariant={!isLastImage}
+ />
+
+ )
+}
\ No newline at end of file
diff --git a/app/src/components/CustomButton.tsx b/app/src/components/CustomButton.tsx
new file mode 100644
index 00000000..449c406c
--- /dev/null
+++ b/app/src/components/CustomButton.tsx
@@ -0,0 +1,32 @@
+import React from 'react';
+import { Button, Text } from 'tamagui';
+import { bgBlue, bgGreen, textBlack } from '../utils/colors';
+import useNavigationStore from '../stores/navigationStore';
+
+interface CustomButtonProps {
+ text: string;
+ onPress: () => void;
+ Icon?: React.ReactNode;
+ bgColor?: string;
+ h?: string;
+ isDisabled?: boolean;
+ disabledOnPress?: () => void;
+ blueVariant?: boolean;
+}
+
+const CustomButton: React.FC = ({ text, onPress, Icon, bgColor, h, isDisabled, disabledOnPress, blueVariant }) => {
+ const {
+ toast,
+ } = useNavigationStore();
+ return (
+
+ {Icon && {Icon} }
+
+ {text}
+
+
+ );
+};
+
+
+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
+ 1 Find the QR code on the page of the app that asks for proof of passport.
+ 2 Scan the QR code.
+
+
+
+
+
+ Generate a Proof
+ 1 Generate a proof of the selected information.
+ 2 Share 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={ } />
-
-
-
- setSheetIsOpen(true)}>
-
-
-
+
);
};
-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")}
-
-
- setSettingsIsOpen(true)}>
- setHelpIsOpen(true)}>
+
+ {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")}
+
+
+ setSettingsIsOpen(true)}>
+ setHelpIsOpen(true)}>
+
+
+
+
+ )} */}
+
@@ -421,6 +473,16 @@ const MainScreen: React.FC = () => {
+
+
+ registered = (!registered)
+
+ setRegistered(!registered)}>
+
+
+
+
+
>
)}
@@ -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.
+
+
- {/* setHelpIsOpen(false)}>
- Close
- */}
+
+ 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(true)}
+ borderRadius={"$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(true)}
+ borderRadius="$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!
-
-
- Contribute
-
- setDialogContributeIsOpen(true)}>
-
-
-
+ 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.
- setStep(Steps.REGISTER)}
- borderWidth={1.3} borderColor={borderColor} borderRadius="$10" bg="#3185FC"
- mb="$6"
- w="100%"
- >
- Next
-
+
+
+
+ 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
-
- update({
- majority: majority - 1
- })}
- >
-
-
- update({
- majority: majority + 1
- })}
- >
-
-
-
- ) : (
-
- {hideData ? maskString(mrzAttributeFormatted) : mrzAttributeFormatted}
-
- )}
-
- );
- })}
-
-
-
-
-
- {!registered ? (
-
-
-
- Registering identity...
-
-
- ) : isZkeyDownloading[selectedApp.circuit] ? (
-
-
-
- Downloading ZK proving key
-
-
- ) : step === Steps.GENERATING_PROOF ? (
-
-
-
- Generating ZK proof
+ No other information than the one selected below will be shared with {selectedApp.name}.
+
+ :
+
+ {selectedApp.name} is requesting you to prove you own a valid passport.
+
+ }
+
+
+ {selectedApp && Object.keys(selectedApp.disclosureOptions as any).map((key) => {
+ const key_ = key;
+ const keyFormatted = key_.replace(/_/g, ' ').split(' ').map((word: string) => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
+
+ return (
+
+
+
+ {disclosureFieldsToText(key_, (selectedApp.disclosureOptions as any)[key_])}
- ) : address == ethers.ZeroAddress ? (
-
- Enter address
-
- ) : (
-
- Generate ZK proof
-
- )}
-
- {
- (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
- : }
+ />
+ {/* {
>
{(registering || isZkeyDownloading.register_sha256WithRSAEncryption_65537) && }
-
+
{isZkeyDownloading.register_sha256WithRSAEncryption_65537 ? "Downloading zkey..." : (registerStep || "Register")}
-
+ */}
);
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");
+ }} />
+ {/* {
+ setSelectedTab("register");
+ }}>
+ Register
+ */}
+
+ );
+};
+
+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-----
+MIIGVzCCBD+gAwIBAgIETjIpKzANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMC
+VVMxGDAWBgNVBAoMD1UuUy4gR292ZXJubWVudDEcMBoGA1UECwwTRGVwYXJ0bWVu
+dCBvZiBTdGF0ZTENMAsGA1UECwwETVJURDEiMCAGA1UECwwZQ2VydGlmaWNhdGlv
+biBBdXRob3JpdGllczEpMCcGA1UECwwgVS5TLiBEZXBhcnRtZW50IG9mIFN0YXRl
+IE1SVEQgQ0EwHhcNMTQxMjE4MTYyMTAxWhcNMzAwODA4MTYzNjI3WjCBozELMAkG
+A1UEBhMCVVMxGDAWBgNVBAoMD1UuUy4gR292ZXJubWVudDEcMBoGA1UECwwTRGVw
+YXJ0bWVudCBvZiBTdGF0ZTENMAsGA1UECwwETVJURDEiMCAGA1UECwwZQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdGllczEpMCcGA1UECwwgVS5TLiBEZXBhcnRtZW50IG9m
+IFN0YXRlIE1SVEQgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDD
+hUYeeveOwj/9u/h8oGYZgtyt1wAGRA2ZWvzGSaVLvHGQMRAKiGfMpKTy/RP4vTKn
+eH5Zy07VnCxol9TQcN0yiAOYS/dJ6g0iY66qKh/OQMt0fr8hYD8l8TAFgPP7Vyfv
++tse4ULCj92Q80mR4Ts6ssZ32Dq2yPxiJsxmsHw3uchWARr1A4SKpeZRRXgo0opF
+kku79FpbNkY2r4mqVeAA0q9LApZVb5og1vzhR+QEh1s98iQSrokx2iT5ghDId6YQ
+/qfGccBVDA5hGSAeJ3D1gddlmQeCHvl5+LEygDLctDG+iScQKuWlmDGoil26n4DC
+wRbyGgllul3cPF5vbsAAXdGX0sEY+LW2F3UDhBv8CNUO0jJBpTrZwejt8QZxbmRW
+D8EsaEof5Eko6oRmgbxvzRfSO/9nZU020NT/x+Vwob0OQP536SCMxADI8I6MLZpy
+ENwrllzVDz+2rRPbnHoahGNvFp2pHowqsBho/wo4sKsvQwmyO9x8Pcz6F3Ilck83
+/tN4LIpsr50G9UKT0F4+LqUEqanqUQePLLJ2A0EHNk+tM1/mXrQ6H15aloihMdyZ
+OhLrMpV98Vv91aeQJMXUEG7LVWAk14iymfyfU+FjlDbeq9Xyr5DVNrVfdMUaS8Bv
+VJcaI9Bbgd3YmsUkQGjwCHyefytApf3308sj4CfVpwIDAQABo4GQMIGNMBIGA1Ud
+EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMB8GA1UdIwQYMBaAFLEaHfgj
+opaUjufqSajMh3LG+t6aMB0GA1UdDgQWBBTmLWUW9hWoaueJ7oE8vz4dwqCA9DAR
+BglghkgBhvhCAQEEBAMCAAcwFAYDVR0lBA0wCwYJKoZIhvZ9B0oDMA0GCSqGSIb3
+DQEBCwUAA4ICAQANUdyxXA+JgHzng4kodNdTBYOSNlHTUZr1ktg/7uT2E9CNmoZw
+cZU1sSEzLu+eUPatWyC5LkrmDdPPX93T0MWyMvE5enVBm/sxp+aOocd24lLm2K+1
+9KrRWS1r7JR7aaj1tpoSNDFQFZoopgCPk1gKn9juuD0SbGz4ZxfdB96FvPDQx9CU
+PWEoXAOZSvRz3MKoZVh3jj5CPvGZxxIYs0YUjuzGEE3To3oeYJHkaFr6Ph61smwQ
+5IAjCY7uCRSKNSantgJ0DQ/X9OBONz8S8Fb8BCeAocUkzA+QP1EycWNZtELsSkyA
+Rbs04ugOciuBscyLq+hB9eGSkUbiJDKpFt6yt/58dbEXdaumFEoSgakcEilhiJBR
+K+DEmkqljKlra/uBJnHbNZi0zTFpA29OTMsKRTWdTFg9a4dWFD2jo3qw/EfIpmLx
+eZc5KPelHttd7dEzLmkpXbzjg5c4GrcdgrM2yga/sRosIqJf9UU5A7fVKcuLVOT+
+8I6dmFe8ldqMFNhmkNn3JFDmDau6932HmmGUe3TPPkWFOWN4lUsaHyXRc0zr+632
+haPrOMstjkirqXOuLxPTLoQS437z2q4pW4FaHULeNsdryCrp6aWLJzew+l16K8Y3
+bk1MvDAJepRRKsuocTHaXbqCL03X4w0KHfSWG5oi6rgbmNz5v7LUP2C2lA==
+-----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