@succinctlabs/react-native-zcam1 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +61 -0
  2. package/Zcam1Sdk.podspec +157 -0
  3. package/app.plugin.js +11 -0
  4. package/cpp/generated/zcam1_c2pa_utils.cpp +4091 -0
  5. package/cpp/generated/zcam1_c2pa_utils.hpp +367 -0
  6. package/cpp/generated/zcam1_certs_utils.cpp +1799 -0
  7. package/cpp/generated/zcam1_certs_utils.hpp +72 -0
  8. package/cpp/generated/zcam1_verify_utils.cpp +1857 -0
  9. package/cpp/generated/zcam1_verify_utils.hpp +79 -0
  10. package/cpp/proving/generated/zcam1_proving_utils.cpp +3661 -0
  11. package/cpp/proving/generated/zcam1_proving_utils.hpp +275 -0
  12. package/cpp/proving/zcam1-proving.cpp +16 -0
  13. package/cpp/proving/zcam1-proving.h +15 -0
  14. package/cpp/zcam1-sdk.cpp +20 -0
  15. package/cpp/zcam1-sdk.h +15 -0
  16. package/ios/Zcam1Camera.swift +2945 -0
  17. package/ios/Zcam1CameraFilmStyle.swift +191 -0
  18. package/ios/Zcam1CameraViewManager.m +86 -0
  19. package/ios/Zcam1Capture.h +13 -0
  20. package/ios/Zcam1Capture.mm +500 -0
  21. package/ios/Zcam1DepthData.swift +417 -0
  22. package/ios/Zcam1Sdk.h +16 -0
  23. package/ios/Zcam1Sdk.mm +66 -0
  24. package/ios/proving/Zcam1Proving.h +16 -0
  25. package/ios/proving/Zcam1Proving.mm +66 -0
  26. package/lib/module/NativeZcam1Capture.js +12 -0
  27. package/lib/module/NativeZcam1Capture.js.map +1 -0
  28. package/lib/module/NativeZcam1Sdk.js +7 -0
  29. package/lib/module/NativeZcam1Sdk.js.map +1 -0
  30. package/lib/module/bindings.js +51 -0
  31. package/lib/module/bindings.js.map +1 -0
  32. package/lib/module/camera.js +522 -0
  33. package/lib/module/camera.js.map +1 -0
  34. package/lib/module/capture.js +120 -0
  35. package/lib/module/capture.js.map +1 -0
  36. package/lib/module/common.js +35 -0
  37. package/lib/module/common.js.map +1 -0
  38. package/lib/module/generated/zcam1_c2pa_utils-ffi.js +43 -0
  39. package/lib/module/generated/zcam1_c2pa_utils-ffi.js.map +1 -0
  40. package/lib/module/generated/zcam1_c2pa_utils.js +1202 -0
  41. package/lib/module/generated/zcam1_c2pa_utils.js.map +1 -0
  42. package/lib/module/generated/zcam1_certs_utils-ffi.js +43 -0
  43. package/lib/module/generated/zcam1_certs_utils-ffi.js.map +1 -0
  44. package/lib/module/generated/zcam1_certs_utils.js +399 -0
  45. package/lib/module/generated/zcam1_certs_utils.js.map +1 -0
  46. package/lib/module/generated/zcam1_proving_utils-ffi.js +43 -0
  47. package/lib/module/generated/zcam1_proving_utils-ffi.js.map +1 -0
  48. package/lib/module/generated/zcam1_proving_utils.js +515 -0
  49. package/lib/module/generated/zcam1_proving_utils.js.map +1 -0
  50. package/lib/module/generated/zcam1_verify_utils-ffi.js +43 -0
  51. package/lib/module/generated/zcam1_verify_utils-ffi.js.map +1 -0
  52. package/lib/module/generated/zcam1_verify_utils.js +252 -0
  53. package/lib/module/generated/zcam1_verify_utils.js.map +1 -0
  54. package/lib/module/index.js +31 -0
  55. package/lib/module/index.js.map +1 -0
  56. package/lib/module/package.json +1 -0
  57. package/lib/module/picker.js +222 -0
  58. package/lib/module/picker.js.map +1 -0
  59. package/lib/module/proving/NativeZcam1Proving.js +7 -0
  60. package/lib/module/proving/NativeZcam1Proving.js.map +1 -0
  61. package/lib/module/proving/bindings.js +46 -0
  62. package/lib/module/proving/bindings.js.map +1 -0
  63. package/lib/module/proving/index.js +5 -0
  64. package/lib/module/proving/index.js.map +1 -0
  65. package/lib/module/proving/prove.js +346 -0
  66. package/lib/module/proving/prove.js.map +1 -0
  67. package/lib/module/utils.js +27 -0
  68. package/lib/module/utils.js.map +1 -0
  69. package/lib/module/verify.js +82 -0
  70. package/lib/module/verify.js.map +1 -0
  71. package/lib/typescript/package.json +1 -0
  72. package/lib/typescript/src/NativeZcam1Capture.d.ts +280 -0
  73. package/lib/typescript/src/NativeZcam1Capture.d.ts.map +1 -0
  74. package/lib/typescript/src/NativeZcam1Sdk.d.ts +8 -0
  75. package/lib/typescript/src/NativeZcam1Sdk.d.ts.map +1 -0
  76. package/lib/typescript/src/bindings.d.ts +14 -0
  77. package/lib/typescript/src/bindings.d.ts.map +1 -0
  78. package/lib/typescript/src/camera.d.ts +300 -0
  79. package/lib/typescript/src/camera.d.ts.map +1 -0
  80. package/lib/typescript/src/capture.d.ts +59 -0
  81. package/lib/typescript/src/capture.d.ts.map +1 -0
  82. package/lib/typescript/src/common.d.ts +10 -0
  83. package/lib/typescript/src/common.d.ts.map +1 -0
  84. package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts +175 -0
  85. package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts.map +1 -0
  86. package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts +811 -0
  87. package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts.map +1 -0
  88. package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts +82 -0
  89. package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts.map +1 -0
  90. package/lib/typescript/src/generated/zcam1_certs_utils.d.ts +413 -0
  91. package/lib/typescript/src/generated/zcam1_certs_utils.d.ts.map +1 -0
  92. package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts +153 -0
  93. package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts.map +1 -0
  94. package/lib/typescript/src/generated/zcam1_proving_utils.d.ts +321 -0
  95. package/lib/typescript/src/generated/zcam1_proving_utils.d.ts.map +1 -0
  96. package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts +84 -0
  97. package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts.map +1 -0
  98. package/lib/typescript/src/generated/zcam1_verify_utils.d.ts +286 -0
  99. package/lib/typescript/src/generated/zcam1_verify_utils.d.ts.map +1 -0
  100. package/lib/typescript/src/index.d.ts +29 -0
  101. package/lib/typescript/src/index.d.ts.map +1 -0
  102. package/lib/typescript/src/picker.d.ts +103 -0
  103. package/lib/typescript/src/picker.d.ts.map +1 -0
  104. package/lib/typescript/src/proving/NativeZcam1Proving.d.ts +8 -0
  105. package/lib/typescript/src/proving/NativeZcam1Proving.d.ts.map +1 -0
  106. package/lib/typescript/src/proving/bindings.d.ts +8 -0
  107. package/lib/typescript/src/proving/bindings.d.ts.map +1 -0
  108. package/lib/typescript/src/proving/index.d.ts +3 -0
  109. package/lib/typescript/src/proving/index.d.ts.map +1 -0
  110. package/lib/typescript/src/proving/prove.d.ts +74 -0
  111. package/lib/typescript/src/proving/prove.d.ts.map +1 -0
  112. package/lib/typescript/src/utils.d.ts +2 -0
  113. package/lib/typescript/src/utils.d.ts.map +1 -0
  114. package/lib/typescript/src/verify.d.ts +45 -0
  115. package/lib/typescript/src/verify.d.ts.map +1 -0
  116. package/package.json +118 -0
  117. package/src/NativeZcam1Capture.ts +335 -0
  118. package/src/NativeZcam1Sdk.ts +10 -0
  119. package/src/bindings.tsx +49 -0
  120. package/src/camera.tsx +705 -0
  121. package/src/capture.tsx +165 -0
  122. package/src/common.tsx +46 -0
  123. package/src/generated/zcam1_c2pa_utils-ffi.ts +456 -0
  124. package/src/generated/zcam1_c2pa_utils.ts +1866 -0
  125. package/src/generated/zcam1_certs_utils-ffi.ts +187 -0
  126. package/src/generated/zcam1_certs_utils.ts +549 -0
  127. package/src/generated/zcam1_proving_utils-ffi.ts +374 -0
  128. package/src/generated/zcam1_proving_utils.ts +804 -0
  129. package/src/generated/zcam1_verify_utils-ffi.ts +196 -0
  130. package/src/generated/zcam1_verify_utils.ts +372 -0
  131. package/src/index.ts +73 -0
  132. package/src/picker.tsx +342 -0
  133. package/src/proving/NativeZcam1Proving.ts +10 -0
  134. package/src/proving/bindings.tsx +50 -0
  135. package/src/proving/index.ts +8 -0
  136. package/src/proving/prove.tsx +492 -0
  137. package/src/utils.ts +38 -0
  138. package/src/verify.tsx +119 -0
  139. package/turbo.json +27 -0
