diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8721b27aaf9d670b4b38ef339dec7015b55316de..9e87f241d5ee8ea1c5511bdca11093bb0e0ce5c4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,18 +1,26 @@
 stages:
   - test
 
-package-tests:
+test-package-macos:
   stage: test
   tags: 
     - ios
   script:
-    - ./run-tests.sh
+    - ./run-tests.sh macos
   retry: 1
 
-examples-tests:
+test-package-ios:
   stage: test
   tags: 
     - ios
   script:
-    - ./run-tests.sh examples
+    - ./run-tests.sh ios
+  retry: 1
+
+test-examples-ios:
+  stage: test
+  tags: 
+    - ios
+  script:
+    - ./run-tests.sh examples-ios
   retry: 1
diff --git a/Frameworks/Bindings.txt b/Frameworks/Bindings.txt
index a92bf6ab8e8d78359ec5e0545e6210bd808a8150..702c949d1dd03ac8030c0ef9c5a36af0c325f134 100644
--- a/Frameworks/Bindings.txt
+++ b/Frameworks/Bindings.txt
@@ -1,4 +1,4 @@
 https://git.xx.network/elixxir/client/-/commit/9a44f79889f967704d60a43f1c24a945028afb06
 go version go1.17.13 darwin/arm64
 Xcode 13.4.1 Build version 13F100
-gomobile bind target: ios
+gomobile bind target: ios,iossimulator,macos
diff --git a/Frameworks/Bindings.xcframework/Info.plist b/Frameworks/Bindings.xcframework/Info.plist
index 3c96df61083ca794226526858401b4539235d6ba..3d81013ba0ba606da4b42b6f3119f688c6d9b97d 100644
--- a/Frameworks/Bindings.xcframework/Info.plist
+++ b/Frameworks/Bindings.xcframework/Info.plist
@@ -19,6 +19,19 @@
 			<key>SupportedPlatformVariant</key>
 			<string>simulator</string>
 		</dict>
+		<dict>
+			<key>LibraryIdentifier</key>
+			<string>macos-arm64_x86_64</string>
+			<key>LibraryPath</key>
+			<string>Bindings.framework</string>
+			<key>SupportedArchitectures</key>
+			<array>
+				<string>arm64</string>
+				<string>x86_64</string>
+			</array>
+			<key>SupportedPlatform</key>
+			<string>macos</string>
+		</dict>
 		<dict>
 			<key>LibraryIdentifier</key>
 			<string>ios-arm64</string>
