diff --git a/library/src/androidTest/java/org/xmtp/android/library/SmartContractWalletTest.kt b/library/src/androidTest/java/org/xmtp/android/library/SmartContractWalletTest.kt index a65d38108..543ce54b1 100644 --- a/library/src/androidTest/java/org/xmtp/android/library/SmartContractWalletTest.kt +++ b/library/src/androidTest/java/org/xmtp/android/library/SmartContractWalletTest.kt @@ -2,43 +2,277 @@ package org.xmtp.android.library import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals +import org.junit.BeforeClass import org.junit.Test import org.junit.runner.RunWith +import org.xmtp.android.library.messages.MessageDeliveryStatus +import org.xmtp.android.library.messages.PrivateKey +import org.xmtp.android.library.messages.PrivateKeyBuilder +import org.xmtp.android.library.messages.walletAddress @RunWith(AndroidJUnit4::class) class SmartContractWalletTest { - @Test - fun testCanCreateASCW() { - val key = byteArrayOf( - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F - ) - val context = InstrumentationRegistry.getInstrumentation().targetContext - val davonSCW = FakeSCWWallet.generate() - val options = ClientOptions( - ClientOptions.Api(XMTPEnvironment.LOCAL, false), - enableV3 = true, - appContext = context, - dbEncryptionKey = key - ) - val davonSCWClient = runBlocking { - Client().createV3( - account = davonSCW, - options = options + companion object { + private lateinit var davonSCW: FakeSCWWallet + private lateinit var davonSCWClient: Client + private lateinit var eriSCW: FakeSCWWallet + private lateinit var eriSCWClient: Client + private lateinit var options: ClientOptions + private lateinit var boV3Wallet: PrivateKeyBuilder + private lateinit var boV3: PrivateKey + private lateinit var boV3Client: Client + + @BeforeClass + @JvmStatic + fun setUpClass() { + val key = byteArrayOf( + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F + ) + val context = InstrumentationRegistry.getInstrumentation().targetContext + options = ClientOptions( + ClientOptions.Api(XMTPEnvironment.LOCAL, false), + enableV3 = true, + appContext = context, + dbEncryptionKey = key ) + + // EOA + boV3Wallet = PrivateKeyBuilder() + boV3 = boV3Wallet.getPrivateKey() + boV3Client = runBlocking { + Client().createV3( + account = boV3Wallet, + options = options + ) + } + + // SCW + davonSCW = FakeSCWWallet.generate(ANVIL_TEST_PRIVATE_KEY_1) + davonSCWClient = runBlocking { + Client().createV3( + account = davonSCW, + options = options + ) + } + + // SCW + eriSCW = FakeSCWWallet.generate(ANVIL_TEST_PRIVATE_KEY_2) + eriSCWClient = runBlocking { + Client().createV3( + account = eriSCW, + options = options + ) + } } + } + + @Test + fun testCanBuildASCW() { val davonSCWClient2 = runBlocking { Client().buildV3( address = davonSCW.address, - chainId = davonSCW.chainId, options = options ) } assertEquals(davonSCWClient.inboxId, davonSCWClient2.inboxId) } + + @Test + fun testsCanCreateGroup() { + val group1 = runBlocking { + boV3Client.conversations.newGroup( + listOf( + davonSCW.walletAddress, + eriSCW.walletAddress + ) + ) + } + val group2 = runBlocking { + davonSCWClient.conversations.newGroup( + listOf( + boV3.walletAddress, + eriSCW.walletAddress + ) + ) + } + + assertEquals( + runBlocking { group1.members().map { it.inboxId }.sorted() }, + listOf(davonSCWClient.inboxId, boV3Client.inboxId, eriSCWClient.inboxId).sorted() + ) + assertEquals( + runBlocking { group2.members().map { it.addresses.first() }.sorted() }, + listOf(davonSCWClient.address, boV3Client.address, eriSCWClient.address).sorted() + ) + } + + @Test + fun testsCanSendMessages() { + val boGroup = runBlocking { + boV3Client.conversations.newGroup( + listOf( + davonSCW.walletAddress, + eriSCW.walletAddress + ) + ) + } + runBlocking { boGroup.send("howdy") } + val messageId = runBlocking { boGroup.send("gm") } + runBlocking { boGroup.sync() } + assertEquals(boGroup.messages().first().body, "gm") + assertEquals(boGroup.messages().first().id, messageId) + assertEquals(boGroup.messages().first().deliveryStatus, MessageDeliveryStatus.PUBLISHED) + assertEquals(boGroup.messages().size, 3) + + runBlocking { davonSCWClient.conversations.syncGroups() } + val davonGroup = runBlocking { davonSCWClient.conversations.listGroups().last() } + runBlocking { davonGroup.sync() } + assertEquals(davonGroup.messages().size, 2) + assertEquals(davonGroup.messages().first().body, "gm") + runBlocking { davonGroup.send("from davon") } + + runBlocking { eriSCWClient.conversations.syncGroups() } + val eriGroup = runBlocking { davonSCWClient.findGroup(davonGroup.id) } + runBlocking { eriGroup?.sync() } + assertEquals(eriGroup?.messages()?.size, 3) + assertEquals(eriGroup?.messages()?.first()?.body, "from davon") + runBlocking { eriGroup?.send("from eri") } + } + + @Test + fun testGroupConsent() { + runBlocking { + val davonGroup = runBlocking { + davonSCWClient.conversations.newGroup( + listOf( + boV3.walletAddress, + eriSCW.walletAddress + ) + ) + } + assert(davonSCWClient.contacts.isGroupAllowed(davonGroup.id)) + assertEquals(davonGroup.consentState(), ConsentState.ALLOWED) + + davonSCWClient.contacts.denyGroups(listOf(davonGroup.id)) + assert(davonSCWClient.contacts.isGroupDenied(davonGroup.id)) + assertEquals(davonGroup.consentState(), ConsentState.DENIED) + + davonGroup.updateConsentState(ConsentState.ALLOWED) + assert(davonSCWClient.contacts.isGroupAllowed(davonGroup.id)) + assertEquals(davonGroup.consentState(), ConsentState.ALLOWED) + } + } + + @Test + fun testCanAllowAndDenyInboxId() { + runBlocking { + val davonGroup = runBlocking { + davonSCWClient.conversations.newGroup( + listOf( + boV3.walletAddress, + eriSCW.walletAddress + ) + ) + } + assert(!davonSCWClient.contacts.isInboxAllowed(boV3Client.inboxId)) + assert(!davonSCWClient.contacts.isInboxDenied(boV3Client.inboxId)) + + davonSCWClient.contacts.allowInboxes(listOf(boV3Client.inboxId)) + var caroMember = davonGroup.members().firstOrNull { it.inboxId == boV3Client.inboxId } + assertEquals(caroMember!!.consentState, ConsentState.ALLOWED) + + assert(davonSCWClient.contacts.isInboxAllowed(boV3Client.inboxId)) + assert(!davonSCWClient.contacts.isInboxDenied(boV3Client.inboxId)) + assert(davonSCWClient.contacts.isAllowed(boV3Client.address)) + assert(!davonSCWClient.contacts.isDenied(boV3Client.address)) + + davonSCWClient.contacts.denyInboxes(listOf(boV3Client.inboxId)) + caroMember = davonGroup.members().firstOrNull { it.inboxId == boV3Client.inboxId } + assertEquals(caroMember!!.consentState, ConsentState.DENIED) + + assert(!davonSCWClient.contacts.isInboxAllowed(boV3Client.inboxId)) + assert(davonSCWClient.contacts.isInboxDenied(boV3Client.inboxId)) + + davonSCWClient.contacts.allow(listOf(eriSCWClient.address)) + assert(davonSCWClient.contacts.isAllowed(eriSCWClient.address)) + assert(!davonSCWClient.contacts.isDenied(eriSCWClient.address)) + assert(davonSCWClient.contacts.isInboxAllowed(eriSCWClient.inboxId)) + assert(!davonSCWClient.contacts.isInboxDenied(eriSCWClient.inboxId)) + } + } + + @Test + fun testCanStreamAllMessages() { + val group = runBlocking { + davonSCWClient.conversations.newGroup( + listOf( + boV3.walletAddress, + eriSCW.walletAddress + ) + ) + } + val group2 = runBlocking { + boV3Client.conversations.newGroup( + listOf( + davonSCW.walletAddress, + eriSCW.walletAddress + ) + ) + } + runBlocking { davonSCWClient.conversations.syncGroups() } + + val allMessages = mutableListOf() + + val job = CoroutineScope(Dispatchers.IO).launch { + try { + davonSCWClient.conversations.streamAllGroupMessages() + .collect { message -> + allMessages.add(message) + } + } catch (e: Exception) { + } + } + Thread.sleep(1000) + runBlocking { + group.send("hi") + group2.send("hi") + } + Thread.sleep(1000) + assertEquals(2, allMessages.size) + job.cancel() + } + + @Test + fun testCanStreamGroups() { + val allMessages = mutableListOf() + + val job = CoroutineScope(Dispatchers.IO).launch { + try { + davonSCWClient.conversations.streamGroups() + .collect { message -> + allMessages.add(message.topic) + } + } catch (e: Exception) { + } + } + Thread.sleep(1000) + + runBlocking { + eriSCWClient.conversations.newGroup(listOf(boV3.walletAddress, davonSCW.walletAddress)) + boV3Client.conversations.newGroup(listOf(eriSCW.walletAddress, davonSCW.walletAddress)) + } + + Thread.sleep(1000) + assertEquals(2, allMessages.size) + job.cancel() + } } diff --git a/library/src/androidTest/java/org/xmtp/android/library/TestHelpers.kt b/library/src/androidTest/java/org/xmtp/android/library/TestHelpers.kt index b9915d0a8..4d2453fe3 100644 --- a/library/src/androidTest/java/org/xmtp/android/library/TestHelpers.kt +++ b/library/src/androidTest/java/org/xmtp/android/library/TestHelpers.kt @@ -54,14 +54,15 @@ class FakeWallet : SigningKey { get() = privateKey.walletAddress } -private const val ANVIL_TEST_PRIVATE_KEY = +const val ANVIL_TEST_PRIVATE_KEY_1 = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" +const val ANVIL_TEST_PRIVATE_KEY_2 = + "59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" private const val ANVIL_TEST_PORT = "http://10.0.2.2:8545" class FakeSCWWallet : SigningKey { - private var web3j: Web3j = Web3j.build(HttpService(ANVIL_TEST_PORT)) - private val contractDeployerCredentials: Credentials = - Credentials.create(ANVIL_TEST_PRIVATE_KEY) + private val web3j: Web3j = Web3j.build(HttpService(ANVIL_TEST_PORT)) + private var contractDeployerCredentials: Credentials? = null var walletAddress: String = "" override val address: String @@ -73,8 +74,9 @@ class FakeSCWWallet : SigningKey { override var chainId: Long? = 31337L companion object { - fun generate(): FakeSCWWallet { + fun generate(privateKey: String): FakeSCWWallet { return FakeSCWWallet().apply { + contractDeployerCredentials = Credentials.create(privateKey) createSmartContractWallet() } } @@ -91,7 +93,7 @@ class FakeSCWWallet : SigningKey { val replaySafeHash = smartWallet.replaySafeHash(digest).send() val signature = - Sign.signMessage(replaySafeHash, contractDeployerCredentials.ecKeyPair, false) + Sign.signMessage(replaySafeHash, contractDeployerCredentials!!.ecKeyPair, false) val signatureBytes = signature.r + signature.s + signature.v val tokens = listOf( Uint(BigInteger.ZERO), @@ -119,7 +121,13 @@ class FakeSCWWallet : SigningKey { ).send() val ownerAddress = ByteArray(32) { 0 }.apply { - System.arraycopy(contractDeployerCredentials.address.hexToByteArray(), 0, this, 12, 20) + System.arraycopy( + contractDeployerCredentials!!.address.hexToByteArray(), + 0, + this, + 12, + 20 + ) } val owners = listOf(ownerAddress) val nonce = BigInteger.ZERO diff --git a/library/src/main/java/libxmtp-version.txt b/library/src/main/java/libxmtp-version.txt index f78cf02bd..d33483415 100644 --- a/library/src/main/java/libxmtp-version.txt +++ b/library/src/main/java/libxmtp-version.txt @@ -1,3 +1,3 @@ -Version: 6937f233 -Branch: np/fix-ffi-bindings -Date: 2024-10-16 17:50:35 +0000 +Version: 9331eb7d +Branch: main +Date: 2024-10-23 16:57:08 +0000 diff --git a/library/src/main/java/org/xmtp/android/library/Client.kt b/library/src/main/java/org/xmtp/android/library/Client.kt index 6d641b9d4..46f1cb51c 100644 --- a/library/src/main/java/org/xmtp/android/library/Client.kt +++ b/library/src/main/java/org/xmtp/android/library/Client.kt @@ -324,8 +324,7 @@ class Client() { ): Client { this.hasV2Client = false val clientOptions = options ?: ClientOptions(enableV3 = true) - val accountAddress = - if (account.chainId != null) "eip155:${account.chainId}:${account.address.lowercase()}" else account.address.lowercase() + val accountAddress = account.address.lowercase() return try { initializeV3Client(accountAddress, clientOptions, account) } catch (e: Exception) { @@ -336,13 +335,11 @@ class Client() { // Function to build a V3 client without a signing key (using only address (& chainId for SCW)) suspend fun buildV3( address: String, - chainId: Long? = null, options: ClientOptions? = null, ): Client { this.hasV2Client = false val clientOptions = options ?: ClientOptions(enableV3 = true) - val accountAddress = - if (chainId != null) "eip155:$chainId:${address.lowercase()}" else address.lowercase() + val accountAddress = address.lowercase() return try { initializeV3Client(accountAddress, clientOptions) } catch (e: Exception) { diff --git a/library/src/main/java/org/xmtp/android/library/Group.kt b/library/src/main/java/org/xmtp/android/library/Group.kt index 0fa3bfb35..13ce23b58 100644 --- a/library/src/main/java/org/xmtp/android/library/Group.kt +++ b/library/src/main/java/org/xmtp/android/library/Group.kt @@ -12,10 +12,12 @@ import org.xmtp.android.library.messages.DecryptedMessage import org.xmtp.android.library.messages.MessageDeliveryStatus import org.xmtp.android.library.messages.PagingInfoSortDirection import org.xmtp.android.library.messages.Topic -import org.xmtp.proto.message.api.v1.MessageApiOuterClass -import uniffi.xmtpv3.FfiDeliveryStatus +import org.xmtp.proto.message.api.v1.MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING +import org.xmtp.proto.message.api.v1.MessageApiOuterClass.SortDirection.SORT_DIRECTION_DESCENDING import uniffi.xmtpv3.FfiConversation import uniffi.xmtpv3.FfiConversationMetadata +import uniffi.xmtpv3.FfiDeliveryStatus +import uniffi.xmtpv3.FfiDirection import uniffi.xmtpv3.FfiGroupPermissions import uniffi.xmtpv3.FfiListMessagesOptions import uniffi.xmtpv3.FfiMessage @@ -119,10 +121,10 @@ class Group(val client: Client, private val libXMTPGroup: FfiConversation) { limit: Int? = null, before: Date? = null, after: Date? = null, - direction: PagingInfoSortDirection = MessageApiOuterClass.SortDirection.SORT_DIRECTION_DESCENDING, + direction: PagingInfoSortDirection = SORT_DIRECTION_DESCENDING, deliveryStatus: MessageDeliveryStatus = MessageDeliveryStatus.ALL, ): List { - val messages = libXMTPGroup.findMessages( + return libXMTPGroup.findMessages( opts = FfiListMessagesOptions( sentBeforeNs = before?.time?.nanoseconds?.toLong(DurationUnit.NANOSECONDS), sentAfterNs = after?.time?.nanoseconds?.toLong(DurationUnit.NANOSECONDS), @@ -132,26 +134,25 @@ class Group(val client: Client, private val libXMTPGroup: FfiConversation) { MessageDeliveryStatus.UNPUBLISHED -> FfiDeliveryStatus.UNPUBLISHED MessageDeliveryStatus.FAILED -> FfiDeliveryStatus.FAILED else -> null + }, + direction = when (direction) { + SORT_DIRECTION_ASCENDING -> FfiDirection.ASCENDING + else -> FfiDirection.DESCENDING } ) ).mapNotNull { MessageV3(client, it).decodeOrNull() } - - return when (direction) { - MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING -> messages - else -> messages.reversed() - } } fun decryptedMessages( limit: Int? = null, before: Date? = null, after: Date? = null, - direction: PagingInfoSortDirection = MessageApiOuterClass.SortDirection.SORT_DIRECTION_DESCENDING, + direction: PagingInfoSortDirection = SORT_DIRECTION_DESCENDING, deliveryStatus: MessageDeliveryStatus = MessageDeliveryStatus.ALL, ): List { - val messages = libXMTPGroup.findMessages( + return libXMTPGroup.findMessages( opts = FfiListMessagesOptions( sentBeforeNs = before?.time?.nanoseconds?.toLong(DurationUnit.NANOSECONDS), sentAfterNs = after?.time?.nanoseconds?.toLong(DurationUnit.NANOSECONDS), @@ -161,16 +162,15 @@ class Group(val client: Client, private val libXMTPGroup: FfiConversation) { MessageDeliveryStatus.UNPUBLISHED -> FfiDeliveryStatus.UNPUBLISHED MessageDeliveryStatus.FAILED -> FfiDeliveryStatus.FAILED else -> null + }, + direction = when (direction) { + SORT_DIRECTION_ASCENDING -> FfiDirection.ASCENDING + else -> FfiDirection.DESCENDING } ) ).mapNotNull { MessageV3(client, it).decryptOrNull() } - - return when (direction) { - MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING -> messages - else -> messages.reversed() - } } suspend fun processMessage(envelopeBytes: ByteArray): MessageV3 { diff --git a/library/src/main/java/xmtpv3.kt b/library/src/main/java/xmtpv3.kt index 9d67779b1..b57fba8e2 100644 --- a/library/src/main/java/xmtpv3.kt +++ b/library/src/main/java/xmtpv3.kt @@ -43,6 +43,9 @@ import kotlinx.coroutines.suspendCancellableCoroutine // A rust-owned buffer is represented by its capacity, its current length, and a // pointer to the underlying data. +/** + * @suppress + */ @Structure.FieldOrder("capacity", "len", "data") open class RustBuffer : Structure() { // Note: `capacity` and `len` are actually `ULong` values, but JVM only supports signed values. @@ -98,6 +101,8 @@ open class RustBuffer : Structure() { * Required for callbacks taking in an out pointer. * * Size is the sum of all values in the struct. + * + * @suppress */ class RustBufferByReference : ByReference(16) { /** @@ -132,7 +137,7 @@ class RustBufferByReference : ByReference(16) { // completeness. @Structure.FieldOrder("len", "data") -open class ForeignBytes : Structure() { +internal open class ForeignBytes : Structure() { @JvmField var len: Int = 0 @JvmField @@ -141,10 +146,14 @@ open class ForeignBytes : Structure() { class ByValue : ForeignBytes(), Structure.ByValue } -// The FfiConverter interface handles converter types to and from the FFI -// -// All implementing objects should be public to support external types. When a -// type is external we need to import it's FfiConverter. +/** + * The FfiConverter interface handles converter types to and from the FFI + * + * All implementing objects should be public to support external types. When a + * type is external we need to import it's FfiConverter. + * + * @suppress + */ public interface FfiConverter { // Convert an FFI type to a Kotlin type fun lift(value: FfiType): KotlinType @@ -207,7 +216,11 @@ public interface FfiConverter { } } -// FfiConverter that uses `RustBuffer` as the FfiType +/** + * FfiConverter that uses `RustBuffer` as the FfiType + * + * @suppress + */ public interface FfiConverterRustBuffer : FfiConverter { override fun lift(value: RustBuffer.ByValue) = liftFromRustBuffer(value) override fun lower(value: KotlinType) = lowerIntoRustBuffer(value) @@ -252,7 +265,11 @@ internal open class UniffiRustCallStatus : Structure() { class InternalException(message: String) : kotlin.Exception(message) -// Each top-level error class has a companion object that can lift the error from the call status's rust buffer +/** + * Each top-level error class has a companion object that can lift the error from the call status's rust buffer + * + * @suppress + */ interface UniffiRustCallStatusErrorHandler { fun lift(error_buf: RustBuffer.ByValue): E; } @@ -295,7 +312,11 @@ private fun uniffiCheckCallStatus( } } -// UniffiRustCallStatusErrorHandler implementation for times when we don't expect a CALL_ERROR +/** + * UniffiRustCallStatusErrorHandler implementation for times when we don't expect a CALL_ERROR + * + * @suppress + */ object UniffiNullRustCallStatusErrorHandler : UniffiRustCallStatusErrorHandler { override fun lift(error_buf: RustBuffer.ByValue): InternalException { RustBuffer.free(error_buf) @@ -1167,6 +1188,10 @@ internal interface UniffiLib : Library { `ptr`: Pointer, uniffi_out_err: UniffiRustCallStatus, ): Byte + fun uniffi_xmtpv3_fn_method_ffistreamcloser_wait_for_ready( + `ptr`: Pointer, + ): Long + fun uniffi_xmtpv3_fn_clone_ffiv2apiclient( `ptr`: Pointer, uniffi_out_err: UniffiRustCallStatus, ): Pointer @@ -1888,6 +1913,9 @@ internal interface UniffiLib : Library { fun uniffi_xmtpv3_checksum_method_ffistreamcloser_is_closed( ): Short + fun uniffi_xmtpv3_checksum_method_ffistreamcloser_wait_for_ready( + ): Short + fun uniffi_xmtpv3_checksum_method_ffiv2apiclient_batch_query( ): Short @@ -2250,6 +2278,9 @@ private fun uniffiCheckApiChecksums(lib: UniffiLib) { if (lib.uniffi_xmtpv3_checksum_method_ffistreamcloser_is_closed() != 62423.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_xmtpv3_checksum_method_ffistreamcloser_wait_for_ready() != 38545.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_xmtpv3_checksum_method_ffiv2apiclient_batch_query() != 26551.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -2424,6 +2455,9 @@ interface Disposable { } } +/** + * @suppress + */ inline fun T.use(block: (T) -> R) = try { block(this) @@ -2436,9 +2470,16 @@ inline fun T.use(block: (T) -> R) = } } -/** Used to instantiate an interface without an actual pointer, for fakes in tests, mostly. */ +/** + * Used to instantiate an interface without an actual pointer, for fakes in tests, mostly. + * + * @suppress + * */ object NoPointer +/** + * @suppress + */ public object FfiConverterUByte : FfiConverter { override fun lift(value: Byte): UByte { return value.toUByte() @@ -2459,6 +2500,9 @@ public object FfiConverterUByte : FfiConverter { } } +/** + * @suppress + */ public object FfiConverterUInt : FfiConverter { override fun lift(value: Int): UInt { return value.toUInt() @@ -2479,6 +2523,9 @@ public object FfiConverterUInt : FfiConverter { } } +/** + * @suppress + */ public object FfiConverterULong : FfiConverter { override fun lift(value: Long): ULong { return value.toULong() @@ -2499,6 +2546,9 @@ public object FfiConverterULong : FfiConverter { } } +/** + * @suppress + */ public object FfiConverterLong : FfiConverter { override fun lift(value: Long): Long { return value @@ -2519,6 +2569,9 @@ public object FfiConverterLong : FfiConverter { } } +/** + * @suppress + */ public object FfiConverterBoolean : FfiConverter { override fun lift(value: Byte): Boolean { return value.toInt() != 0 @@ -2539,6 +2592,9 @@ public object FfiConverterBoolean : FfiConverter { } } +/** + * @suppress + */ public object FfiConverterString : FfiConverter { // Note: we don't inherit from FfiConverterRustBuffer, because we use a // special encoding when lowering/lifting. We can use `RustBuffer.len` to @@ -2593,6 +2649,9 @@ public object FfiConverterString : FfiConverter { } } +/** + * @suppress + */ public object FfiConverterByteArray : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): ByteArray { val len = buf.getInt() @@ -2710,12 +2769,16 @@ public object FfiConverterByteArray : FfiConverterRustBuffer { // -// The cleaner interface for Object finalization code to run. -// This is the entry point to any implementation that we're using. -// -// The cleaner registers objects and returns cleanables, so now we are -// defining a `UniffiCleaner` with a `UniffiClenaer.Cleanable` to abstract the -// different implmentations available at compile time. +/** + * The cleaner interface for Object finalization code to run. + * This is the entry point to any implementation that we're using. + * + * The cleaner registers objects and returns cleanables, so now we are + * defining a `UniffiCleaner` with a `UniffiClenaer.Cleanable` to abstract the + * different implmentations available at compile time. + * + * @suppress + */ interface UniffiCleaner { interface Cleanable { fun clean() @@ -3826,6 +3889,9 @@ open class FfiConversation : Disposable, AutoCloseable, FfiConversationInterface } +/** + * @suppress + */ public object FfiConverterTypeFfiConversation : FfiConverter { override fun lower(value: FfiConversation): Pointer { @@ -4070,6 +4136,9 @@ open class FfiConversationMetadata : Disposable, AutoCloseable, FfiConversationM } +/** + * @suppress + */ public object FfiConverterTypeFfiConversationMetadata : FfiConverter { @@ -4764,6 +4833,9 @@ open class FfiConversations : Disposable, AutoCloseable, FfiConversationsInterfa } +/** + * @suppress + */ public object FfiConverterTypeFfiConversations : FfiConverter { override fun lower(value: FfiConversations): Pointer { @@ -5011,6 +5083,9 @@ open class FfiGroupPermissions : Disposable, AutoCloseable, FfiGroupPermissionsI } +/** + * @suppress + */ public object FfiConverterTypeFfiGroupPermissions : FfiConverter { override fun lower(value: FfiGroupPermissions): Pointer { @@ -5416,6 +5491,9 @@ open class FfiSignatureRequest : Disposable, AutoCloseable, FfiSignatureRequestI } +/** + * @suppress + */ public object FfiConverterTypeFfiSignatureRequest : FfiConverter { override fun lower(value: FfiSignatureRequest): Pointer { @@ -5555,6 +5633,8 @@ public interface FfiStreamCloserInterface { fun `isClosed`(): kotlin.Boolean + suspend fun `waitForReady`() + companion object } @@ -5702,10 +5782,45 @@ open class FfiStreamCloser : Disposable, AutoCloseable, FfiStreamCloserInterface } + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `waitForReady`() { + return uniffiRustCallAsync( + callWithPointer { thisPtr -> + UniffiLib.INSTANCE.uniffi_xmtpv3_fn_method_ffistreamcloser_wait_for_ready( + thisPtr, + + ) + }, + { future, callback, continuation -> + UniffiLib.INSTANCE.ffi_xmtpv3_rust_future_poll_void( + future, + callback, + continuation + ) + }, + { future, continuation -> + UniffiLib.INSTANCE.ffi_xmtpv3_rust_future_complete_void( + future, + continuation + ) + }, + { future -> UniffiLib.INSTANCE.ffi_xmtpv3_rust_future_free_void(future) }, + // lift function + { Unit }, + + // Error FFI converter + UniffiNullRustCallStatusErrorHandler, + ) + } + + companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiStreamCloser : FfiConverter { override fun lower(value: FfiStreamCloser): Pointer { @@ -6077,6 +6192,9 @@ open class FfiV2ApiClient : Disposable, AutoCloseable, FfiV2ApiClientInterface { } +/** + * @suppress + */ public object FfiConverterTypeFfiV2ApiClient : FfiConverter { override fun lower(value: FfiV2ApiClient): Pointer { @@ -6405,6 +6523,9 @@ open class FfiV2Subscription : Disposable, AutoCloseable, FfiV2SubscriptionInter } +/** + * @suppress + */ public object FfiConverterTypeFfiV2Subscription : FfiConverter { override fun lower(value: FfiV2Subscription): Pointer { @@ -7282,6 +7403,9 @@ open class FfiXmtpClient : Disposable, AutoCloseable, FfiXmtpClientInterface { } +/** + * @suppress + */ public object FfiConverterTypeFfiXmtpClient : FfiConverter { override fun lower(value: FfiXmtpClient): Pointer { @@ -7317,6 +7441,9 @@ data class FfiConsent( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiConsent : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiConsent { return FfiConsent( @@ -7351,6 +7478,9 @@ data class FfiConversationMember( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiConversationMember : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiConversationMember { @@ -7393,6 +7523,9 @@ data class FfiCreateGroupOptions( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiCreateGroupOptions : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiCreateGroupOptions { @@ -7434,6 +7567,9 @@ data class FfiCursor( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiCursor : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiCursor { return FfiCursor( @@ -7463,6 +7599,9 @@ data class FfiEnvelope( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiEnvelope : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiEnvelope { return FfiEnvelope( @@ -7496,6 +7635,9 @@ data class FfiInboxState( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiInboxState : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiInboxState { return FfiInboxState( @@ -7530,6 +7672,9 @@ data class FfiInstallation( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiInstallation : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiInstallation { return FfiInstallation( @@ -7559,6 +7704,9 @@ data class FfiListConversationsOptions( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiListConversationsOptions : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiListConversationsOptions { @@ -7588,11 +7736,15 @@ data class FfiListMessagesOptions( var `sentAfterNs`: kotlin.Long?, var `limit`: kotlin.Long?, var `deliveryStatus`: FfiDeliveryStatus?, + var `direction`: FfiDirection?, ) { companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiListMessagesOptions : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiListMessagesOptions { @@ -7601,6 +7753,7 @@ public object FfiConverterTypeFfiListMessagesOptions : FfiConverterOptionalLong.read(buf), FfiConverterOptionalLong.read(buf), FfiConverterOptionalTypeFfiDeliveryStatus.read(buf), + FfiConverterOptionalTypeFfiDirection.read(buf), ) } @@ -7608,7 +7761,8 @@ public object FfiConverterTypeFfiListMessagesOptions : FfiConverterOptionalLong.allocationSize(value.`sentBeforeNs`) + FfiConverterOptionalLong.allocationSize(value.`sentAfterNs`) + FfiConverterOptionalLong.allocationSize(value.`limit`) + - FfiConverterOptionalTypeFfiDeliveryStatus.allocationSize(value.`deliveryStatus`) + FfiConverterOptionalTypeFfiDeliveryStatus.allocationSize(value.`deliveryStatus`) + + FfiConverterOptionalTypeFfiDirection.allocationSize(value.`direction`) ) override fun write(value: FfiListMessagesOptions, buf: ByteBuffer) { @@ -7616,6 +7770,7 @@ public object FfiConverterTypeFfiListMessagesOptions : FfiConverterOptionalLong.write(value.`sentAfterNs`, buf) FfiConverterOptionalLong.write(value.`limit`, buf) FfiConverterOptionalTypeFfiDeliveryStatus.write(value.`deliveryStatus`, buf) + FfiConverterOptionalTypeFfiDirection.write(value.`direction`, buf) } } @@ -7633,6 +7788,9 @@ data class FfiMessage( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiMessage : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiMessage { return FfiMessage( @@ -7677,6 +7835,9 @@ data class FfiPagingInfo( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiPagingInfo : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiPagingInfo { return FfiPagingInfo( @@ -7714,6 +7875,9 @@ data class FfiPermissionPolicySet( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiPermissionPolicySet : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiPermissionPolicySet { @@ -7760,6 +7924,9 @@ data class FfiPublishRequest( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiPublishRequest : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiPublishRequest { return FfiPublishRequest( @@ -7784,6 +7951,9 @@ data class FfiV2BatchQueryRequest( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiV2BatchQueryRequest : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiV2BatchQueryRequest { @@ -7809,6 +7979,9 @@ data class FfiV2BatchQueryResponse( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiV2BatchQueryResponse : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiV2BatchQueryResponse { @@ -7837,6 +8010,9 @@ data class FfiV2QueryRequest( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiV2QueryRequest : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiV2QueryRequest { return FfiV2QueryRequest( @@ -7871,6 +8047,9 @@ data class FfiV2QueryResponse( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiV2QueryResponse : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiV2QueryResponse { return FfiV2QueryResponse( @@ -7898,6 +8077,9 @@ data class FfiV2SubscribeRequest( companion object } +/** + * @suppress + */ public object FfiConverterTypeFfiV2SubscribeRequest : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiV2SubscribeRequest { @@ -7926,6 +8108,9 @@ enum class FfiConsentEntityType { } +/** + * @suppress + */ public object FfiConverterTypeFfiConsentEntityType : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiConsentEntityType.values()[buf.getInt() - 1] @@ -7951,6 +8136,9 @@ enum class FfiConsentState { } +/** + * @suppress + */ public object FfiConverterTypeFfiConsentState : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiConsentState.values()[buf.getInt() - 1] @@ -7975,6 +8163,9 @@ enum class FfiConversationMessageKind { } +/** + * @suppress + */ public object FfiConverterTypeFfiConversationMessageKind : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { @@ -8001,6 +8192,9 @@ enum class FfiDeliveryStatus { } +/** + * @suppress + */ public object FfiConverterTypeFfiDeliveryStatus : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiDeliveryStatus.values()[buf.getInt() - 1] @@ -8016,6 +8210,33 @@ public object FfiConverterTypeFfiDeliveryStatus : FfiConverterRustBuffer { + override fun read(buf: ByteBuffer) = try { + FfiDirection.values()[buf.getInt() - 1] + } catch (e: IndexOutOfBoundsException) { + throw RuntimeException("invalid enum value, something is very wrong!!", e) + } + + override fun allocationSize(value: FfiDirection) = 4UL + + override fun write(value: FfiDirection, buf: ByteBuffer) { + buf.putInt(value.ordinal + 1) + } +} + + enum class FfiGroupPermissionsOptions { ALL_MEMBERS, @@ -8026,6 +8247,9 @@ enum class FfiGroupPermissionsOptions { } +/** + * @suppress + */ public object FfiConverterTypeFfiGroupPermissionsOptions : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { @@ -8053,6 +8277,9 @@ enum class FfiMetadataField { } +/** + * @suppress + */ public object FfiConverterTypeFfiMetadataField : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiMetadataField.values()[buf.getInt() - 1] @@ -8078,6 +8305,9 @@ enum class FfiPermissionLevel { } +/** + * @suppress + */ public object FfiConverterTypeFfiPermissionLevel : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiPermissionLevel.values()[buf.getInt() - 1] @@ -8106,6 +8336,9 @@ enum class FfiPermissionPolicy { } +/** + * @suppress + */ public object FfiConverterTypeFfiPermissionPolicy : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiPermissionPolicy.values()[buf.getInt() - 1] @@ -8133,6 +8366,9 @@ enum class FfiPermissionUpdateType { } +/** + * @suppress + */ public object FfiConverterTypeFfiPermissionUpdateType : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { @@ -8159,6 +8395,9 @@ enum class FfiSortDirection { } +/** + * @suppress + */ public object FfiConverterTypeFfiSortDirection : FfiConverterRustBuffer { override fun read(buf: ByteBuffer) = try { FfiSortDirection.values()[buf.getInt() - 1] @@ -8207,6 +8446,9 @@ sealed class GenericException(message: String) : kotlin.Exception(message) { } } +/** + * @suppress + */ public object FfiConverterTypeGenericError : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): GenericException { @@ -8310,6 +8552,9 @@ sealed class SigningException(message: String) : kotlin.Exception(message) { } } +/** + * @suppress + */ public object FfiConverterTypeSigningError : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): SigningException { @@ -8352,6 +8597,9 @@ internal const val UNIFFI_CALLBACK_SUCCESS = 0 internal const val UNIFFI_CALLBACK_ERROR = 1 internal const val UNIFFI_CALLBACK_UNEXPECTED_ERROR = 2 +/** + * @suppress + */ public abstract class FfiConverterCallbackInterface : FfiConverter { internal val handleMap = UniffiHandleMap() @@ -8413,7 +8661,11 @@ internal object uniffiCallbackInterfaceFfiConversationCallback { } } -// The ffiConverter which transforms the Callbacks in to handles to pass to Rust. +/** + * The ffiConverter which transforms the Callbacks in to handles to pass to Rust. + * + * @suppress + */ public object FfiConverterTypeFfiConversationCallback : FfiConverterCallbackInterface() @@ -8493,7 +8745,11 @@ internal object uniffiCallbackInterfaceFfiInboxOwner { } } -// The ffiConverter which transforms the Callbacks in to handles to pass to Rust. +/** + * The ffiConverter which transforms the Callbacks in to handles to pass to Rust. + * + * @suppress + */ public object FfiConverterTypeFfiInboxOwner : FfiConverterCallbackInterface() @@ -8547,7 +8803,11 @@ internal object uniffiCallbackInterfaceFfiLogger { } } -// The ffiConverter which transforms the Callbacks in to handles to pass to Rust. +/** + * The ffiConverter which transforms the Callbacks in to handles to pass to Rust. + * + * @suppress + */ public object FfiConverterTypeFfiLogger : FfiConverterCallbackInterface() @@ -8597,7 +8857,11 @@ internal object uniffiCallbackInterfaceFfiMessageCallback { } } -// The ffiConverter which transforms the Callbacks in to handles to pass to Rust. +/** + * The ffiConverter which transforms the Callbacks in to handles to pass to Rust. + * + * @suppress + */ public object FfiConverterTypeFfiMessageCallback : FfiConverterCallbackInterface() @@ -8648,11 +8912,18 @@ internal object uniffiCallbackInterfaceFfiV2SubscriptionCallback { } } -// The ffiConverter which transforms the Callbacks in to handles to pass to Rust. +/** + * The ffiConverter which transforms the Callbacks in to handles to pass to Rust. + * + * @suppress + */ public object FfiConverterTypeFfiV2SubscriptionCallback : FfiConverterCallbackInterface() +/** + * @suppress + */ public object FfiConverterOptionalULong : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): kotlin.ULong? { if (buf.get().toInt() == 0) { @@ -8680,6 +8951,9 @@ public object FfiConverterOptionalULong : FfiConverterRustBuffer } +/** + * @suppress + */ public object FfiConverterOptionalLong : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): kotlin.Long? { if (buf.get().toInt() == 0) { @@ -8707,6 +8981,9 @@ public object FfiConverterOptionalLong : FfiConverterRustBuffer { } +/** + * @suppress + */ public object FfiConverterOptionalString : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): kotlin.String? { if (buf.get().toInt() == 0) { @@ -8734,6 +9011,9 @@ public object FfiConverterOptionalString : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): kotlin.ByteArray? { if (buf.get().toInt() == 0) { @@ -8761,6 +9041,9 @@ public object FfiConverterOptionalByteArray : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiSignatureRequest? { @@ -8789,6 +9072,9 @@ public object FfiConverterOptionalTypeFfiSignatureRequest : } +/** + * @suppress + */ public object FfiConverterOptionalTypeFfiCursor : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiCursor? { if (buf.get().toInt() == 0) { @@ -8816,6 +9102,9 @@ public object FfiConverterOptionalTypeFfiCursor : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiPagingInfo? { if (buf.get().toInt() == 0) { @@ -8843,6 +9132,9 @@ public object FfiConverterOptionalTypeFfiPagingInfo : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiPermissionPolicySet? { @@ -8871,6 +9163,9 @@ public object FfiConverterOptionalTypeFfiPermissionPolicySet : } +/** + * @suppress + */ public object FfiConverterOptionalTypeFfiDeliveryStatus : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiDeliveryStatus? { @@ -8899,6 +9194,39 @@ public object FfiConverterOptionalTypeFfiDeliveryStatus : } +/** + * @suppress + */ +public object FfiConverterOptionalTypeFfiDirection : FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): FfiDirection? { + if (buf.get().toInt() == 0) { + return null + } + return FfiConverterTypeFfiDirection.read(buf) + } + + override fun allocationSize(value: FfiDirection?): ULong { + if (value == null) { + return 1UL + } else { + return 1UL + FfiConverterTypeFfiDirection.allocationSize(value) + } + } + + override fun write(value: FfiDirection?, buf: ByteBuffer) { + if (value == null) { + buf.put(0) + } else { + buf.put(1) + FfiConverterTypeFfiDirection.write(value, buf) + } + } +} + + +/** + * @suppress + */ public object FfiConverterOptionalTypeFfiGroupPermissionsOptions : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiGroupPermissionsOptions? { @@ -8927,6 +9255,9 @@ public object FfiConverterOptionalTypeFfiGroupPermissionsOptions : } +/** + * @suppress + */ public object FfiConverterOptionalTypeFfiMetadataField : FfiConverterRustBuffer { override fun read(buf: ByteBuffer): FfiMetadataField? { if (buf.get().toInt() == 0) { @@ -8954,6 +9285,9 @@ public object FfiConverterOptionalTypeFfiMetadataField : FfiConverterRustBuffer< } +/** + * @suppress + */ public object FfiConverterSequenceString : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { val len = buf.getInt() @@ -8977,6 +9311,9 @@ public object FfiConverterSequenceString : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { val len = buf.getInt() @@ -9000,6 +9337,9 @@ public object FfiConverterSequenceByteArray : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { @@ -9024,6 +9364,9 @@ public object FfiConverterSequenceTypeFfiConversation : } +/** + * @suppress + */ public object FfiConverterSequenceTypeFfiConsent : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { val len = buf.getInt() @@ -9047,6 +9390,9 @@ public object FfiConverterSequenceTypeFfiConsent : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { @@ -9072,6 +9418,9 @@ public object FfiConverterSequenceTypeFfiConversationMember : } +/** + * @suppress + */ public object FfiConverterSequenceTypeFfiEnvelope : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { val len = buf.getInt() @@ -9095,6 +9444,9 @@ public object FfiConverterSequenceTypeFfiEnvelope : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { val len = buf.getInt() @@ -9118,6 +9470,9 @@ public object FfiConverterSequenceTypeFfiInboxState : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { @@ -9142,6 +9497,9 @@ public object FfiConverterSequenceTypeFfiInstallation : } +/** + * @suppress + */ public object FfiConverterSequenceTypeFfiMessage : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { val len = buf.getInt() @@ -9165,6 +9523,9 @@ public object FfiConverterSequenceTypeFfiMessage : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { @@ -9189,6 +9550,9 @@ public object FfiConverterSequenceTypeFfiV2QueryRequest : } +/** + * @suppress + */ public object FfiConverterSequenceTypeFfiV2QueryResponse : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): List { @@ -9213,6 +9577,9 @@ public object FfiConverterSequenceTypeFfiV2QueryResponse : } +/** + * @suppress + */ public object FfiConverterMapStringBoolean : FfiConverterRustBuffer> { override fun read(buf: ByteBuffer): Map { diff --git a/library/src/main/jniLibs/arm64-v8a/libuniffi_xmtpv3.so b/library/src/main/jniLibs/arm64-v8a/libuniffi_xmtpv3.so index 18e615517..ab5496b03 100644 Binary files a/library/src/main/jniLibs/arm64-v8a/libuniffi_xmtpv3.so and b/library/src/main/jniLibs/arm64-v8a/libuniffi_xmtpv3.so differ diff --git a/library/src/main/jniLibs/armeabi-v7a/libuniffi_xmtpv3.so b/library/src/main/jniLibs/armeabi-v7a/libuniffi_xmtpv3.so index 799afc983..26d4c90c3 100644 Binary files a/library/src/main/jniLibs/armeabi-v7a/libuniffi_xmtpv3.so and b/library/src/main/jniLibs/armeabi-v7a/libuniffi_xmtpv3.so differ diff --git a/library/src/main/jniLibs/x86/libuniffi_xmtpv3.so b/library/src/main/jniLibs/x86/libuniffi_xmtpv3.so index 8d56a912a..f79e3cc0b 100644 Binary files a/library/src/main/jniLibs/x86/libuniffi_xmtpv3.so and b/library/src/main/jniLibs/x86/libuniffi_xmtpv3.so differ diff --git a/library/src/main/jniLibs/x86_64/libuniffi_xmtpv3.so b/library/src/main/jniLibs/x86_64/libuniffi_xmtpv3.so index ee1d60750..415f0561a 100644 Binary files a/library/src/main/jniLibs/x86_64/libuniffi_xmtpv3.so and b/library/src/main/jniLibs/x86_64/libuniffi_xmtpv3.so differ