package/src/picker.tsx ADDED
@@ -0,0 +1,342 @@
1
+ import { CameraRoll } from "@react-native-camera-roll/camera-roll";
2
+ import { FlashList, useRecyclingState } from "@shopify/flash-list";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import { Dimensions, Image, StyleSheet, TouchableOpacity, View } from "react-native";
5
+ import { createThumbnail } from "react-native-create-thumbnail";
6
+ import { Dirs, FileSystem, Util } from "react-native-file-access";
7
+
8
+ import { AuthenticityStatus, authenticityStatus } from "./bindings";
9
+
10
+ /**
11
+ * Configuration for loading images from a private folder.
12
+ */
13
+ export interface PrivateFolder {
14
+ /**
15
+ * The file system path to the private folder containing images.
16
+ */
17
+ path: string;
18
+ }
19
+
20
+ /**
21
+ * Configuration for loading images from the device's photo gallery.
22
+ */
23
+ export interface PhotoGallery {
24
+ /**
25
+ * The name of the album to load images from.
26
+ */
27
+ album?: string;
28
+ }
29
+
30
+ /**
31
+ * Props for the ZImagePicker component.
32
+ */
33
+ export interface ZImagePickerProps {
34
+ /**
35
+ * The source from which to load images. Can be either a PrivateFolder or PhotoGallery.
36
+ */
37
+ source: PrivateFolder | PhotoGallery;
38
+
39
+ /**
40
+ * Change this value to force the picker to reload images.
41
+ * Useful when the underlying folder/album contents may have changed
42
+ * while this screen stayed mounted.
43
+ */
44
+ refreshToken?: string | number;
45
+
46
+ /**
47
+ * Whether to start rendering images from the bottom of the list.
48
+ * Defaults to false (renders from top).
49
+ */
50
+ renderFromBottom?: boolean;
51
+
52
+ /**
53
+ * Sort order for images.
54
+ * Defaults to 'oldest-first' (oldest images first in the list).
55
+ */
56
+ sortOrder?: "newest-first" | "oldest-first";
57
+
58
+ /**
59
+ * Optional function to render a badge based on the authenticity status of an image.
60
+ * @param status - The authenticity status of the image.
61
+ * @returns A React element to display as a badge, or null to display nothing.
62
+ */
63
+ renderBadge?: (uri: string, status: AuthenticityStatus) => React.ReactElement | null;
64
+
65
+ /**
66
+ * Optional callback function that is called when an image is selected.
67
+ * @param uri - The URI of the selected image.
68
+ */
69
+ onSelect?: (uri: string) => void;
70
+
71
+ /**
72
+ * Enable multi-selection mode.
73
+ * Defaults to false (single-selection mode).
74
+ */
75
+ multiSelect?: boolean;
76
+
77
+ /**
78
+ * Array of currently selected image URIs. Only used when multiSelect is true.
79
+ */
80
+ selectedUris?: string[];
81
+
82
+ /**
83
+ * Optional callback function that is called when the selection changes in multi-select mode.
84
+ * @param uris - Array of currently selected image URIs.
85
+ */
86
+ onSelectionChange?: (uris: string[]) => void;
87
+
88
+ /**
89
+ * Optional function to render a selection overlay when an image is selected in multi-select mode.
90
+ * @param uri - The URI of the image.
91
+ * @param isSelected - Whether the image is currently selected.
92
+ * @returns A React element to display as a selection overlay, or null to display nothing.
93
+ */
94
+ renderSelectionOverlay?: (uri: string, isSelected: boolean) => React.ReactElement | null;
95
+ }
96
+
97
+ /**
98
+ * Returns the path to the app's private document directory.
99
+ * @returns {string} The path to the private document directory.
100
+ */
101
+ export function privateDirectory(): string {
102
+ return Dirs.DocumentDir;
103
+ }
104
+
105
+ const ZImageItem = ({
106
+ uri,
107
+ renderBadge,
108
+ renderSelectionOverlay,
109
+ onSelect,
110
+ multiSelect,
111
+ isSelected,
112
+ }: {
113
+ uri: string;
114
+ renderBadge?: (uri: string, status: AuthenticityStatus) => React.ReactElement | null;
115
+ renderSelectionOverlay?: (uri: string, isSelected: boolean) => React.ReactElement | null;
116
+ onSelect: (uri: string) => void;
117
+ multiSelect?: boolean;
118
+ isSelected?: boolean;
119
+ }) => {
120
+ const [authStatus, setAuthStatus] = useRecyclingState(AuthenticityStatus.Unknown, [uri]);
121
+ const [thumbnail, setThumbnail] = useRecyclingState(uri, [uri]);
122
+
123
+ useEffect(() => {
124
+ let active = true;
125
+ const check = async () => {
126
+ const result = await authenticityStatus(uri);
127
+ if (active) {
128
+ setAuthStatus(result);
129
+ }
130
+ };
131
+
132
+ check();
133
+ return () => {
134
+ active = false;
135
+ };
136
+ }, [uri, setAuthStatus]);
137
+
138
+ useEffect(() => {
139
+ const buildThumbnail = async () => {
140
+ const ext = Util.extname(uri)?.toLowerCase();
141
+
142
+ if (ext === "mov" || ext === "mp4") {
143
+ const thumbnail = await createThumbnail({
144
+ url: uri.replace("file://", ""),
145
+ });
146
+ setThumbnail(thumbnail.path);
147
+ }
148
+ };
149
+
150
+ buildThumbnail();
151
+ }, [uri, setThumbnail]);
152
+
153
+ const badge = useMemo(() => {
154
+ return renderBadge ? renderBadge(uri, authStatus) : null;
155
+ }, [renderBadge, uri, authStatus]);
156
+
157
+ const selectionOverlay = useMemo(() => {
158
+ return multiSelect && renderSelectionOverlay
159
+ ? renderSelectionOverlay(uri, isSelected ?? false)
160
+ : null;
161
+ }, [multiSelect, renderSelectionOverlay, uri, isSelected]);
162
+
163
+ return (
164
+ <TouchableOpacity style={styles.imageContainer} onPress={() => onSelect(uri)}>
165
+ <Image style={styles.image} source={{ uri: thumbnail }} />
166
+ {multiSelect && isSelected && (
167
+ <View
168
+ style={{
169
+ position: "absolute",
170
+ top: 0,
171
+ left: 0,
172
+ right: 0,
173
+ bottom: 0,
174
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
175
+ }}
176
+ />
177
+ )}
178
+ {badge}
179
+ {selectionOverlay}
180
+ </TouchableOpacity>
181
+ );
182
+ };
183
+
184
+ /**
185
+ * A component that displays a grid of images from either a private folder or photo gallery.
186
+ * Each image can display an authenticity badge and be selected by the user.
187
+ *
188
+ * @example
189
+ * ```tsx
190
+ * // Load from private folder
191
+ * <ZImagePicker
192
+ * source={{ path: privateDirectory() }}
193
+ * renderBadge={(status) => <Badge status={status} />}
194
+ * onSelect={(uri) => console.log('Selected:', uri)}
195
+ * />
196
+ *
197
+ * // Load from photo gallery album
198
+ * <ZImagePicker
199
+ * source={{ album: 'MyAlbum' }}
200
+ * onSelect={(uri) => console.log('Selected:', uri)}
201
+ * />
202
+ * ```
203
+ */
204
+ export const ZImagePicker = (props: ZImagePickerProps) => {
205
+ const {
206
+ multiSelect,
207
+ selectedUris,
208
+ onSelectionChange,
209
+ onSelect,
210
+ renderBadge,
211
+ renderSelectionOverlay,
212
+ renderFromBottom,
213
+ refreshToken,
214
+ sortOrder,
215
+ source,
216
+ } = props;
217
+ const [photos, setPhotos] = useState<string[]>([]);
218
+
219
+ const sourceKey = useMemo(() => {
220
+ if ("album" in source) return `album:${source.album ?? ""}`;
221
+ else if ("path" in source) return `path:${source.path}`;
222
+ else return "unknown";
223
+ }, [source]);
224
+
225
+ useEffect(() => {
226
+ let cancelled = false;
227
+
228
+ const run = async () => {
229
+ try {
230
+ if ("album" in source) {
231
+ const result = await CameraRoll.getPhotos({
232
+ first: 20,
233
+ groupTypes: "Album",
234
+ groupName: source.album,
235
+ });
236
+
237
+ const sortMultiplier = sortOrder === "newest-first" ? -1 : 1;
238
+ result.edges.sort(
239
+ (a, b) =>
240
+ sortMultiplier * (a.node.modificationTimestamp - b.node.modificationTimestamp),
241
+ );
242
+
243
+ const photoUris = result.edges
244
+ .map((photo) => photo.node.image.uri)
245
+ .filter((path) => path !== null);
246
+
247
+ if (!cancelled) setPhotos(photoUris);
248
+ } else if ("path" in source) {
249
+ const photoFiles = await FileSystem.statDir(source.path);
250
+
251
+ const photosWithTimestamps = photoFiles
252
+ .filter((f) => f.type === "file")
253
+ .filter((f) => !f.filename.startsWith("."))
254
+ .map((f) => {
255
+ const uri = `file://${f.path}`;
256
+ // Parse timestamp from ZCAM filename: "zcam-1768552335459-random.jpg"
257
+ const match = f.filename.match(/^zcam-(\d+)-/);
258
+ const timestamp = match?.[1] ? parseInt(match[1], 10) : f.lastModified;
259
+ return { uri, timestamp };
260
+ });
261
+
262
+ const sortMultiplier = sortOrder === "newest-first" ? -1 : 1;
263
+ photosWithTimestamps.sort((a, b) => sortMultiplier * (a.timestamp - b.timestamp));
264
+
265
+ const photoUris = photosWithTimestamps.map((p) => p.uri);
266
+ if (!cancelled) setPhotos(photoUris);
267
+ }
268
+ } catch (e) {
269
+ console.warn("ZImagePicker: failed to load images", e);
270
+ if (!cancelled) setPhotos([]);
271
+ }
272
+ };
273
+
274
+ run();
275
+
276
+ return () => {
277
+ cancelled = true;
278
+ };
279
+ }, [sourceKey, refreshToken, sortOrder, source]);
280
+
281
+ const handleSelect = useCallback(
282
+ (uri: string) => {
283
+ if (multiSelect) {
284
+ // Multi-select mode: toggle selection.
285
+ const currentSelection = selectedUris ?? [];
286
+ const isSelected = currentSelection.includes(uri);
287
+ const newSelection = isSelected
288
+ ? currentSelection.filter((u) => u !== uri)
289
+ : [...currentSelection, uri];
290
+ onSelectionChange?.(newSelection);
291
+ } else {
292
+ // Single-select mode: call onSelect callback.
293
+ onSelect?.(uri);
294
+ }
295
+ },
296
+ [multiSelect, selectedUris, onSelectionChange, onSelect],
297
+ );
298
+
299
+ const renderItem = useCallback(
300
+ ({ item }: { item: string }) => {
301
+ const isSelected = multiSelect && selectedUris?.includes(item);
302
+ return (
303
+ <ZImageItem
304
+ uri={item}
305
+ onSelect={handleSelect}
306
+ renderBadge={renderBadge}
307
+ renderSelectionOverlay={renderSelectionOverlay}
308
+ multiSelect={multiSelect}
309
+ isSelected={isSelected}
310
+ />
311
+ );
312
+ },
313
+ [handleSelect, renderBadge, renderSelectionOverlay, multiSelect, selectedUris],
314
+ );
315
+
316
+ return (
317
+ <FlashList
318
+ data={photos}
319
+ contentContainerStyle={{ flexGrow: 1 }}
320
+ renderItem={renderItem}
321
+ numColumns={3}
322
+ keyExtractor={(uri) => uri}
323
+ maintainVisibleContentPosition={{
324
+ startRenderingFromBottom: renderFromBottom ?? false,
325
+ }}
326
+ />
327
+ );
328
+ };
329
+
330
+ const { width } = Dimensions.get("window");
331
+ const IMAGE_SIZE = width / 3;
332
+
333
+ const styles = StyleSheet.create({
334
+ imageContainer: {
335
+ width: IMAGE_SIZE,
336
+ height: IMAGE_SIZE,
337
+ padding: 2,
338
+ },
339
+ image: {
340
+ flex: 1,
341
+ },
342
+ });
@@ -0,0 +1,10 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+ import type { TurboModule } from "react-native";
3
+ import { TurboModuleRegistry } from "react-native";
4
+
5
+ export interface Spec extends TurboModule {
6
+ installRustCrate(): boolean;
7
+ cleanupRustCrate(): boolean;
8
+ }
9
+
10
+ export default TurboModuleRegistry.get<Spec>("Zcam1Proving");
@@ -0,0 +1,50 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+ import installer from "./NativeZcam1Proving";
3
+
4
+ if (installer === null) {
5
+ throw new Error(
6
+ "Failed to load the ZCAM1 proving feature.\n" +
7
+ "If you use Expo, you need to add a plugin for `@succinctlabs/react-native-zcam1`" +
8
+ "in you app.json with { 'enableProving': true }\n" +
9
+ "If you use bare React Native, set the `ZCAM1_ENABLE_PROVING` env var to `1` \n" +
10
+ "Finally you'll have to run `npx expo prebuild && cd ios && pod install`",
11
+ );
12
+ }
13
+
14
+ // Register the rust crate with Hermes
15
+ // - the boolean flag ensures this loads exactly once, even if the JS
16
+ // code is reloaded (e.g. during development with metro).
17
+ let rustInstalled = false;
18
+ if (!rustInstalled) {
19
+ installer.installRustCrate();
20
+ rustInstalled = true;
21
+ }
22
+
23
+ // Export the generated bindings to the app.
24
+ export * from "./../generated/zcam1_proving_utils";
25
+
26
+ // Now import the bindings so we can:
27
+ // - intialize them
28
+ // - export them as namespaced objects as the default export.
29
+ import * as zcam1_proving_utils from "./../generated/zcam1_proving_utils";
30
+
31
+ // Initialize the generated bindings: mostly checksums, but also callbacks.
32
+ // - the boolean flag ensures this loads exactly once, even if the JS code
33
+ // is reloaded (e.g. during development with metro).
34
+ let initialized = false;
35
+ if (!initialized) {
36
+ zcam1_proving_utils.default.initialize();
37
+ initialized = true;
38
+ }
39
+
40
+ // This provides parity with the index.web.ts version of this file.
41
+ // The web version relies on an asynchronous fetch, which this doesn't
42
+ // need, so we just no-op.
43
+ export async function uniffiInitAsync() {
44
+ // NOOP.
45
+ }
46
+
47
+ // Export the crates as individually namespaced objects.
48
+ export default {
49
+ zcam1_proving_utils,
50
+ };
@@ -0,0 +1,8 @@
1
+ export { FulfillmentStatus, IosProvingClient } from "./bindings";
2
+ export {
3
+ ProverNetworkMode,
4
+ ProverProvider,
5
+ ProvingClient,
6
+ useProofRequestStatus,
7
+ useProver,
8
+ } from "./prove";