diff --git a/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings b/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings
index 97e97af7174ec20d4d520130bf17d49444638fef..0ce0097a9af5e6db2577a9264a6ca65277b87a5f 100644
Binary files a/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings and b/Frameworks/Bindings.xcframework/ios-arm64/Bindings.framework/Versions/A/Bindings differ
diff --git a/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings b/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings
index 431f58beebd36b7f255ed716ac72175c60b0fd30..c302dc6cf19adf806e3a638565957629c1798bba 100644
Binary files a/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings and b/Frameworks/Bindings.xcframework/ios-arm64_x86_64-simulator/Bindings.framework/Versions/A/Bindings differ
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Bindings b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Bindings
new file mode 120000
index 0000000000000000000000000000000000000000..55113b7838ed2ec628fd342ab36137a85788d9a7
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Bindings
@@ -0,0 +1 @@
+Versions/Current/Bindings
\ No newline at end of file
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Headers b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Headers
new file mode 120000
index 0000000000000000000000000000000000000000..a177d2a6b92600696030834c319f5e1434f9ee6a
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Headers
@@ -0,0 +1 @@
+Versions/Current/Headers
\ No newline at end of file
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Modules b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Modules
new file mode 120000
index 0000000000000000000000000000000000000000..5736f3186e797b8b787748c9979d0fed3b0536c3
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Modules
@@ -0,0 +1 @@
+Versions/Current/Modules
\ No newline at end of file
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Resources b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Resources
new file mode 120000
index 0000000000000000000000000000000000000000..953ee36f3bb709faf58a351e0b33c353e337c0a2
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Resources
@@ -0,0 +1 @@
+Versions/Current/Resources
\ No newline at end of file
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings
new file mode 100644
index 0000000000000000000000000000000000000000..ad4d0f109edc52b1309a375c2bfea9a9b61764ec
Binary files /dev/null and b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Bindings differ
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.h b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.h
new file mode 100644
index 0000000000000000000000000000000000000000..8906a7da239705b790cb2bb64de92f806640cb38
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.h
@@ -0,0 +1,13 @@
+
+// Objective-C API for talking to the following Go packages
+//
+//	gitlab.com/elixxir/client/bindings
+//
+// File is generated by gomobile bind. Do not edit.
+#ifndef __Bindings_FRAMEWORK_H__
+#define __Bindings_FRAMEWORK_H__
+
+#include "Bindings.objc.h"
+#include "Universe.objc.h"
+
+#endif
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
new file mode 100644
index 0000000000000000000000000000000000000000..40a89ee2ee4afde62d99dcdcac9ef77d09c7c663
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Bindings.objc.h
@@ -0,0 +1,2636 @@
+// Objective-C API for talking to gitlab.com/elixxir/client/bindings Go package.
+//   gobind -lang=objc gitlab.com/elixxir/client/bindings
+//
+// File is generated by gobind. Do not edit.
+
+#ifndef __Bindings_H__
+#define __Bindings_H__
+
+@import Foundation;
+#include "ref.h"
+#include "Universe.objc.h"
+
+
+@class BindingsAuthenticatedConnection;
+@class BindingsBackup;
+@class BindingsBackupReport;
+@class BindingsBroadcastMessage;
+@class BindingsBroadcastReport;
+@class BindingsChannel;
+@class BindingsChannelDef;
+@class BindingsCmix;
+@class BindingsConnection;
+@class BindingsDummyTraffic;
+@class BindingsE2ESendReport;
+@class BindingsE2e;
+@class BindingsEventReport;
+@class BindingsFilePartTracker;
+@class BindingsFileSend;
+@class BindingsFileTransfer;
+@class BindingsGroup;
+@class BindingsGroupChat;
+@class BindingsGroupReport;
+@class BindingsGroupSendReport;
+@class BindingsMessage;
+@class BindingsNodeRegistrationReport;
+@class BindingsProgress;
+@class BindingsReceivedFile;
+@class BindingsReceptionIdentity;
+@class BindingsRestlikeMessage;
+@class BindingsRoundsList;
+@class BindingsSingleUseCallbackReport;
+@class BindingsSingleUseResponseReport;
+@class BindingsSingleUseSendReport;
+@class BindingsUserDiscovery;
+@protocol BindingsAuthCallbacks;
+@class BindingsAuthCallbacks;
+@protocol BindingsBroadcastListener;
+@class BindingsBroadcastListener;
+@protocol BindingsClientError;
+@class BindingsClientError;
+@protocol BindingsFileTransferReceiveProgressCallback;
+@class BindingsFileTransferReceiveProgressCallback;
+@protocol BindingsFileTransferSentProgressCallback;
+@class BindingsFileTransferSentProgressCallback;
+@protocol BindingsGroupChatProcessor;
+@class BindingsGroupChatProcessor;
+@protocol BindingsGroupRequest;
+@class BindingsGroupRequest;
+@protocol BindingsListener;
+@class BindingsListener;
+@protocol BindingsLogWriter;
+@class BindingsLogWriter;
+@protocol BindingsMessageDeliveryCallback;
+@class BindingsMessageDeliveryCallback;
+@protocol BindingsNetworkHealthCallback;
+@class BindingsNetworkHealthCallback;
+@protocol BindingsProcessor;
+@class BindingsProcessor;
+@protocol BindingsReceiveFileCallback;
+@class BindingsReceiveFileCallback;
+@protocol BindingsReporterFunc;
+@class BindingsReporterFunc;
+@protocol BindingsRestlikeCallback;
+@class BindingsRestlikeCallback;
+@protocol BindingsSingleUseCallback;
+@class BindingsSingleUseCallback;
+@protocol BindingsSingleUseResponse;
+@class BindingsSingleUseResponse;
+@protocol BindingsStopper;
+@class BindingsStopper;
+@protocol BindingsUdLookupCallback;
+@class BindingsUdLookupCallback;
+@protocol BindingsUdNetworkStatus;
+@class BindingsUdNetworkStatus;
+@protocol BindingsUdSearchCallback;
+@class BindingsUdSearchCallback;
+@protocol BindingsUpdateBackupFunc;
+@class BindingsUpdateBackupFunc;
+
+@protocol BindingsAuthCallbacks <NSObject>
+- (void)confirm:(NSData* _Nullable)contact receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+- (void)request:(NSData* _Nullable)contact receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+- (void)reset:(NSData* _Nullable)contact receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+@end
+
+@protocol BindingsBroadcastListener <NSObject>
+- (void)callback:(NSData* _Nullable)p0 p1:(NSError* _Nullable)p1;
+@end
+
+@protocol BindingsClientError <NSObject>
+- (void)report:(NSString* _Nullable)source message:(NSString* _Nullable)message trace:(NSString* _Nullable)trace;
+@end
+
+@protocol BindingsFileTransferReceiveProgressCallback <NSObject>
+/**
+ * Callback is called when a file part is sent or an error occurs.
+
+Parameters:
+ - payload - the JSON marshalled bytes of a Progress object.
+ - t - tracker that allows the lookup of the status of any file part
+ - err - any errors that occurred during sending
+ */
+- (void)callback:(NSData* _Nullable)payload t:(BindingsFilePartTracker* _Nullable)t err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsFileTransferSentProgressCallback <NSObject>
+/**
+ * Callback is called when a file part is sent or an error occurs.
+
+Parameters:
+ - payload - the JSON marshalled bytes of a Progress object.
+ - t - tracker that allows the lookup of the status of any file part
+ - err - any errors that occurred during sending
+ */
+- (void)callback:(NSData* _Nullable)payload t:(BindingsFilePartTracker* _Nullable)t err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsGroupChatProcessor <NSObject>
+- (void)process:(NSData* _Nullable)decryptedMessage msg:(NSData* _Nullable)msg receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId err:(NSError* _Nullable)err;
+- (NSString* _Nonnull)string;
+@end
+
+@protocol BindingsGroupRequest <NSObject>
+- (void)callback:(BindingsGroup* _Nullable)g;
+@end
+
+@protocol BindingsListener <NSObject>
+/**
+ * Hear is called to receive a message in the UI.
+
+Parameters:
+ - item - JSON marshalled Message object
+ */
+- (void)hear:(NSData* _Nullable)item;
+/**
+ * Name returns a name; used for debugging.
+ */
+- (NSString* _Nonnull)name;
+@end
+
+@protocol BindingsLogWriter <NSObject>
+- (void)log:(NSString* _Nullable)p0;
+@end
+
+@protocol BindingsMessageDeliveryCallback <NSObject>
+- (void)eventCallback:(BOOL)delivered timedOut:(BOOL)timedOut roundResults:(NSData* _Nullable)roundResults;
+@end
+
+@protocol BindingsNetworkHealthCallback <NSObject>
+- (void)callback:(BOOL)p0;
+@end
+
+@protocol BindingsProcessor <NSObject>
+- (void)process:(NSData* _Nullable)message receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+- (NSString* _Nonnull)string;
+@end
+
+@protocol BindingsReceiveFileCallback <NSObject>
+/**
+ * Callback is called when a new file transfer is received.
+
+Parameters:
+ - payload - the JSON marshalled bytes of a ReceivedFile object.
+ - err - any errors that occurred during reception
+ */
+- (void)callback:(NSData* _Nullable)payload err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsReporterFunc <NSObject>
+- (void)report:(NSData* _Nullable)payload err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsRestlikeCallback <NSObject>
+- (void)callback:(NSData* _Nullable)p0 p1:(NSError* _Nullable)p1;
+@end
+
+@protocol BindingsSingleUseCallback <NSObject>
+- (void)callback:(NSData* _Nullable)callbackReport err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsSingleUseResponse <NSObject>
+- (void)callback:(NSData* _Nullable)responseReport err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsStopper <NSObject>
+- (void)stop;
+@end
+
+@protocol BindingsUdLookupCallback <NSObject>
+- (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsUdNetworkStatus <NSObject>
+/**
+ * UdNetworkStatus returns:
+- int - a xxdk.Status int
+ */
+- (long)udNetworkStatus;
+@end
+
+@protocol BindingsUdSearchCallback <NSObject>
+- (void)callback:(NSData* _Nullable)contactListJSON err:(NSError* _Nullable)err;
+@end
+
+@protocol BindingsUpdateBackupFunc <NSObject>
+- (void)updateBackup:(NSData* _Nullable)encryptedBackup;
+@end
+
+@interface BindingsAuthenticatedConnection : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field AuthenticatedConnection.Connection with unsupported type: gitlab.com/elixxir/client/bindings.Connection
+
+- (BOOL)close:(NSError* _Nullable* _Nullable)error;
+- (long)getId;
+- (NSData* _Nullable)getPartner;
+- (BOOL)isAuthenticated;
+- (BOOL)registerListener:(long)messageType newListener:(id<BindingsListener> _Nullable)newListener error:(NSError* _Nullable* _Nullable)error;
+- (NSData* _Nullable)sendE2E:(long)mt payload:(NSData* _Nullable)payload error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * Backup is a bindings-level struct encapsulating the backup.Backup
+client object.
+ */
+@interface BindingsBackup : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * AddJson stores the argument within the Backup structure.
+
+Params
+ - json - JSON string
+ */
+- (void)addJson:(NSString* _Nullable)json;
+/**
+ * IsBackupRunning returns true if the backup has been initialized and is
+running. Returns false if it has been stopped.
+ */
+- (BOOL)isBackupRunning;
+/**
+ * StopBackup stops the backup processes and deletes the user's password from
+storage. To enable backups again, call InitializeBackup.
+ */
+- (BOOL)stopBackup:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * BackupReport is the bindings' representation of the return values of
+NewCmixFromBackup.
+
+Example BackupReport:
+ {
+   "RestoredContacts": [
+     "U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVID",
+     "15tNdkKbYXoMn58NO6VbDMDWFEyIhTWEGsvgcJsHWAgD"
+   ],
+   "Params": ""
+ }
+ */
+@interface BindingsBackupReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field BackupReport.RestoredContacts with unsupported type: []*gitlab.com/xx_network/primitives/id.ID
+
+/**
+ * The backup parameters found within the backup file
+ */
+@property (nonatomic) NSString* _Nonnull params;
+@end
+
+/**
+ * BroadcastMessage is the bindings representation of a broadcast message.
+
+Example JSON:
+ {"RoundID":42,
+  "EphID":[0,0,0,0,0,0,24,61],
+  "Payload":"SGVsbG8sIGJyb2FkY2FzdCBmcmllbmRzIQ=="
+ }
+ */
+@interface BindingsBroadcastMessage : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field BroadcastMessage.BroadcastReport with unsupported type: gitlab.com/elixxir/client/bindings.BroadcastReport
+
+@property (nonatomic) NSData* _Nullable payload;
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * BroadcastReport is the bindings representation of the info on how a broadcast
+message was sent
+
+Example JSON:
+ {"RoundID":42,
+  "EphID":[0,0,0,0,0,0,24,61]
+ }
+ */
+@interface BindingsBroadcastReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field BroadcastReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+// skipped field BroadcastReport.EphID with unsupported type: gitlab.com/xx_network/primitives/id/ephemeral.Id
+
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * Channel is a bindings-level struct encapsulating the broadcast.Channel client
+object.
+ */
+@interface BindingsChannel : NSObject <goSeqRefInterface, BindingsStopper> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * Broadcast sends a given payload over the broadcast channel using symmetric
+broadcast.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the BroadcastReport object, which
+   can be passed into Cmix.WaitForRoundResult to see if the broadcast
+   succeeded.
+ */
+- (NSData* _Nullable)broadcast:(NSData* _Nullable)payload error:(NSError* _Nullable* _Nullable)error;
+/**
+ * BroadcastAsymmetric sends a given payload over the broadcast channel using
+asymmetric broadcast. This mode of encryption requires a private key.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the BroadcastReport object, which
+   can be passed into WaitForRoundResult to see if the broadcast succeeded.
+ */
+- (NSData* _Nullable)broadcastAsymmetric:(NSData* _Nullable)payload pk:(NSData* _Nullable)pk error:(NSError* _Nullable* _Nullable)error;
+/**
+ * Get returns the result of calling json.Marshal on a ChannelDef based on the
+underlying crypto broadcast.Channel.
+ */
+- (NSData* _Nullable)get:(NSError* _Nullable* _Nullable)error;
+/**
+ * Listen registers a BroadcastListener for a given method. This allows users to
+handle incoming broadcast messages.
+
+Parameters:
+ - l - BroadcastListener object
+ - method - int corresponding to broadcast.Method constant, 0 for symmetric
+   or 1 for asymmetric
+ */
+- (BOOL)listen:(id<BindingsBroadcastListener> _Nullable)l method:(long)method error:(NSError* _Nullable* _Nullable)error;
+/**
+ * MaxAsymmetricPayloadSize returns the maximum possible payload size which can
+be broadcast.
+ */
+- (long)maxAsymmetricPayloadSize;
+/**
+ * MaxPayloadSize returns the maximum possible payload size which can be
+broadcast.
+ */
+- (long)maxPayloadSize;
+/**
+ * Stop stops the channel from listening for more messages.
+ */
+- (void)stop;
+@end
+
+/**
+ * ChannelDef is the bindings representation of an elixxir/crypto
+broadcast.Channel object.
+
+Example JSON:
+ {
+   "Name": "My broadcast channel",
+   "Description": "A broadcast channel for me to test things",
+   "Salt": "gpUqW7N22sffMXsvPLE7BA==",
+   "PubKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1DZ0NJUUN2YkZVckJKRFpqT3Y0Y0MvUHZZdXNvQkFtUTFkb3Znb044aHRuUjA2T3F3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0="
+ }
+ */
+@interface BindingsChannelDef : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSString* _Nonnull name;
+@property (nonatomic) NSString* _Nonnull description;
+@property (nonatomic) NSData* _Nullable salt;
+@property (nonatomic) NSData* _Nullable pubKey;
+@end
+
+/**
+ * Cmix wraps the xxdk.Cmix struct, implementing additional functions to support
+the bindings Cmix interface.
+ */
+@interface BindingsCmix : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * AddHealthCallback adds a callback that gets called whenever the network
+health changes. Returns a registration ID that can be used to unregister.
+ */
+- (int64_t)addHealthCallback:(id<BindingsNetworkHealthCallback> _Nullable)nhc;
+/**
+ * Connect performs auth key negotiation with the given recipient and returns a
+Connection object for the newly created partner.Manager.
+
+This function is to be used sender-side and will block until the
+partner.Manager is confirmed.
+
+Parameters:
+ - e2eId - ID of the E2E object in the e2e tracker
+ - recipientContact - marshalled contact.Contact object
+ - e2eParamsJSON - JSON marshalled byte of xxdk.E2EParams object
+ */
+- (BindingsConnection* _Nullable)connect:(long)e2eId recipientContact:(NSData* _Nullable)recipientContact e2eParamsJSON:(NSData* _Nullable)e2eParamsJSON error:(NSError* _Nullable* _Nullable)error;
+- (BindingsAuthenticatedConnection* _Nullable)connectWithAuthentication:(long)e2eId recipientContact:(NSData* _Nullable)recipientContact e2eParamsJSON:(NSData* _Nullable)e2eParamsJSON error:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetID returns the ID for this Cmix in the cmixTracker.
+ */
+- (long)getID;
+/**
+ * GetNodeRegistrationStatus returns the current state of node registration.
+
+Returns:
+ - []byte - A marshalled NodeRegistrationReport containing the number of
+   nodes the user is registered with and the number of nodes present in the
+   NDF.
+ - An error if it cannot get the node registration status. The most likely
+   cause is that the network is unhealthy.
+ */
+- (NSData* _Nullable)getNodeRegistrationStatus:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetReceptionRegistrationValidationSignature returns the signature provided by
+the xx network.
+ */
+- (NSData* _Nullable)getReceptionRegistrationValidationSignature;
+/**
+ * HasRunningProcessies checks if any background threads are running and returns
+true if one or more are.
+
+This is meant to be used when NetworkFollowerStatus returns xxdk.Stopping.
+Due to the handling of comms on iOS, where the OS can block indefinitely, it
+may not enter the stopped state appropriately. This can be used instead.
+ */
+- (BOOL)hasRunningProcessies;
+/**
+ * IsHealthy returns true if the network is read to be in a healthy state where
+messages can be sent.
+ */
+- (BOOL)isHealthy;
+/**
+ * MakeLegacyReceptionIdentity generates the legacy identity for receiving
+messages. As with all legacy calls, this should primarily be used
+for the xx messenger team.
+ */
+- (NSData* _Nullable)makeLegacyReceptionIdentity:(NSError* _Nullable* _Nullable)error;
+/**
+ * MakeReceptionIdentity generates a new cryptographic identity for receiving
+messages.
+ */
+- (NSData* _Nullable)makeReceptionIdentity:(NSError* _Nullable* _Nullable)error;
+/**
+ * NetworkFollowerStatus gets the state of the network follower. It returns a
+status with the following values:
+ Stopped  - 0
+ Running  - 2000
+ Stopping - 3000
+ */
+- (long)networkFollowerStatus;
+/**
+ * RegisterClientErrorCallback registers the callback to handle errors from the
+long-running threads controlled by StartNetworkFollower and
+StopNetworkFollower.
+ */
+- (void)registerClientErrorCallback:(id<BindingsClientError> _Nullable)clientError;
+/**
+ * RemoveHealthCallback removes a health callback using its registration ID.
+ */
+- (void)removeHealthCallback:(int64_t)funcID;
+/**
+ * StartNetworkFollower kicks off the tracking of the network. It starts long-
+running network threads and returns an object for checking state and
+stopping those threads.
+
+Call this when returning from sleep and close when going back to sleep.
+
+These threads may become a significant drain on battery when offline, ensure
+they are stopped if there is no internet access.
+
+Threads Started:
+  - Network Follower (/network/follow.go)
+    tracks the network events and hands them off to workers for handling.
+  - Historical Round Retrieval (/network/rounds/historical.go)
+    retrieves data about rounds that are too old to be stored by the client.
+	 - Message Retrieval Worker Group (/network/rounds/retrieve.go)
+	   requests all messages in a given round from the gateway of the last
+	   nodes.
+	 - Message Handling Worker Group (/network/message/handle.go)
+	   decrypts and partitions messages when signals via the Switchboard.
+	 - Health Tracker (/network/health),
+	   via the network instance, tracks the state of the network.
+	 - Garbled Messages (/network/message/garbled.go)
+	   can be signaled to check all recent messages that could be decoded. It
+	   uses a message store on disk for persistence.
+	 - Critical Messages (/network/message/critical.go)
+	   ensures all protocol layer mandatory messages are sent. It uses a message
+	   store on disk for persistence.
+	 - KeyExchange Trigger (/keyExchange/trigger.go)
+	   responds to sent rekeys and executes them.
+  - KeyExchange Confirm (/keyExchange/confirm.go)
+	   responds to confirmations of successful rekey operations.
+  - Auth Callback (/auth/callback.go)
+    handles both auth confirm and requests.
+ */
+- (BOOL)startNetworkFollower:(long)timeoutMS error:(NSError* _Nullable* _Nullable)error;
+/**
+ * StopNetworkFollower stops the network follower if it is running. It returns
+an error if the follower is in the wrong state to stop or if it fails to stop
+it.
+
+If the network follower is running and this fails, the Cmix object will
+most likely be in an unrecoverable state and need to be trashed.
+ */
+- (BOOL)stopNetworkFollower:(NSError* _Nullable* _Nullable)error;
+/**
+ * WaitForNetwork will block until either the network is healthy or the passed
+timeout is reached. It will return true if the network is healthy.
+ */
+- (BOOL)waitForNetwork:(long)timeoutMS;
+/**
+ * WaitForRoundResult allows the caller to get notified if the rounds a message
+was sent in successfully completed. Under the hood, this uses an API that
+uses the internal round data, network historical round lookup, and waiting on
+network events to determine what has (or will) occur.
+
+This function takes the marshaled send report to ensure a memory leak does
+not occur as a result of both sides of the bindings holding a reference to
+the same pointer.
+
+Parameters:
+ - roundList - JSON marshalled bytes of RoundsList or JSON of any send report
+   that inherits a [bindings.RoundsList] object
+ - mdc - callback that adheres to the MessageDeliveryCallback interface
+ - timeoutMS - timeout when the callback will return if no state update
+   occurs, in milliseconds
+ */
+- (BOOL)waitForRoundResult:(NSData* _Nullable)roundList mdc:(id<BindingsMessageDeliveryCallback> _Nullable)mdc timeoutMS:(long)timeoutMS error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * Connection is the bindings' representation of a connect.Connection object
+that can be tracked by ID.
+ */
+@interface BindingsConnection : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * Close deletes this Connection's partner.Manager and releases resources.
+ */
+- (BOOL)close:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetId returns the Connection ID.
+ */
+- (long)getId;
+/**
+ * GetPartner returns the partner.Manager for this Connection.
+ */
+- (NSData* _Nullable)getPartner;
+/**
+ * RegisterListener is used for E2E reception and allows for reading data sent
+from the partner.Manager.
+ */
+- (BOOL)registerListener:(long)messageType newListener:(id<BindingsListener> _Nullable)newListener error:(NSError* _Nullable* _Nullable)error;
+/**
+ * SendE2E is a wrapper for sending specifically to the Connection's
+partner.Manager.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the E2ESendReport object, which can
+   be passed into Cmix.WaitForRoundResult to see if the send succeeded.
+ */
+- (NSData* _Nullable)sendE2E:(long)mt payload:(NSData* _Nullable)payload error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * DummyTraffic is the bindings-layer dummy (or "cover") traffic manager. T
+The manager can be used to set and get the status of the thread responsible for
+sending dummy messages.
+ */
+@interface BindingsDummyTraffic : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * NewDummyTrafficManager creates a DummyTraffic manager and initialises the
+dummy traffic sending thread. Note that the manager does not start sending
+dummy traffic until true is passed into DummyTraffic.SetStatus. The time
+duration between each sending operation and the amount of messages sent each
+interval are randomly generated values with bounds defined by the given
+parameters below.
+
+Parameters:
+ - cmixId - a Cmix object ID in the tracker.
+ - maxNumMessages - the upper bound of the random number of messages sent
+   each sending cycle.
+ - avgSendDeltaMS - the average duration, in milliseconds, to wait between
+   sends.
+ - randomRangeMS - the upper bound of the interval between sending cycles, in
+   milliseconds. Sends occur every avgSendDeltaMS +/- a random duration with
+   an upper bound of randomRangeMS.
+ */
+- (nullable instancetype)initManager:(long)cmixId maxNumMessages:(long)maxNumMessages avgSendDeltaMS:(long)avgSendDeltaMS randomRangeMS:(long)randomRangeMS;
+/**
+ * GetStatus returns the current state of the DummyTraffic manager's sending
+thread. Note that this function does not return the status set by the most
+recent call to SetStatus. Instead, this call returns the current status of
+the sending thread. This is due to the small delay that may occur between
+calling SetStatus and the sending thread taking into effect that status
+change.
+
+Returns:
+  - bool - Returns true if sending thread is sending dummy messages and false
+    if sending thread is paused/stopped and is not sending dummy messages.
+ */
+- (BOOL)getStatus;
+/**
+ * SetStatus sets the state of the DummyTraffic manager's send thread by passing
+in a boolean parameter. There may be a small delay in between this call and
+the status of the sending thread to change accordingly. For example, passing
+false into this call while the sending thread is currently sending messages
+will not cancel nor halt the sending operation, but will pause the thread
+once that operation has completed.
+
+Parameters:
+ - status - Input should be true if you want to send dummy messages and false
+   if you want to pause dummy messages.
+
+Returns:
+ - error - if the DummyTraffic.SetStatus is called too frequently, causing
+   the internal status channel to fill.
+ */
+- (BOOL)setStatus:(BOOL)status error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * E2ESendReport is the bindings' representation of the return values of
+SendE2E.
+
+Example E2ESendReport:
+{
+"Rounds": [ 1, 4, 9],
+"MessageID": "iM34yCIr4Je8ZIzL9iAAG1UWAeDiHybxMTioMAaezvs=",
+"Timestamp": 1661532254302612000,
+"KeyResidue": "9q2/A69EAuFM1hFAT7Bzy5uGOQ4T6bPFF72h5PlgCWE="
+}
+ */
+@interface BindingsE2ESendReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field E2ESendReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+@property (nonatomic) NSData* _Nullable messageID;
+@property (nonatomic) int64_t timestamp;
+@property (nonatomic) NSData* _Nullable keyResidue;
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * E2e wraps the xxdk.E2e, implementing additional functions to support the
+bindings E2e interface.
+ */
+@interface BindingsE2e : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * AddPartnerCallback adds a new callback that overrides the generic auth
+callback for the given partner ID.
+
+Parameters:
+ - partnerID - the marshalled bytes of the id.ID object.
+ */
+- (BOOL)addPartnerCallback:(NSData* _Nullable)partnerID cb:(id<BindingsAuthCallbacks> _Nullable)cb error:(NSError* _Nullable* _Nullable)error;
+/**
+ * AddService adds a service for all partners of the given tag, which will call
+back on the given processor. These can be sent to using the tag fields in the
+Params object.
+
+Passing nil for the processor allows you to create a service that is never
+called but will be visible by notifications. Processes added this way are
+generally not end-to-end encrypted messages themselves, but other protocols
+that piggyback on e2e relationships to start communication.
+ */
+- (BOOL)addService:(NSString* _Nullable)tag processor:(id<BindingsProcessor> _Nullable)processor error:(NSError* _Nullable* _Nullable)error;
+/**
+ * CallAllReceivedRequests will iterate through all pending contact requests and
+replay them on the callbacks.
+ */
+- (void)callAllReceivedRequests;
+/**
+ * Confirm sends a confirmation for a received request. It can only be called
+once. This both sends keying material to the other party and creates a
+channel in the e2e handler, after which e2e messages can be sent to the
+partner using E2e.SendE2E.
+
+The round the request is initially sent on will be returned, but the request
+will be listed as a critical message, so the underlying cMix client will auto
+resend it in the event of failure.
+
+A confirmation cannot be sent for a contact who has not sent a request or who
+is already a partner. This can only be called once for a specific contact.
+The confirmation sends as a critical message; if the round it sends on fails,
+it will be auto resent by the cMix client.
+
+If the confirmation must be resent, use ReplayConfirm.
+
+Parameters:
+ - partnerContact - the marshalled bytes of the contact.Contact object.
+
+Returns:
+ - int64 - ID of the round (convert to uint64)
+ */
+- (BOOL)confirm:(NSData* _Nullable)partnerContact ret0_:(int64_t* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error;
+/**
+ * DeleteAllRequests clears all requests from auth storage.
+ */
+- (BOOL)deleteAllRequests:(NSError* _Nullable* _Nullable)error;
+/**
+ * DeletePartnerCallback deletes the callback that overrides the generic
+auth callback for the given partner ID.
+
+Parameters:
+ - partnerID - the marshalled bytes of the id.ID object.
+ */
+- (BOOL)deletePartnerCallback:(NSData* _Nullable)partnerID error:(NSError* _Nullable* _Nullable)error;
+/**
+ * DeleteReceiveRequests clears all received requests from auth storage.
+ */
+- (BOOL)deleteReceiveRequests:(NSError* _Nullable* _Nullable)error;
+/**
+ * DeleteRequest deletes sent or received requests for a specific partner ID.
+
+Parameters:
+ - partnerID - the marshalled bytes of the id.ID object.
+ */
+- (BOOL)deleteRequest:(NSData* _Nullable)partnerID error:(NSError* _Nullable* _Nullable)error;
+/**
+ * DeleteSentRequests clears all sent requests from auth storage.
+ */
+- (BOOL)deleteSentRequests:(NSError* _Nullable* _Nullable)error;
+/**
+ * FirstPartitionSize returns the max partition payload size for the first
+payload.
+ */
+- (long)firstPartitionSize;
+/**
+ * GetAllPartnerIDs returns a list of all partner IDs that the user has an E2E
+relationship with.
+
+Returns:
+ - []byte - the marshalled bytes of []*id.ID.
+ */
+- (NSData* _Nullable)getAllPartnerIDs:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetContact returns a marshalled contact.Contact object for the E2e
+ReceptionIdentity.
+ */
+- (NSData* _Nullable)getContact;
+/**
+ * GetHistoricalDHPrivkey returns the user's marshalled historical DH private
+key.
+
+Returns:
+ - []byte - the marshalled bytes of the cyclic.Int object.
+ */
+- (NSData* _Nullable)getHistoricalDHPrivkey:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetHistoricalDHPubkey returns the user's marshalled historical DH public key.
+
+Returns:
+ - []byte - the marshalled bytes of the cyclic.Int object.
+ */
+- (NSData* _Nullable)getHistoricalDHPubkey:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetID returns the ID for this E2e in the e2eTracker.
+ */
+- (long)getID;
+/**
+ * GetReceivedRequest returns a contact if there is a received request for it.
+
+Parameters:
+ - partnerID - the marshalled bytes of the id.ID object.
+
+Returns:
+ - []byte - the marshalled bytes of the contact.Contact object.
+ */
+- (NSData* _Nullable)getReceivedRequest:(NSData* _Nullable)partnerID error:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetReceptionID returns the marshalled default IDs.
+
+Returns:
+ - []byte - the marshalled bytes of the id.ID object.
+ */
+- (NSData* _Nullable)getReceptionID;
+/**
+ * GetUdAddressFromNdf retrieve the User Discovery's network address fom the
+NDF.
+ */
+- (NSString* _Nonnull)getUdAddressFromNdf;
+/**
+ * GetUdCertFromNdf retrieves the User Discovery's TLS certificate (in PEM
+format) from the NDF.
+ */
+- (NSData* _Nullable)getUdCertFromNdf;
+/**
+ * GetUdContactFromNdf assembles the User Discovery's contact file from the data
+within the NDF.
+
+Returns
+ - []byte - A byte marshalled contact.Contact.
+ */
+- (NSData* _Nullable)getUdContactFromNdf:(NSError* _Nullable* _Nullable)error;
+/**
+ * HasAuthenticatedChannel returns true if an authenticated channel with the
+partner exists, otherwise returns false.
+
+Parameters:
+ - partnerId - the marshalled bytes of the id.ID object.
+ */
+- (BOOL)hasAuthenticatedChannel:(NSData* _Nullable)partnerId ret0_:(BOOL* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error;
+/**
+ * PartitionSize returns the partition payload size for the given payload index.
+The first payload is index 0.
+ */
+- (long)partitionSize:(long)payloadIndex;
+/**
+ * PayloadSize returns the max payload size for a partitionable E2E message.
+ */
+- (long)payloadSize;
+/**
+ * RegisterListener registers a new listener.
+
+Parameters:
+ - senderId - the user ID who sends messages to this user that
+   this function will register a listener for.
+ - messageType - message type from the sender you want to listen for.
+ - newListener: A provider for a callback to hear a message.
+   Do not pass nil to this.
+ */
+- (BOOL)registerListener:(NSData* _Nullable)senderID messageType:(long)messageType newListener:(id<BindingsListener> _Nullable)newListener error:(NSError* _Nullable* _Nullable)error;
+/**
+ * RemoveService removes all services for the given tag.
+ */
+- (BOOL)removeService:(NSString* _Nullable)tag error:(NSError* _Nullable* _Nullable)error;
+/**
+ * ReplayConfirm resends a confirmation to the partner. It will fail to send if
+the send relationship with the partner has already ratcheted.
+
+The confirmation sends as a critical message; if the round it sends on fails,
+it will be auto resent by the cMix client.
+
+This will not be useful if either side has ratcheted.
+
+Parameters:
+ - partnerID - the marshalled bytes of the id.ID object.
+
+Returns:
+ - int64 - ID of the round (convert to uint64)
+ */
+- (BOOL)replayConfirm:(NSData* _Nullable)partnerID ret0_:(int64_t* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error;
+/**
+ * Request sends a contact request from the user identity in the imported E2e
+structure to the passed contact, as well as the passed facts (it will error
+if they are too long).
+
+The other party must accept the request by calling Confirm to be able to send
+messages using E2e.SendE2E. When the other party does so, the "confirm"
+callback will get called.
+
+The round the request is initially sent on will be returned, but the request
+will be listed as a critical message, so the underlying cMix client will auto
+resend it in the event of failure.
+
+A request cannot be sent for a contact who has already received a request or
+who is already a partner.
+
+The request sends as a critical message, if the round it sends on fails, it
+will be auto resent by the cMix client.
+
+Parameters:
+ - partnerContact - the marshalled bytes of the contact.Contact object.
+ - factsListJson - the JSON marshalled bytes of [fact.FactList].
+
+Returns:
+ - int64 - ID of the round (convert to uint64)
+ */
+- (BOOL)request:(NSData* _Nullable)partnerContact factsListJson:(NSData* _Nullable)factsListJson ret0_:(int64_t* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error;
+/**
+ * Reset sends a contact reset request from the user identity in the imported
+e2e structure to the passed contact, as well as the passed facts (it will
+error if they are too long).
+
+This deletes all traces of the relationship with the partner from e2e and
+create a new relationship from scratch.
+
+The round the reset is initially sent on will be returned, but the request
+will be listed as a critical message, so the underlying cMix client will auto
+resend it in the event of failure.
+
+A request cannot be sent for a contact who has already received a request or
+who is already a partner.
+
+Parameters:
+ - partnerContact - the marshalled bytes of the contact.Contact object.
+
+Returns:
+ - int64 - ID of the round (convert to uint64)
+ */
+- (BOOL)reset:(NSData* _Nullable)partnerContact ret0_:(int64_t* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error;
+/**
+ * SecondPartitionSize returns the max partition payload size for all payloads
+after the first payload.
+ */
+- (long)secondPartitionSize;
+/**
+ * SendE2E send a message containing the payload to the recipient of the passed
+message type, per the given parameters--encrypted with end-to-end encryption.
+
+Parameters:
+ - recipientId - the marshalled bytes of the id.ID object.
+ - e2eParams - the marshalled bytes of the e2e.Params object.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the E2ESendReport object, which can
+   be passed into Cmix.WaitForRoundResult to see if the send succeeded.
+ */
+- (NSData* _Nullable)sendE2E:(long)messageType recipientId:(NSData* _Nullable)recipientId payload:(NSData* _Nullable)payload e2eParamsJSON:(NSData* _Nullable)e2eParamsJSON error:(NSError* _Nullable* _Nullable)error;
+/**
+ * VerifyOwnership checks if the received ownership proof is valid.
+
+Parameters:
+ - receivedContact, verifiedContact - the marshalled bytes of the
+     contact.Contact object.
+ - e2eId - ID of the e2e handler
+ */
+- (BOOL)verifyOwnership:(NSData* _Nullable)receivedContact verifiedContact:(NSData* _Nullable)verifiedContact e2eId:(long)e2eId ret0_:(BOOL* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * EventReport is a public struct which represents the contents of an event
+report.
+
+Example JSON:
+ {
+  "Priority":1,
+  "Category":"Test Events",
+  "EventType":"Ping",
+  "Details":"This is an example of an event report"
+ }
+ */
+@interface BindingsEventReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) long priority;
+@property (nonatomic) NSString* _Nonnull category;
+@property (nonatomic) NSString* _Nonnull eventType;
+@property (nonatomic) NSString* _Nonnull details;
+@end
+
+/**
+ * FilePartTracker contains the fileTransfer.FilePartTracker.
+ */
+@interface BindingsFilePartTracker : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * GetNumParts returns the total number of file parts in the transfer.
+ */
+- (long)getNumParts;
+/**
+ * GetPartStatus returns the status of the file part with the given part number.
+
+The possible values for the status are:
+ - 0 < Part does not exist
+ - 0 = unsent
+ - 1 = arrived (sender has sent a part, and it has arrived)
+ - 2 = received (receiver has received a part)
+ */
+- (long)getPartStatus:(long)partNum;
+@end
+
+/**
+ * FileSend is a public struct that contains the file contents and its name,
+type, and preview.
+ {
+  "Name":"testfile.txt",
+  "Type":"text file",
+  "Preview":"aXQncyBtZSBhIHByZXZpZXc=",
+  "Contents":"VGhpcyBpcyB0aGUgZnVsbCBjb250ZW50cyBvZiB0aGUgZmlsZSBpbiBieXRlcw=="
+ }
+ */
+@interface BindingsFileSend : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSString* _Nonnull name;
+@property (nonatomic) NSString* _Nonnull type;
+@property (nonatomic) NSData* _Nullable preview;
+@property (nonatomic) NSData* _Nullable contents;
+@end
+
+/**
+ * FileTransfer object is a bindings-layer struct which wraps a
+fileTransfer.FileTransfer interface.
+ */
+@interface BindingsFileTransfer : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * CloseSend deletes a file from the internal storage once a transfer has
+completed or reached the retry limit. Returns an error if the transfer has
+not run out of retries.
+
+This function should be called once a transfer completes or errors out (as
+reported by the progress callback).
+
+Parameters:
+ - tidBytes - file transfer ID
+ */
+- (BOOL)closeSend:(NSData* _Nullable)tidBytes error:(NSError* _Nullable* _Nullable)error;
+/**
+ * MaxFileNameLen returns the max number of bytes allowed for a file name.
+ */
+- (long)maxFileNameLen;
+/**
+ * MaxFileSize returns the max number of bytes allowed for a file.
+ */
+- (long)maxFileSize;
+/**
+ * MaxFileTypeLen returns the max number of bytes allowed for a file type.
+ */
+- (long)maxFileTypeLen;
+/**
+ * MaxPreviewSize returns the max number of bytes allowed for a file preview.
+ */
+- (long)maxPreviewSize;
+/**
+ * Receive returns the full file on the completion of the transfer. It deletes
+internal references to the data and unregisters any attached progress
+callbacks. Returns an error if the transfer is not complete, the full file
+cannot be verified, or if the transfer cannot be found.
+
+Receive can only be called once the progress callback returns that the
+file transfer is complete.
+
+Parameters:
+ - tidBytes - file transfer ID
+ */
+- (NSData* _Nullable)receive:(NSData* _Nullable)tidBytes error:(NSError* _Nullable* _Nullable)error;
+/**
+ * RegisterReceivedProgressCallback allows for the registration of a callback to
+track the progress of an individual received file transfer.
+
+This should be done when a new transfer is received on the ReceiveCallback.
+
+Parameters:
+ - tidBytes - file transfer ID
+ - callback - callback that reports file reception progress
+ - period - duration to wait between progress callbacks triggering
+ */
+- (BOOL)registerReceivedProgressCallback:(NSData* _Nullable)tidBytes callback:(id<BindingsFileTransferReceiveProgressCallback> _Nullable)callback period:(NSString* _Nullable)period error:(NSError* _Nullable* _Nullable)error;
+/**
+ * RegisterSentProgressCallback allows for the registration of a callback to
+track the progress of an individual sent file transfer.
+
+SentProgressCallback is auto registered on Send; this function should be
+called when resuming clients or registering extra callbacks.
+
+Parameters:
+ - tidBytes - file transfer ID
+ - callback - callback that reports file reception progress
+ - period - duration to wait between progress callbacks triggering
+ */
+- (BOOL)registerSentProgressCallback:(NSData* _Nullable)tidBytes callback:(id<BindingsFileTransferSentProgressCallback> _Nullable)callback period:(NSString* _Nullable)period error:(NSError* _Nullable* _Nullable)error;
+/**
+ * Send is the bindings-level function for sending a file.
+
+Parameters:
+ - payload - JSON marshalled FileSend
+ - recipientID - marshalled recipient id.ID
+ - retry - number of retries allowed
+ - callback - callback that reports file sending progress
+ - period - duration to wait between progress callbacks triggering
+
+Returns:
+ - []byte - unique file transfer ID
+ */
+- (NSData* _Nullable)send:(NSData* _Nullable)payload recipientID:(NSData* _Nullable)recipientID retry:(float)retry callback:(id<BindingsFileTransferSentProgressCallback> _Nullable)callback period:(NSString* _Nullable)period error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * Group structure contains the identifying and membership information of a
+group chat.
+ */
+@interface BindingsGroup : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * GetCreatedMS returns the time the group was created in milliseconds. This is
+also the time the group requests were sent.
+ */
+- (int64_t)getCreatedMS;
+/**
+ * GetCreatedNano returns the time the group was created in nanoseconds. This is
+also the time the group requests were sent.
+ */
+- (int64_t)getCreatedNano;
+/**
+ * GetID return the 33-byte unique group ID. This represents the id.ID object.
+ */
+- (NSData* _Nullable)getID;
+/**
+ * GetInitMessage returns initial message sent with the group request.
+ */
+- (NSData* _Nullable)getInitMessage;
+/**
+ * GetMembership retrieves a list of group members. The list is in order;
+the first contact is the leader/creator of the group.
+All subsequent members are ordered by their ID.
+
+Returns:
+ - []byte - JSON marshalled [group.Membership], which is an array of
+   [group.Member].
+
+Example JSON [group.Membership] return:
+ [
+   {
+     "ID": "U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVID",
+     "DhKey": {
+       "Value": 3534334367214237261,
+       "Fingerprint": 16801541511233098363
+     }
+   },
+   {
+     "ID": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+     "DhKey": {
+       "Value": 7497468244883513247,
+       "Fingerprint": 16801541511233098363
+     }
+   }
+ ]
+ */
+- (NSData* _Nullable)getMembership:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetName returns the name set by the user for the group.
+ */
+- (NSData* _Nullable)getName;
+/**
+ * GetTrackedID returns the tracked ID of the Group object. This is used by the
+backend tracker.
+ */
+- (long)getTrackedID;
+/**
+ * Serialize serializes the Group.
+ */
+- (NSData* _Nullable)serialize;
+@end
+
+/**
+ * GroupChat is a binding-layer group chat manager.
+ */
+@interface BindingsGroupChat : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * NewGroupChat creates a bindings-layer group chat manager.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker.
+ - requestFunc - a callback to handle group chat requests.
+ - processor - the group chat message processor.
+ */
+- (nullable instancetype)init:(long)e2eID requestFunc:(id<BindingsGroupRequest> _Nullable)requestFunc processor:(id<BindingsGroupChatProcessor> _Nullable)processor;
+/**
+ * GetGroup returns the group with the group ID. If no group exists, then the
+error "failed to find group" is returned.
+
+Parameters:
+ - groupId - The byte data representing a group ID (a byte marshalled id.ID).
+   This can be pulled from a marshalled GroupReport.
+Returns:
+ - Group - The bindings-layer representation of a group.
+ */
+- (BindingsGroup* _Nullable)getGroup:(NSData* _Nullable)groupId error:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetGroups returns a list of group IDs that the user is a member of.
+
+Returns:
+ - []byte - a JSON marshalled []*id.ID representing all group ID's.
+ */
+- (NSData* _Nullable)getGroups:(NSError* _Nullable* _Nullable)error;
+/**
+ * JoinGroup allows a user to join a group when a request is received.
+If an error is returned, handle it properly first; you may then retry later
+with the same trackedGroupId.
+
+Parameters:
+ - trackedGroupId - the ID to retrieve the Group object within the backend's
+   tracking system. This is received by GroupRequest.Callback.
+ */
+- (BOOL)joinGroup:(long)trackedGroupId error:(NSError* _Nullable* _Nullable)error;
+/**
+ * LeaveGroup deletes a group so a user no longer has access.
+
+Parameters:
+ - groupId - the byte data representing a group ID.
+   This can be pulled from a marshalled GroupReport.
+ */
+- (BOOL)leaveGroup:(NSData* _Nullable)groupId error:(NSError* _Nullable* _Nullable)error;
+/**
+ * MakeGroup creates a new Group and sends a group request to all members in the
+group.
+
+Parameters:
+ - membershipBytes - the JSON marshalled list of []*id.ID; it contains the
+   IDs of members the user wants to add to the group.
+ - message - the initial message sent to all members in the group. This is an
+   optional parameter and may be nil.
+ - name - the name of the group decided by the creator. This is an optional
+   parameter and may be nil. If nil the group will be assigned the default
+   name.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the GroupReport object, which can be
+   passed into Cmix.WaitForRoundResult to see if the group request message
+   send succeeded.
+ */
+- (NSData* _Nullable)makeGroup:(NSData* _Nullable)membershipBytes message:(NSData* _Nullable)message name:(NSData* _Nullable)name error:(NSError* _Nullable* _Nullable)error;
+/**
+ * NumGroups returns the number of groups the user is a part of.
+ */
+- (long)numGroups;
+/**
+ * ResendRequest resends a group request to all members in the group.
+
+Parameters:
+ - groupId - a byte representation of a group's ID.
+   This can be found in the report returned by GroupChat.MakeGroup.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the GroupReport object, which can be
+   passed into WaitForRoundResult to see if the group request message send
+   succeeded.
+ */
+- (NSData* _Nullable)resendRequest:(NSData* _Nullable)groupId error:(NSError* _Nullable* _Nullable)error;
+/**
+ * Send is the bindings-level function for sending to a group.
+
+Parameters:
+ - groupId - the byte data representing a group ID. This can be pulled from
+   marshalled GroupReport.
+ - message - the message that the user wishes to send to the group.
+ - tag - the tag associated with the message. This tag may be empty.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the GroupSendReport object, which
+   can be passed into Cmix.WaitForRoundResult to see if the group message
+   send succeeded.
+ */
+- (NSData* _Nullable)send:(NSData* _Nullable)groupId message:(NSData* _Nullable)message tag:(NSString* _Nullable)tag error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * GroupReport is returned when creating a new group and contains the ID of
+the group, a list of rounds that the group requests were sent on, and the
+status of the send operation.
+ */
+@interface BindingsGroupReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSData* _Nullable id_;
+// skipped field GroupReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+@property (nonatomic) long status;
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * GroupSendReport is returned when sending a group message. It contains the
+round ID sent on and the timestamp of the send operation.
+ */
+@interface BindingsGroupSendReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field GroupSendReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+@property (nonatomic) int64_t timestamp;
+@property (nonatomic) NSData* _Nullable messageID;
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * Message is the bindings' representation of a receive.Message.
+
+JSON example:
+ {
+  "MessageType":1,
+  "ID":"EB/70R5HYEw5htZ4Hg9ondrn3+cAc/lH2G0mjQMja3w=",
+  "Payload":"7TzZKgNphT5UooNM7mDSwtVcIs8AIu4vMKm4ld6GSR8YX5GrHirixUBAejmsgdroRJyo06TkIVef7UM9FN8YfQ==",
+  "Sender":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+  "RecipientID":"amFrZXh4MzYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+  "EphemeralID":17,"Timestamp":1653580439357351000,
+  "Encrypted":false,
+  "RoundId":19
+ }
+ */
+@interface BindingsMessage : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) long messageType;
+@property (nonatomic) NSData* _Nullable id_;
+@property (nonatomic) NSData* _Nullable payload;
+@property (nonatomic) NSData* _Nullable sender;
+@property (nonatomic) NSData* _Nullable recipientID;
+@property (nonatomic) int64_t ephemeralID;
+@property (nonatomic) int64_t timestamp;
+@property (nonatomic) BOOL encrypted;
+@property (nonatomic) long roundId;
+@end
+
+/**
+ * NodeRegistrationReport is the report structure which
+Cmix.GetNodeRegistrationStatus returns JSON marshalled.
+ */
+@interface BindingsNodeRegistrationReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) long numberOfNodesRegistered;
+@property (nonatomic) long numberOfNodes;
+@end
+
+/**
+ * Progress is a public struct that represents the progress of an in-progress
+file transfer.
+
+Example JSON:
+ {
+  "Completed":false,
+  "Transmitted":128,
+  "Total":2048,
+  "Err":null
+ }
+ */
+@interface BindingsProgress : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) BOOL completed;
+@property (nonatomic) long transmitted;
+@property (nonatomic) long total;
+@property (nonatomic) NSError* _Nullable err;
+@end
+
+/**
+ * ReceivedFile is a public struct that contains the metadata of a new file
+transfer.
+
+Example JSON:
+ {
+  "TransferID":"B4Z9cwU18beRoGbk5xBjbcd5Ryi9ZUFA2UBvi8FOHWo=",
+  "SenderID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+  "Preview":"aXQncyBtZSBhIHByZXZpZXc=",
+  "Name":"testfile.txt",
+  "Type":"text file",
+  "Size":2048
+ }
+ */
+@interface BindingsReceivedFile : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSData* _Nullable transferID;
+@property (nonatomic) NSData* _Nullable senderID;
+@property (nonatomic) NSData* _Nullable preview;
+@property (nonatomic) NSString* _Nonnull name;
+@property (nonatomic) NSString* _Nonnull type;
+@property (nonatomic) long size;
+@end
+
+/**
+ * ReceptionIdentity struct.
+
+JSON example:
+ {
+  "ID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+  "RSAPrivatePem":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNU15dTdhYjBJOS9UL1BFUUxtd2x3ejZHV3FjMUNYemVIVXhoVEc4bmg1WWRWSXMxCmJ2THpBVjNOMDJxdXN6K2s4TVFEWjBtejMzdkswUmhPczZIY0NUSFdzTEpXRkE5WWpzWWlCRi9qTDd1bmd1ckIKL2tvK1JJSnNrWGFWaEZaazRGdERoRXhTNWY4RnR0Qmk1NmNLZmdJQlVKT3ozZi9qQllTMkxzMlJ6cWV5YXM3SApjV2RaME9TclBTT3BiYlViU1FPbS9LWnlweGZHU21yZ2oxRUZuU1dZZ2xGZTdUOTRPbHF5MG14QTV5clVXbHorCk9sK3hHbXpCNUp4WUFSMU9oMFQrQTk4RWMrTUZHNm43L1MraDdzRDgybGRnVnJmbStFTzRCdmFKeTRESGZGMWgKNnp6QnVnY25NUVFGc0dLeDFYWC9COTVMdUpPVjdyeXlDbzZGbHdJREFRQUJBb0lCQVFDaUh6OGNlcDZvQk9RTAphUzBVRitHeU5VMnlVcVRNTWtTWThoUkh1c09CMmFheXoybHZVb3RLUHBPbjZRSWRWVTJrcE4vY2dtY0lSb2x5CkhBMDRUOHJBWVNaRlVqaVlRajkzKzRFREpJYXd2Z0YyVEs1bFoyb3oxVTdreStncU82V0RMR2Z0Q0wvODVQWEIKa210aXhnUXpRV3g1RWcvemtHdm03eURBalQxeDloNytsRjJwNFlBam5kT2xTS0dmQjFZeTR1RXBQd0kwc1lWdgpKQWc0MEFxbllZUmt4emJPbmQxWGNjdEJFN2Z1VDdrWXhoeSs3WXYrUTJwVy9BYmh6NGlHOEY1MW9GMGZwV0czCmlISDhsVXZFTkp2SUZEVHZ0UEpESlFZalBRN3lUbGlGZUdrMXZUQkcyQkpQNExzVzhpbDZOeUFuRktaY1hOQ24KeHVCendiSlJBb0dCQVBUK0dGTVJGRHRHZVl6NmwzZmg3UjJ0MlhrMysvUmpvR3BDUWREWDhYNERqR1pVd1RGVQpOS2tQTTNjS29ia2RBYlBDb3FpL0tOOVBibk9QVlZ3R3JkSE9vSnNibFVHYmJGamFTUzJQMFZnNUVhTC9rT2dUCmxMMUdoVFpIUWk1VUlMM0p4M1Z3T0ZRQ3RQOU1UQlQ0UEQvcEFLbDg3VTJXN3JTY1dGV1ZGbFNkQW9HQkFPOFUKVmhHWkRpVGFKTWVtSGZIdVYrNmtzaUlsam9aUVVzeGpmTGNMZ2NjV2RmTHBqS0ZWTzJNN3NqcEJEZ0w4NmFnegorVk14ZkQzZ1l0SmNWN01aMVcwNlZ6TlNVTHh3a1dRY1hXUWdDaXc5elpyYlhCUmZRNUVjMFBlblVoWWVwVzF5CkpkTC8rSlpQeDJxSzVrQytiWU5EdmxlNWdpcjlDSGVzTlR5enVyckRBb0dCQUl0cTJnN1RaazhCSVFUUVNrZ24Kb3BkRUtzRW4wZExXcXlBdENtVTlyaWpHL2l2eHlXczMveXZDQWNpWm5VVEp0QUZISHVlbXVTeXplQ2g5QmRkegoyWkRPNUdqQVBxVHlQS3NudFlNZkY4UDczZ1NES1VSWWVFbHFDejdET0c5QzRzcitPK3FoN1B3cCtqUmFoK1ZiCkNuWllNMDlBVDQ3YStJYUJmbWRkaXpLbEFvR0JBSmo1dkRDNmJIQnNISWlhNUNJL1RZaG5YWXUzMkVCYytQM0sKMHF3VThzOCtzZTNpUHBla2Y4RjVHd3RuUU4zc2tsMk1GQWFGYldmeVFZazBpUEVTb0p1cGJzNXA1enNNRkJ1bwpncUZrVnQ0RUZhRDJweTVwM2tQbDJsZjhlZXVwWkZScGE0WmRQdVIrMjZ4eWYrNEJhdlZJeld3NFNPL1V4Q3crCnhqbTNEczRkQW9HQWREL0VOa1BjU004c1BCM3JSWW9MQ2twcUV2U0MzbVZSbjNJd3c1WFAwcDRRVndhRmR1ckMKYUhtSE1EekNrNEUvb0haQVhFdGZ2S2tRaUI4MXVYM2c1aVo4amdYUVhXUHRteTVIcVVhcWJYUTlENkxWc3B0egpKL3R4SWJLMXp5c1o2bk9IY1VoUUwyVVF6SlBBRThZNDdjYzVzTThEN3kwZjJ0QURTQUZNMmN3PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ==",
+  "Salt":"4kk02v0NIcGtlobZ/xkxqWz8uH/ams/gjvQm14QT0dI=",
+  "DHKeyPrivate":"eyJWYWx1ZSI6NDU2MDgzOTEzMjA0OTIyODA5Njg2MDI3MzQ0MzM3OTA0MzAyODYwMjM2NDk2NDM5NDI4NTcxMTMwNDMzOTQwMzgyMTIyMjY4OTQzNTMyMjIyMzc1MTkzNTEzMjU4MjA4MDA0NTczMDY4MjEwNzg2NDI5NjA1MjA0OTA3MjI2ODI5OTc3NTczMDkxODY0NTY3NDExMDExNjQxNCwiRmluZ2VycHJpbnQiOjE2ODAxNTQxNTExMjMzMDk4MzYzfQ=="
+  "E2eGrp": "eyJnZW4iOiIyIiwicHJpbWUiOiJlMmVlOTgzZDAzMWRjMWRiNmYxYTdhNjdkZjBlOWE4ZTU1NjFkYjhlOGQ0OTQxMzM5NGMwNDliN2E4YWNjZWRjMjk4NzA4ZjEyMTk1MWQ5Y2Y5MjBlYzVkMTQ2NzI3YWE0YWU1MzViMDkyMmM2ODhiNTViM2RkMmFlZGY2YzAxYzk0NzY0ZGFiOTM3OTM1YWE4M2JlMzZlNjc3NjA3MTNhYjQ0YTYzMzdjMjBlNzg2MTU3NWU3NDVkMzFmOGI5ZTlhZDg0MTIxMThjNjJhM2UyZTI5ZGY0NmIwODY0ZDBjOTUxYzM5NGE1Y2JiZGM2YWRjNzE4ZGQyYTNlMDQxMDIzZGJiNWFiMjNlYmI0NzQyZGU5YzE2ODdiNWIzNGZhNDhjMzUyMTYzMmM0YTUzMGU4ZmZiMWJjNTFkYWRkZjQ1M2IwYjI3MTdjMmJjNjY2OWVkNzZiNGJkZDVjOWZmNTU4ZTg4ZjI2ZTU3ODUzMDJiZWRiY2EyM2VhYzVhY2U5MjA5NmVlOGE2MDY0MmZiNjFlOGYzZDI0OTkwYjhjYjEyZWU0NDhlZWY3OGUxODRjNzI0MmRkMTYxYzc3MzhmMzJiZjI5YTg0MTY5ODk3ODgyNWI0MTExYjRiYzNlMWUxOTg0NTUwOTU5NTgzMzNkNzc2ZDhiMmJlZWVkM2ExYTFhMjIxYTZlMzdlNjY0YTY0YjgzOTgxYzQ2ZmZkZGMxYTQ1ZTNkNTIxMWFhZjhiZmJjMDcyNzY4YzRmNTBkN2Q3ODAzZDJkNGYyNzhkZTgwMTRhNDczMjM2MzFkN2UwNjRkZTgxYzBjNmJmYTQzZWYwZTY5OTg4NjBmMTM5MGI1ZDNmZWFjYWYxNjk2MDE1Y2I3OWMzZjljMmQ5M2Q5NjExMjBjZDBlNWYxMmNiYjY4N2VhYjA0NTI0MWY5Njc4OWMzOGU4OWQ3OTYxMzhlNjMxOWJlNjJlMzVkODdiMTA0OGNhMjhiZTM4OWI1NzVlOTk0ZGNhNzU1NDcxNTg0YTA5ZWM3MjM3NDJkYzM1ODczODQ3YWVmNDlmNjZlNDM4NzMifQ=="
+}
+ */
+@interface BindingsReceptionIdentity : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSData* _Nullable id_;
+@property (nonatomic) NSData* _Nullable rsaPrivatePem;
+@property (nonatomic) NSData* _Nullable salt;
+@property (nonatomic) NSData* _Nullable dhKeyPrivate;
+@property (nonatomic) NSData* _Nullable e2eGrp;
+@end
+
+/**
+ * RestlikeMessage is the bindings' representation of a restlike.Message
+
+JSON example:
+ {
+  "Version":1,
+  "Headers":"Y29udGVudHM6YXBwbGljYXRpb24vanNvbg==",
+  "Content":"VGhpcyBpcyBhIHJlc3RsaWtlIG1lc3NhZ2U=",
+  "Method":2,
+  "URI":"xx://CmixRestlike/rest",
+  "Error":""
+ }
+ */
+@interface BindingsRestlikeMessage : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field RestlikeMessage.Version with unsupported type: uint32
+
+@property (nonatomic) NSData* _Nullable headers;
+@property (nonatomic) NSData* _Nullable content;
+@property (nonatomic) long method;
+@property (nonatomic) NSString* _Nonnull uri;
+@property (nonatomic) NSString* _Nonnull error;
+@end
+
+/**
+ * RoundsList contains a list of round IDs.
+
+Example marshalled roundList object:
+ [1001,1003,1006]
+ */
+@interface BindingsRoundsList : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field RoundsList.Rounds with unsupported type: []uint64
+
+/**
+ * Marshal JSON marshals the RoundsList.
+ */
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * SingleUseCallbackReport is the bindings-layer struct used to represent
+single -use messages received by a callback passed into single.Listen.
+
+JSON example:
+ {
+  "Rounds":[1,5,9],
+  "Payload":"rSuPD35ELWwm5KTR9ViKIz/r1YGRgXIl5792SF8o8piZzN6sT4Liq4rUU/nfOPvQEjbfWNh/NYxdJ72VctDnWw==",
+  "Partner":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+  "EphID":1655533,
+  "ReceptionID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"}
+ }
+ */
+@interface BindingsSingleUseCallbackReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field SingleUseCallbackReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+@property (nonatomic) NSData* _Nullable payload;
+// skipped field SingleUseCallbackReport.Partner with unsupported type: *gitlab.com/xx_network/primitives/id.ID
+
+@property (nonatomic) int64_t ephID;
+// skipped field SingleUseCallbackReport.ReceptionID with unsupported type: *gitlab.com/xx_network/primitives/id.ID
+
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * SingleUseResponseReport is the bindings-layer struct used to represent
+information passed to the single.Response callback interface in response to
+single.TransmitRequest.
+
+JSON example:
+ {
+  "Rounds":[1,5,9],
+  "Payload":"rSuPD35ELWwm5KTR9ViKIz/r1YGRgXIl5792SF8o8piZzN6sT4Liq4rUU/nfOPvQEjbfWNh/NYxdJ72VctDnWw==",
+  "EphID":1655533,
+  "ReceptionID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"},
+  "Err":"",
+ }
+ */
+@interface BindingsSingleUseResponseReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field SingleUseResponseReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+@property (nonatomic) NSData* _Nullable payload;
+// skipped field SingleUseResponseReport.ReceptionID with unsupported type: *gitlab.com/xx_network/primitives/id.ID
+
+@property (nonatomic) int64_t ephID;
+@property (nonatomic) NSError* _Nullable err;
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * SingleUseSendReport is the bindings-layer struct used to represent
+information returned by single.TransmitRequest.
+
+JSON example:
+ {
+  "Rounds":[1,5,9],
+  "EphID":1655533,
+  "ReceptionID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"}
+ }
+ */
+@interface BindingsSingleUseSendReport : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+// skipped field SingleUseSendReport.RoundsList with unsupported type: gitlab.com/elixxir/client/bindings.RoundsList
+
+// skipped field SingleUseSendReport.ReceptionID with unsupported type: *gitlab.com/xx_network/primitives/id.ID
+
+@property (nonatomic) int64_t ephID;
+- (NSData* _Nullable)marshal:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * UserDiscovery is a bindings-layer struct that wraps an ud.Manager interface.
+ */
+@interface BindingsUserDiscovery : NSObject <goSeqRefInterface> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (nonnull instancetype)init;
+/**
+ * ConfirmFact confirms a fact first registered via SendRegisterFact. The
+confirmation ID comes from SendRegisterFact while the code will come over the
+associated communications system.
+ */
+- (BOOL)confirmFact:(NSString* _Nullable)confirmationID code:(NSString* _Nullable)code error:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetContact returns the marshalled bytes of the contact.Contact for UD as
+retrieved from the NDF.
+ */
+- (NSData* _Nullable)getContact:(NSError* _Nullable* _Nullable)error;
+/**
+ * GetFacts returns a JSON marshalled list of [fact.Fact] objects that exist
+within the Store's registeredFacts map.
+ */
+- (NSData* _Nullable)getFacts;
+/**
+ * GetID returns the udTracker ID for the UserDiscovery object.
+ */
+- (long)getID;
+/**
+ * PermanentDeleteAccount removes the username associated with this user from
+the UD service. This will only take a username type fact, and the fact must
+be associated with this user.
+
+Parameters:
+ - factJson - a JSON marshalled [fact.Fact]
+ */
+- (BOOL)permanentDeleteAccount:(NSData* _Nullable)factJson error:(NSError* _Nullable* _Nullable)error;
+/**
+ * RemoveFact removes a previously confirmed fact. This will fail if the fact
+passed in is not UD service does not associate this fact with this user.
+
+Parameters:
+ - factJson - a JSON marshalled [fact.Fact]
+ */
+- (BOOL)removeFact:(NSData* _Nullable)factJson error:(NSError* _Nullable* _Nullable)error;
+/**
+ * SendRegisterFact adds a fact for the user to user discovery. Will only
+succeed if the user is already registered and the system does not have the
+fact currently registered for any user.
+
+This does not complete the fact registration process, it returns a
+confirmation ID instead. Over the communications system the fact is
+associated with, a code will be sent. This confirmation ID needs to be called
+along with the code to finalize the fact.
+
+Parameters:
+ - factJson - a JSON marshalled [fact.Fact]
+ */
+- (NSString* _Nonnull)sendRegisterFact:(NSData* _Nullable)factJson error:(NSError* _Nullable* _Nullable)error;
+@end
+
+/**
+ * Error codes
+ */
+FOUNDATION_EXPORT NSString* _Nonnull const BindingsUnrecognizedCode;
+/**
+ * Error codes
+ */
+FOUNDATION_EXPORT NSString* _Nonnull const BindingsUnrecognizedMessage;
+
+/**
+ * AsyncRequestRestLike sends an asynchronous restlike request to a given
+contact.
+
+Parameters:
+ - e2eID - ID of the e2e object in the tracker
+ - recipient - marshalled contact.Contact object
+ - request - JSON marshalled RestlikeMessage
+ - paramsJSON - JSON marshalled single.RequestParams
+ - cb - RestlikeCallback callback
+
+Returns an error, and the RestlikeCallback will be called with the results
+of JSON marshalling the response when received.
+ */
+FOUNDATION_EXPORT BOOL BindingsAsyncRequestRestLike(long e2eID, NSData* _Nullable recipient, NSData* _Nullable request, NSData* _Nullable paramsJSON, id<BindingsRestlikeCallback> _Nullable cb, NSError* _Nullable* _Nullable error);
+
+/**
+ * CreateUserFriendlyErrorMessage will convert the passed in error string to an
+error string that is user-friendly if a substring match is found to a
+common error. Common errors is a map that can be updated using
+UpdateCommonErrors. If the error is not common, some simple parsing is done
+on the error message to make it more user-accessible, removing backend
+specific jargon.
+
+Parameters:
+  - errStr - an error returned from the backend.
+
+Returns
+ - A user-friendly error message. This should be devoid of technical speak
+   but still be meaningful for front-end or back-end teams.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull BindingsCreateUserFriendlyErrorMessage(NSString* _Nullable errStr);
+
+/**
+ * DownloadAndVerifySignedNdfWithUrl retrieves the NDF from a specified URL.
+The NDF is processed into a protobuf containing a signature that is verified
+using the cert string passed in. The NDF is returned as marshaled byte data
+that may be used to start a client.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsDownloadAndVerifySignedNdfWithUrl(NSString* _Nullable url, NSString* _Nullable cert, NSError* _Nullable* _Nullable error);
+
+/**
+ * EnableGrpcLogs sets GRPC trace logging.
+ */
+FOUNDATION_EXPORT void BindingsEnableGrpcLogs(id<BindingsLogWriter> _Nullable writer);
+
+/**
+ * GenerateSecret creates a secret password using a system-based pseudorandom
+number generator.
+
+Parameters:
+ - numBytes - The size of secret. It should be set to 32, but can be set
+  higher in certain cases.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGenerateSecret(long numBytes);
+
+/**
+ * GetDefaultCMixParams returns a JSON serialized object with all of the cMix
+parameters and their default values. Call this function and modify the JSON
+to change cMix settings.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetDefaultCMixParams(void);
+
+/**
+ * GetDefaultE2EParams returns a JSON serialized object with all of the E2E
+parameters and their default values. Call this function and modify the JSON
+to change E2E settings.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetDefaultE2EParams(void);
+
+/**
+ * GetDefaultE2eFileTransferParams returns a JSON serialized object with all the
+E2E file transfer parameters and their default values. Call this function and
+modify the JSON to change single use settings.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetDefaultE2eFileTransferParams(void);
+
+/**
+ * GetDefaultFileTransferParams returns a JSON serialized object with all the
+file transfer parameters and their default values. Call this function and
+modify the JSON to change file transfer settings.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetDefaultFileTransferParams(void);
+
+/**
+ * GetDefaultSingleUseParams returns a JSON serialized object with all the
+single-use parameters and their default values. Call this function and modify
+the JSON to change single use settings.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetDefaultSingleUseParams(void);
+
+/**
+ * GetDependencies returns the xxdk.DEPENDENCIES.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull BindingsGetDependencies(void);
+
+/**
+ * GetFactsFromContact returns the fact list in the [contact.Contact] object.
+
+Parameters:
+ - marshaledContact - the JSON marshalled bytes of [contact.Contact]
+
+Returns:
+ - []byte - the JSON marshalled bytes of [fact.FactList]
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetFactsFromContact(NSData* _Nullable marshaledContact, NSError* _Nullable* _Nullable error);
+
+/**
+ * GetGitVersion returns the xxdk.GITVERSION.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull BindingsGetGitVersion(void);
+
+/**
+ * GetIDFromContact returns the ID in the [contact.Contact] object.
+
+Parameters:
+ - marshaledContact - JSON marshalled bytes of [contact.Contact]
+
+Returns:
+ - []byte - bytes of the [id.ID] object
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetIDFromContact(NSData* _Nullable marshaledContact, NSError* _Nullable* _Nullable error);
+
+/**
+ * GetPubkeyFromContact returns the DH public key in the [contact.Contact]
+object.
+
+Parameters:
+ - marshaledContact - JSON marshalled bytes of [contact.Contact]
+
+Returns:
+ - []byte - JSON marshalled bytes of the [cyclic.Int] object
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsGetPubkeyFromContact(NSData* _Nullable marshaledContact, NSError* _Nullable* _Nullable error);
+
+/**
+ * GetVersion returns the xxdk.SEMVER.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull BindingsGetVersion(void);
+
+/**
+ * InitFileTransfer creates a bindings-level file transfer manager.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - paramsJSON - JSON marshalled fileTransfer.Params
+ */
+FOUNDATION_EXPORT BindingsFileTransfer* _Nullable BindingsInitFileTransfer(long e2eID, id<BindingsReceiveFileCallback> _Nullable receiveFileCallback, NSData* _Nullable e2eFileTransferParamsJson, NSData* _Nullable fileTransferParamsJson, NSError* _Nullable* _Nullable error);
+
+/**
+ * InitializeBackup creates a bindings-layer Backup object.
+
+Parameters:
+ - e2eID - ID of the E2e object in the e2e tracker.
+ - udID - ID of the UserDiscovery object in the ud tracker.
+ - backupPassPhrase - backup passphrase provided by the user. Used to decrypt
+   backup.
+ - cb - the callback to be called when a backup is triggered.
+ */
+FOUNDATION_EXPORT BindingsBackup* _Nullable BindingsInitializeBackup(long e2eID, long udID, NSString* _Nullable backupPassPhrase, id<BindingsUpdateBackupFunc> _Nullable cb, NSError* _Nullable* _Nullable error);
+
+/**
+ * IsRegisteredWithUD is a function which checks the internal state
+files to determine if a user has registered with UD in the past.
+
+Parameters:
+ - e2eID -  REQUIRED. The tracked e2e object ID. This can be retrieved using [E2e.GetID].
+
+Returns:
+  - bool - A boolean representing true if the user has been registered with UD already
+           or false if it has not been registered already.
+ - error - An error should only be returned if the internal tracker failed to retrieve an
+           E2e object given the e2eId. If an error was returned, the registration state check
+           was not performed properly, and the boolean returned should be ignored.
+ */
+FOUNDATION_EXPORT BOOL BindingsIsRegisteredWithUD(long e2eId, BOOL* _Nullable ret0_, NSError* _Nullable* _Nullable error);
+
+/**
+ * Listen starts a single-use listener on a given tag using the passed in E2e
+object and SingleUseCallback func.
+
+Parameters:
+ - e2eID - ID of the e2e object in the tracker
+ - tag - identifies the single-use message
+ - cb - the callback that will be called when a response is received
+
+Returns:
+ - Stopper - an interface containing a function used to stop the listener
+ */
+FOUNDATION_EXPORT id<BindingsStopper> _Nullable BindingsListen(long e2eID, NSString* _Nullable tag, id<BindingsSingleUseCallback> _Nullable cb, NSError* _Nullable* _Nullable error);
+
+/**
+ * LoadCmix will load an existing user storage from the storageDir using the
+password. This will fail if the user storage does not exist or the password
+is incorrect.
+
+The password is passed as a byte array so that it can be cleared from memory
+and stored as securely as possible using the MemGuard library.
+
+LoadCmix does not block on network connection and instead loads and starts
+subprocesses to perform network operations.
+ */
+FOUNDATION_EXPORT BindingsCmix* _Nullable BindingsLoadCmix(NSString* _Nullable storageDir, NSData* _Nullable password, NSData* _Nullable cmixParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * LoadReceptionIdentity loads the given identity in Cmix storage with the given
+key.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsLoadReceptionIdentity(NSString* _Nullable key, long cmixId, NSError* _Nullable* _Nullable error);
+
+/**
+ * LogLevel sets level of logging. All logs at the set level and below will be
+displayed (e.g., when log level is ERROR, only ERROR, CRITICAL, and FATAL
+messages will be printed).
+
+Log level options:
+	TRACE    - 0
+	DEBUG    - 1
+	INFO     - 2
+	WARN     - 3
+	ERROR    - 4
+	CRITICAL - 5
+	FATAL    - 6
+
+The default log level without updates is INFO.
+ */
+FOUNDATION_EXPORT BOOL BindingsLogLevel(long level, NSError* _Nullable* _Nullable error);
+
+/**
+ * Login creates and returns a new E2e object and adds it to the
+e2eTrackerSingleton. Identity should be created via
+Cmix.MakeReceptionIdentity and passed in here. If callbacks is left nil, a
+default auth.Callbacks will be used.
+ */
+FOUNDATION_EXPORT BindingsE2e* _Nullable BindingsLogin(long cmixId, id<BindingsAuthCallbacks> _Nullable callbacks, NSData* _Nullable identity, NSData* _Nullable e2eParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * LoginEphemeral creates and returns a new ephemeral E2e object and adds it to
+the e2eTrackerSingleton. Identity should be created via
+Cmix.MakeReceptionIdentity or Cmix.MakeLegacyReceptionIdentity and passed in
+here. If callbacks is left nil, a default auth.Callbacks will be used.
+ */
+FOUNDATION_EXPORT BindingsE2e* _Nullable BindingsLoginEphemeral(long cmixId, id<BindingsAuthCallbacks> _Nullable callbacks, NSData* _Nullable identity, NSData* _Nullable e2eParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * LookupUD returns the public key of the passed ID as known by the user
+discovery system or returns by the timeout.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - udContact - the marshalled bytes of the contact.Contact object
+ - lookupId - the marshalled bytes of the id.ID object for the user that
+   LookupUD will look up.
+ - singleRequestParams - the JSON marshalled bytes of single.RequestParams
+
+Returns:
+ - []byte - the JSON marshalled bytes of the SingleUseSendReport object,
+   which can be passed into Cmix.WaitForRoundResult to see if the send
+   succeeded.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsLookupUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdLookupCallback> _Nullable cb, NSData* _Nullable lookupId, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewBroadcastChannel creates a bindings-layer broadcast channel and starts
+listening for new messages.
+
+Parameters:
+ - cmixId - internal ID of cmix
+ - channelDefinition - JSON marshalled ChannelDef object
+ */
+FOUNDATION_EXPORT BindingsChannel* _Nullable BindingsNewBroadcastChannel(long cmixId, NSData* _Nullable channelDefinition, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewCmix creates user storage, generates keys, connects, and registers with
+the network. Note that this does not register a username/identity, but merely
+creates a new cryptographic identity for adding such information at a later
+date.
+
+Users of this function should delete the storage directory on error.
+ */
+FOUNDATION_EXPORT BOOL BindingsNewCmix(NSString* _Nullable ndfJSON, NSString* _Nullable storageDir, NSData* _Nullable password, NSString* _Nullable registrationCode, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewCmixFromBackup initializes a new e2e storage from an encrypted
+backup. Users of this function should delete the storage directory on error.
+Users of this function should call LoadCmix as normal once this call succeeds.
+
+Parameters:
+ - ndfJSON - JSON of the NDF.
+ - storageDir - directory for the storage files.
+ - sessionPassword - password to decrypt the data in the storageDir.
+ - backupPassphrase - backup passphrase provided by the user. Used to decrypt backup.
+ - backupFileContents - the file contents of the backup.
+
+Returns:
+ - []byte - the JSON marshalled bytes of the BackupReport object.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsNewCmixFromBackup(NSString* _Nullable ndfJSON, NSString* _Nullable storageDir, NSString* _Nullable backupPassphrase, NSData* _Nullable sessionPassword, NSData* _Nullable backupFileContents, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewDummyTrafficManager creates a DummyTraffic manager and initialises the
+dummy traffic sending thread. Note that the manager does not start sending
+dummy traffic until true is passed into DummyTraffic.SetStatus. The time
+duration between each sending operation and the amount of messages sent each
+interval are randomly generated values with bounds defined by the given
+parameters below.
+
+Parameters:
+ - cmixId - a Cmix object ID in the tracker.
+ - maxNumMessages - the upper bound of the random number of messages sent
+   each sending cycle.
+ - avgSendDeltaMS - the average duration, in milliseconds, to wait between
+   sends.
+ - randomRangeMS - the upper bound of the interval between sending cycles, in
+   milliseconds. Sends occur every avgSendDeltaMS +/- a random duration with
+   an upper bound of randomRangeMS.
+ */
+FOUNDATION_EXPORT BindingsDummyTraffic* _Nullable BindingsNewDummyTrafficManager(long cmixId, long maxNumMessages, long avgSendDeltaMS, long randomRangeMS, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewGroupChat creates a bindings-layer group chat manager.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker.
+ - requestFunc - a callback to handle group chat requests.
+ - processor - the group chat message processor.
+ */
+FOUNDATION_EXPORT BindingsGroupChat* _Nullable BindingsNewGroupChat(long e2eID, id<BindingsGroupRequest> _Nullable requestFunc, id<BindingsGroupChatProcessor> _Nullable processor, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewOrLoadUd loads an existing UserDiscovery from storage or creates a new
+UserDiscovery if there is no storage data. Regardless of storage state,
+the UserDiscovery object returned will be registered with the
+User Discovery service. If the user is not already registered, a call
+to register will occur internally. If the user is already registered,
+this call will simply load state and return to you a UserDiscovery object.
+Some parameters are required for registering with the service, but are not required
+if the user is already registered. These will be noted in the parameters section as
+"SEMI-REQUIRED".
+
+Certain parameters are required every call to this function. These parameters are listed below
+as "REQUIRED". For example, parameters need be provided to specify how to connect to the
+User Discovery service. These parameters specifically may be used to contact either the UD
+server hosted by the xx network team or a custom third-party operated server. For the former,
+all the information may be fetched from the NDF using the bindings. These fetch
+methods are detailed in the parameters section.
+
+Params
+ - e2eID -  REQUIRED. The tracked e2e object ID. This is returned by [E2e.GetID].
+ - follower - REQUIRED. Network follower function. This will check if the network
+   follower is running.
+ - username - SEMI-REQUIRED. The username the user wants to register with UD.
+   If the user is already registered, this field may be blank. If the user is not
+   already registered, these field must be populated with a username that meets the
+   requirements of the UD service. For example, in the xx network's UD service,
+   the username must not be registered by another user.
+ - registrationValidationSignature - SEMI-REQUIRED. A signature provided by the xx network
+   (i.e. the client registrar). If the user is not already registered, this field is required
+   in order to register with the xx network. This may be nil if the user is already registered
+   or connecting to a third-party UD service unassociated with the xx network.
+ - cert - REQUIRED. The TLS certificate for the UD server this call will connect with.
+   If this is nil, you may not contact the UD server hosted by the xx network.
+   Third-party services may vary.
+   You may use the UD server run by the xx network team by using [E2e.GetUdCertFromNdf].
+ - contactFile - REQUIRED. The data within a marshalled [contact.Contact]. This represents the
+   contact file of the server this call will connect with.
+   If this is nil, you may not contact the UD server hosted by the xx network.
+   Third-party services may vary.
+   You may use the UD server run by the xx network team by using [E2e.GetUdContactFromNdf].
+ - address - REQUIRED. The IP address of the UD server this call will connect with.
+   You may use the UD server run by the xx network team by using [E2e.GetUdAddressFromNdf].
+   If this is nil, you may not contact the UD server hosted by the xx network.
+   Third-party services may vary.
+
+Returns
+ - A Manager object which is registered to the specified UD service.
+ */
+FOUNDATION_EXPORT BindingsUserDiscovery* _Nullable BindingsNewOrLoadUd(long e2eID, id<BindingsUdNetworkStatus> _Nullable follower, NSString* _Nullable username, NSData* _Nullable registrationValidationSignature, NSData* _Nullable cert, NSData* _Nullable contactFile, NSString* _Nullable address, NSError* _Nullable* _Nullable error);
+
+/**
+ * NewUdManagerFromBackup builds a new user discover manager from a backup. It
+will construct a manager that is already registered and restore already
+registered facts into store.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - follower - network follower func wrapped in UdNetworkStatus
+ - username - The username this user registered with initially. This should
+              not be nullable, and be JSON marshalled as retrieved from
+              UserDiscovery.GetFacts().
+ - emailFactJson - nullable JSON marshalled email [fact.Fact]
+ - phoneFactJson - nullable JSON marshalled phone [fact.Fact]
+ - cert - the TLS certificate for the UD server this call will connect with.
+   You may use the UD server run by the xx network team by using
+   E2e.GetUdCertFromNdf.
+ - contactFile - the data within a marshalled contact.Contact. This
+   represents the contact file of the server this call will connect with. You
+   may use the UD server run by the xx network team by using
+   E2e.GetUdContactFromNdf.
+ - address - the IP address of the UD server this call will connect with. You
+   may use the UD server run by the xx network team by using
+   E2e.GetUdAddressFromNdf.
+ */
+FOUNDATION_EXPORT BindingsUserDiscovery* _Nullable BindingsNewUdManagerFromBackup(long e2eID, id<BindingsUdNetworkStatus> _Nullable follower, NSData* _Nullable usernameJson, NSData* _Nullable emailFactJson, NSData* _Nullable phoneFactJson, NSData* _Nullable cert, NSData* _Nullable contactFile, NSString* _Nullable address, NSError* _Nullable* _Nullable error);
+
+/**
+ * RegisterForNotifications allows a client to register for push notifications.
+The token is a firebase messaging token.
+
+Parameters:
+ - e2eId - ID of the E2E object in the E2E tracker
+ */
+FOUNDATION_EXPORT BOOL BindingsRegisterForNotifications(long e2eId, NSString* _Nullable token, NSError* _Nullable* _Nullable error);
+
+/**
+ * RegisterLogWriter registers a callback on which logs are written.
+ */
+FOUNDATION_EXPORT void BindingsRegisterLogWriter(id<BindingsLogWriter> _Nullable writer);
+
+/**
+ * RequestRestLike sends a restlike request to a given contact.
+
+Parameters:
+ - e2eID - ID of the e2e object in the tracker
+ - recipient - marshalled contact.Contact object
+ - request - JSON marshalled RestlikeMessage
+ - paramsJSON - JSON marshalled single.RequestParams
+
+Returns:
+ - []byte - JSON marshalled restlike.Message
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsRequestRestLike(long e2eID, NSData* _Nullable recipient, NSData* _Nullable request, NSData* _Nullable paramsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * RestlikeRequest performs a normal restlike request.
+
+Parameters:
+ - cmixId - ID of the cMix object in the tracker
+ - connectionID - ID of the connection in the tracker
+ - request - JSON marshalled RestlikeMessage
+ - e2eParamsJSON - JSON marshalled xxdk.E2EParams
+
+Returns:
+ - []byte - JSON marshalled RestlikeMessage
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsRestlikeRequest(long cmixId, long connectionID, NSData* _Nullable request, NSData* _Nullable e2eParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * RestlikeRequestAuth performs an authenticated restlike request.
+
+Parameters:
+ - cmixId - ID of the cMix object in the tracker
+ - authConnectionID - ID of the authenticated connection in the tracker
+ - request - JSON marshalled RestlikeMessage
+ - e2eParamsJSON - JSON marshalled xxdk.E2EParams
+
+Returns:
+ - []byte - JSON marshalled RestlikeMessage
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsRestlikeRequestAuth(long cmixId, long authConnectionID, NSData* _Nullable request, NSData* _Nullable e2eParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * ResumeBackup resumes the backup processes with a new callback.
+Call this function only when resuming a backup that has already been
+initialized or to replace the callback.
+To start the backup for the first time or to use a new password, use
+InitializeBackup.
+
+Parameters:
+ - e2eID - ID of the E2e object in the e2e tracker.
+ - udID - ID of the UserDiscovery object in the ud tracker.
+ - cb - the callback to be called when a backup is triggered.
+   This will replace any callback that has been passed into InitializeBackup.
+ */
+FOUNDATION_EXPORT BindingsBackup* _Nullable BindingsResumeBackup(long e2eID, long udID, id<BindingsUpdateBackupFunc> _Nullable cb, NSError* _Nullable* _Nullable error);
+
+/**
+ * SearchUD searches user discovery for the passed Facts. The searchCallback
+will return a list of contacts, each having the facts it hit against. This is
+NOT intended to be used to search for multiple users at once; that can have a
+privacy reduction. Instead, it is intended to be used to search for a user
+where multiple pieces of information is known.
+
+Parameters:
+ - e2eID - e2e object ID in the tracker
+ - udContact - the marshalled bytes of the contact.Contact for the user
+   discovery server
+ - factListJSON - the JSON marshalled bytes of [fact.FactList]
+ - singleRequestParams - the JSON marshalled bytes of single.RequestParams
+
+Returns:
+ - []byte - the JSON marshalled bytes of the SingleUseSendReport object,
+   which can be passed into Cmix.WaitForRoundResult to see if the send
+   operation succeeded.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsSearchUD(long e2eID, NSData* _Nullable udContact, id<BindingsUdSearchCallback> _Nullable cb, NSData* _Nullable factListJSON, NSData* _Nullable singleRequestParamsJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * SetFactsOnContact replaces the facts on the contact with the passed in facts
+pass in empty facts in order to clear the facts.
+
+Parameters:
+ - marshaledContact - the JSON marshalled bytes of [contact.Contact]
+ - factListJSON - the JSON marshalled bytes of [fact.FactList]
+
+Returns:
+ - []byte - marshalled bytes of the modified [contact.Contact]
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsSetFactsOnContact(NSData* _Nullable marshaledContact, NSData* _Nullable factListJSON, NSError* _Nullable* _Nullable error);
+
+/**
+ * StoreReceptionIdentity stores the given identity in Cmix storage with the
+given key. This is the ideal way to securely store identities, as the caller
+of this function is only required to store the given key separately rather
+than the keying material.
+ */
+FOUNDATION_EXPORT BOOL BindingsStoreReceptionIdentity(NSString* _Nullable key, NSData* _Nullable identity, long cmixId, NSError* _Nullable* _Nullable error);
+
+/**
+ * TransmitSingleUse transmits payload to recipient via single-use.
+
+Parameters:
+ - e2eID - ID of the e2e object in the tracker
+ - recipient - marshalled contact.Contact object
+ - tag - identifies the single-use message
+ - payload - message contents
+ - paramsJSON - JSON marshalled single.RequestParams
+ - responseCB - the callback that will be called when a response is received
+
+Returns:
+ - []byte - the JSON marshalled bytes of the SingleUseSendReport object,
+   which can be passed into WaitForRoundResult to see if the send succeeded.
+ */
+FOUNDATION_EXPORT NSData* _Nullable BindingsTransmitSingleUse(long e2eID, NSData* _Nullable recipient, NSString* _Nullable tag, NSData* _Nullable payload, NSData* _Nullable paramsJSON, id<BindingsSingleUseResponse> _Nullable responseCB, NSError* _Nullable* _Nullable error);
+
+/**
+ * UnregisterForNotifications turns off notifications for this client.
+
+Parameters:
+ - e2eId - ID of the E2E object in the E2E tracker
+ */
+FOUNDATION_EXPORT BOOL BindingsUnregisterForNotifications(long e2eId, NSError* _Nullable* _Nullable error);
+
+/**
+ * UpdateCommonErrors updates the internal error mapping database. This internal
+database maps errors returned from the backend to user-friendly error
+messages.
+
+Parameters:
+ - jsonFile - contents of a JSON file whose format conforms to the example below.
+
+Example Input:
+ {
+   "Failed to Unmarshal Conversation": "Could not retrieve conversation",
+   "Failed to unmarshal SentRequestMap": "Failed to pull up friend requests",
+   "cannot create username when network is not health": "Cannot create username, unable to connect to network",
+ }
+ */
+FOUNDATION_EXPORT BOOL BindingsUpdateCommonErrors(NSString* _Nullable jsonFile, NSError* _Nullable* _Nullable error);
+
+@class BindingsAuthCallbacks;
+
+@class BindingsBroadcastListener;
+
+@class BindingsClientError;
+
+@class BindingsFileTransferReceiveProgressCallback;
+
+@class BindingsFileTransferSentProgressCallback;
+
+@class BindingsGroupChatProcessor;
+
+@class BindingsGroupRequest;
+
+@class BindingsListener;
+
+@class BindingsLogWriter;
+
+@class BindingsMessageDeliveryCallback;
+
+@class BindingsNetworkHealthCallback;
+
+@class BindingsProcessor;
+
+@class BindingsReceiveFileCallback;
+
+@class BindingsReporterFunc;
+
+@class BindingsRestlikeCallback;
+
+@class BindingsSingleUseCallback;
+
+@class BindingsSingleUseResponse;
+
+@class BindingsStopper;
+
+@class BindingsUdLookupCallback;
+
+@class BindingsUdNetworkStatus;
+
+@class BindingsUdSearchCallback;
+
+@class BindingsUpdateBackupFunc;
+
+/**
+ * AuthCallbacks is the bindings-specific interface for auth.Callbacks methods.
+ */
+@interface BindingsAuthCallbacks : NSObject <goSeqRefInterface, BindingsAuthCallbacks> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)confirm:(NSData* _Nullable)contact receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+- (void)request:(NSData* _Nullable)contact receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+- (void)reset:(NSData* _Nullable)contact receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+@end
+
+/**
+ * BroadcastListener is the public function type bindings can use to listen for
+broadcast messages.
+
+Parameters:
+ - []byte - the JSON marshalled bytes of the BroadcastMessage object, which
+   can be passed into WaitForRoundResult to see if the broadcast succeeded.
+ */
+@interface BindingsBroadcastListener : NSObject <goSeqRefInterface, BindingsBroadcastListener> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)p0 p1:(NSError* _Nullable)p1;
+@end
+
+@interface BindingsClientError : NSObject <goSeqRefInterface, BindingsClientError> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)report:(NSString* _Nullable)source message:(NSString* _Nullable)message trace:(NSString* _Nullable)trace;
+@end
+
+/**
+ * FileTransferReceiveProgressCallback is a bindings-layer interface that is
+called with the progress of a received file.
+ */
+@interface BindingsFileTransferReceiveProgressCallback : NSObject <goSeqRefInterface, BindingsFileTransferReceiveProgressCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * Callback is called when a file part is sent or an error occurs.
+
+Parameters:
+ - payload - the JSON marshalled bytes of a Progress object.
+ - t - tracker that allows the lookup of the status of any file part
+ - err - any errors that occurred during sending
+ */
+- (void)callback:(NSData* _Nullable)payload t:(BindingsFilePartTracker* _Nullable)t err:(NSError* _Nullable)err;
+@end
+
+/**
+ * FileTransferSentProgressCallback is a bindings-layer interface that contains
+a callback that is called when the sent progress updates.
+ */
+@interface BindingsFileTransferSentProgressCallback : NSObject <goSeqRefInterface, BindingsFileTransferSentProgressCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * Callback is called when a file part is sent or an error occurs.
+
+Parameters:
+ - payload - the JSON marshalled bytes of a Progress object.
+ - t - tracker that allows the lookup of the status of any file part
+ - err - any errors that occurred during sending
+ */
+- (void)callback:(NSData* _Nullable)payload t:(BindingsFilePartTracker* _Nullable)t err:(NSError* _Nullable)err;
+@end
+
+/**
+ * GroupChatProcessor manages the handling of received group chat messages.
+ */
+@interface BindingsGroupChatProcessor : NSObject <goSeqRefInterface, BindingsGroupChatProcessor> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)process:(NSData* _Nullable)decryptedMessage msg:(NSData* _Nullable)msg receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId err:(NSError* _Nullable)err;
+- (NSString* _Nonnull)string;
+@end
+
+/**
+ * GroupRequest is a bindings-layer interface that handles a group reception.
+
+Parameters:
+ - trackedGroupId - a bindings layer Group object.
+ */
+@interface BindingsGroupRequest : NSObject <goSeqRefInterface, BindingsGroupRequest> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(BindingsGroup* _Nullable)g;
+@end
+
+/**
+ * Listener provides a callback to hear a message.
+
+An object implementing this interface can be called back when the client gets
+a message of the type that the registerer specified at registration time.
+ */
+@interface BindingsListener : NSObject <goSeqRefInterface, BindingsListener> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * Hear is called to receive a message in the UI.
+
+Parameters:
+ - item - JSON marshalled Message object
+ */
+- (void)hear:(NSData* _Nullable)item;
+/**
+ * Name returns a name; used for debugging.
+ */
+- (NSString* _Nonnull)name;
+@end
+
+@interface BindingsLogWriter : NSObject <goSeqRefInterface, BindingsLogWriter> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)log:(NSString* _Nullable)p0;
+@end
+
+/**
+ * MessageDeliveryCallback gets called on the determination if all events
+related to a message send were successful.
+
+If delivered == true, timedOut == false && roundResults != nil
+
+If delivered == false, roundResults == nil
+
+If timedOut == true, delivered == false && roundResults == nil
+ */
+@interface BindingsMessageDeliveryCallback : NSObject <goSeqRefInterface, BindingsMessageDeliveryCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)eventCallback:(BOOL)delivered timedOut:(BOOL)timedOut roundResults:(NSData* _Nullable)roundResults;
+@end
+
+/**
+ * NetworkHealthCallback contains a callback that is used to receive
+notification if network health changes.
+ */
+@interface BindingsNetworkHealthCallback : NSObject <goSeqRefInterface, BindingsNetworkHealthCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(BOOL)p0;
+@end
+
+/**
+ * Processor is the bindings-specific interface for message.Processor methods.
+ */
+@interface BindingsProcessor : NSObject <goSeqRefInterface, BindingsProcessor> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)process:(NSData* _Nullable)message receptionId:(NSData* _Nullable)receptionId ephemeralId:(int64_t)ephemeralId roundId:(int64_t)roundId;
+- (NSString* _Nonnull)string;
+@end
+
+/**
+ * ReceiveFileCallback is a bindings-layer interface that contains a callback
+that is called when a file is received.
+ */
+@interface BindingsReceiveFileCallback : NSObject <goSeqRefInterface, BindingsReceiveFileCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * Callback is called when a new file transfer is received.
+
+Parameters:
+ - payload - the JSON marshalled bytes of a ReceivedFile object.
+ - err - any errors that occurred during reception
+ */
+- (void)callback:(NSData* _Nullable)payload err:(NSError* _Nullable)err;
+@end
+
+/**
+ * ReporterFunc is a bindings-layer interface that receives info from the Event
+Manager.
+
+Parameters:
+ - payload - JSON marshalled EventReport object
+ */
+@interface BindingsReporterFunc : NSObject <goSeqRefInterface, BindingsReporterFunc> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)report:(NSData* _Nullable)payload err:(NSError* _Nullable)err;
+@end
+
+/**
+ * RestlikeCallback is the public function type bindings can use to make an
+asynchronous restlike request.
+
+Parameters:
+ - []byte - JSON marshalled restlike.Message
+ - error - an error (the results of calling json.Marshal on the message)
+ */
+@interface BindingsRestlikeCallback : NSObject <goSeqRefInterface, BindingsRestlikeCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)p0 p1:(NSError* _Nullable)p1;
+@end
+
+/**
+ * SingleUseCallback func is passed into Listen and called when messages are
+received.
+
+Parameters:
+ - callbackReport - the JSON marshalled bytes of the SingleUseCallbackReport
+   object, which can be passed into Cmix.WaitForRoundResult to see if the
+   send operation succeeded.
+ */
+@interface BindingsSingleUseCallback : NSObject <goSeqRefInterface, BindingsSingleUseCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)callbackReport err:(NSError* _Nullable)err;
+@end
+
+/**
+ * SingleUseResponse is the public facing callback function passed by bindings
+clients into TransmitSingleUse.
+
+Parameters:
+ - callbackReport - the JSON marshalled bytes of the SingleUseResponseReport
+   object, which can be passed into Cmix.WaitForRoundResult to see if the
+   send operation succeeded.
+ */
+@interface BindingsSingleUseResponse : NSObject <goSeqRefInterface, BindingsSingleUseResponse> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)responseReport err:(NSError* _Nullable)err;
+@end
+
+/**
+ * Stopper is a public interface returned by Listen, allowing users to stop the
+registered listener.
+ */
+@interface BindingsStopper : NSObject <goSeqRefInterface, BindingsStopper> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)stop;
+@end
+
+/**
+ * UdLookupCallback contains the callback called by LookupUD that returns the
+contact that matches the passed in ID.
+
+Parameters:
+ - contactBytes - the marshalled bytes of contact.Contact returned from the
+   lookup, or nil if an error occurs
+ - err - any errors that occurred in the lookup
+ */
+@interface BindingsUdLookupCallback : NSObject <goSeqRefInterface, BindingsUdLookupCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)contactBytes err:(NSError* _Nullable)err;
+@end
+
+/**
+ * UdNetworkStatus contains the UdNetworkStatus, which is a bindings-level
+interface for ud.udNetworkStatus.
+ */
+@interface BindingsUdNetworkStatus : NSObject <goSeqRefInterface, BindingsUdNetworkStatus> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * UdNetworkStatus returns:
+- int - a xxdk.Status int
+ */
+- (long)udNetworkStatus;
+@end
+
+/**
+ * UdSearchCallback contains the callback called by SearchUD that returns a list
+of contact.Contact objects  that match the list of facts passed into
+SearchUD.
+
+Parameters:
+ - contactListJSON - the JSON marshalled bytes of []contact.Contact, or nil
+   if an error occurs.
+
+  JSON Example:
+  {
+ 	"<xxc(2)F8dL9EC6gy+RMJuk3R+Au6eGExo02Wfio5cacjBcJRwDEgB7Ugdw/BAr6RkCABkWAFV1c2VybmFtZTA7c4LzV05sG+DMt+rFB0NIJg==xxc>",
+ 	"<xxc(2)eMhAi/pYkW5jCmvKE5ZaTglQb+fTo1D8NxVitr5CCFADEgB7Ugdw/BAr6RoCABkWAFV1c2VybmFtZTE7fElAa7z3IcrYrrkwNjMS2w==xxc>",
+ 	"<xxc(2)d7RJTu61Vy1lDThDMn8rYIiKSe1uXA/RCvvcIhq5Yg4DEgB7Ugdw/BAr6RsCABkWAFV1c2VybmFtZTI7N3XWrxIUpR29atpFMkcR6A==xxc>"
+	}
+ - err - any errors that occurred in the search.
+ */
+@interface BindingsUdSearchCallback : NSObject <goSeqRefInterface, BindingsUdSearchCallback> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)callback:(NSData* _Nullable)contactListJSON err:(NSError* _Nullable)err;
+@end
+
+/**
+ * UpdateBackupFunc contains a function callback that returns new backups.
+ */
+@interface BindingsUpdateBackupFunc : NSObject <goSeqRefInterface, BindingsUpdateBackupFunc> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (void)updateBackup:(NSData* _Nullable)encryptedBackup;
+@end
+
+#endif
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Universe.objc.h b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Universe.objc.h
new file mode 100644
index 0000000000000000000000000000000000000000..019e7502d581983722a15bf30799e85cbc5dd766
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/Universe.objc.h
@@ -0,0 +1,29 @@
+// Objective-C API for talking to  Go package.
+//   gobind -lang=objc 
+//
+// File is generated by gobind. Do not edit.
+
+#ifndef __Universe_H__
+#define __Universe_H__
+
+@import Foundation;
+#include "ref.h"
+
+@protocol Universeerror;
+@class Universeerror;
+
+@protocol Universeerror <NSObject>
+- (NSString* _Nonnull)error;
+@end
+
+@class Universeerror;
+
+@interface Universeerror : NSError <goSeqRefInterface, Universeerror> {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (NSString* _Nonnull)error;
+@end
+
+#endif
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/ref.h b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/ref.h
new file mode 100644
index 0000000000000000000000000000000000000000..b8036a4d85c7387f3def61473a071b5d8c4c8208
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Headers/ref.h
@@ -0,0 +1,35 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#ifndef __GO_REF_HDR__
+#define __GO_REF_HDR__
+
+#include <Foundation/Foundation.h>
+
+// GoSeqRef is an object tagged with an integer for passing back and
+// forth across the language boundary. A GoSeqRef may represent either
+// an instance of a Go object, or an Objective-C object passed to Go.
+// The explicit allocation of a GoSeqRef is used to pin a Go object
+// when it is passed to Objective-C. The Go seq package maintains a
+// reference to the Go object in a map keyed by the refnum along with
+// a reference count. When the reference count reaches zero, the Go
+// seq package will clear the corresponding entry in the map.
+@interface GoSeqRef : NSObject {
+}
+@property(readonly) int32_t refnum;
+@property(strong) id obj; // NULL when representing a Go object.
+
+// new GoSeqRef object to proxy a Go object. The refnum must be
+// provided from Go side.
+- (instancetype)initWithRefnum:(int32_t)refnum obj:(id)obj;
+
+- (int32_t)incNum;
+
+@end
+
+@protocol goSeqRefInterface
+-(GoSeqRef*) _ref;
+@end
+
+#endif
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Modules/module.modulemap b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Modules/module.modulemap
new file mode 100644
index 0000000000000000000000000000000000000000..4316a5b24058edfc18ffb2dc7f7a982e8353441a
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Modules/module.modulemap
@@ -0,0 +1,8 @@
+framework module "Bindings" {
+	header "ref.h"
+    header "Bindings.objc.h"
+    header "Universe.objc.h"
+    header "Bindings.h"
+
+    export *
+}
\ No newline at end of file
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Resources/Info.plist b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Resources/Info.plist
new file mode 100644
index 0000000000000000000000000000000000000000..0d1a4b8ab9b1fc8e9357197398f73353470cb636
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/A/Resources/Info.plist
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+    <plist version="1.0">
+      <dict>
+      </dict>
+    </plist>
diff --git a/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/Current b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/Current
new file mode 120000
index 0000000000000000000000000000000000000000..8c7e5a667f1b771847fe88c01c3de34413a1b220
--- /dev/null
+++ b/Frameworks/Bindings.xcframework/macos-arm64_x86_64/Bindings.framework/Versions/Current
@@ -0,0 +1 @@
+A
\ No newline at end of file
diff --git a/Package.swift b/Package.swift
index 342399b818b42e70e9556a3ef7b23b9466484478..30e5c604ce0c444f011056ca371ffb100c704351 100644
--- a/Package.swift
+++ b/Package.swift
@@ -17,6 +17,7 @@ let package = Package(
   defaultLocalization: "en",
   platforms: [
     .iOS(.v14),
+    .macOS(.v12),
   ],
   products: [
     .library(name: "XXClient", targets: ["XXClient"]),
diff --git a/README.md b/README.md
index a6f30248b2545b148158e9aba4eda7ea50dc0515..78d7e034d8833ace12c5c2959ee138baa5f1ada5 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Elixxir dApps Swift SDK
 
 ![Swift 5.6](https://img.shields.io/badge/swift-5.6-orange.svg)
-![platform iOS](https://img.shields.io/badge/platform-iOS-blue.svg)
+![platform iOS, macOS](https://img.shields.io/badge/platform-iOS,_macOS-blue.svg)
 
 ## 📖 Documentation 
 
@@ -14,7 +14,7 @@ Check out included [examples](Examples).
 
 ## 🛠 Development
 
-Open `Package.swift` in Xcode (≥13.4).
+Open `Package.swift` in Xcode (≥13.4.1).
 
 ### Project structure
 
diff --git a/build-bindings.sh b/build-bindings.sh
index 9d5bde8be9abdcbc6126b1464148d76b8b5e4e5c..9e1b6cd1909ddf471583e4610e013a7bd634ce44 100755
--- a/build-bindings.sh
+++ b/build-bindings.sh
@@ -9,7 +9,7 @@ temp_dir="$(dirname $(realpath $0))/.build-bindings"
 client_git_url="https://gitlab.com/elixxir/client.git"
 client_git_dir="$temp_dir/client"
 client_git_commit="$1"
-framework_target="ios"
+framework_target="ios,iossimulator,macos"
 frameworks_dir="$(dirname $(realpath $0))/Frameworks"
 
 #=======================================
diff --git a/run-tests.sh b/run-tests.sh
index 5e029cdc237524c958ef1f7b259d0e6a66b3c808..1f9d60c4075a3a06dd1bce6e6f0fb82fc647530a 100755
--- a/run-tests.sh
+++ b/run-tests.sh
@@ -4,12 +4,17 @@ set -e
 echo "\n\033[1;32mâ–¶ Xcode version\033[0m"
 xcodebuild -version
 
-if [ ! -n "$1" ]; then
+if [ "$1" = "macos" ]; then
+
+  echo "\n\033[1;32mâ–¶ Running package tests on macOS...\033[0m"
+  set -o pipefail && swift test 2>&1 | ./xcbeautify
+
+elif [ "$1" = "ios" ]; then
 
   echo "\n\033[1;32mâ–¶ Running package tests on iOS Simulator...\033[0m"
   set -o pipefail && xcodebuild -scheme 'elixxir-dapps-sdk-swift-Package' -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=15.5,name=iPhone 13' test | ./xcbeautify
 
-elif [ "$1" = "examples" ]; then
+elif [ "$1" = "examples-ios" ]; then
 
   echo "\n\033[1;32mâ–¶ Running XXMessenger example tests on iOS Simulator...\033[0m"
   set -o pipefail && xcodebuild -workspace 'Examples/xx-messenger/XXMessenger.xcworkspace' -scheme 'XXMessenger' -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=15.5,name=iPhone 13' test | ./xcbeautify
@@ -17,8 +22,9 @@ elif [ "$1" = "examples" ]; then
 else
 
   echo "\n\033[1;31mâ–¶ Invalid option.\033[0m Usage:"
-  echo "  run-tests.sh          - Run package tests"
-  echo "  run-tests.sh examples - Run examples tests"
+  echo "  run-tests.sh macos        - Run package tests on macOS"
+  echo "  run-tests.sh ios          - Run package tests on iOS Simulator"
+  echo "  run-tests.sh examples-ios - Run iOS examples tests"
   exit 1
 
 fi