Skip to content

Commit 3639981

Browse files
authoredJan 31, 2024
Merge branch 'main' into gg/enhancement/add_sender_hmac_to_message_v2
2 parents 3c8bfa2 + 125cc65 commit 3639981

File tree

22 files changed

+3808
-855
lines changed

22 files changed

+3808
-855
lines changed
 

‎example/src/main/java/org/xmtp/android/example/account/WalletConnectV2Account.kt

+28-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.xmtp.android.example.account
33
import android.net.Uri
44
import com.walletconnect.wcmodal.client.Modal
55
import kotlinx.coroutines.flow.first
6+
import kotlinx.coroutines.runBlocking
67
import org.web3j.crypto.Keys
78
import org.xmtp.android.example.connect.getPersonalSignBody
89
import org.xmtp.android.example.extension.requestMethod
@@ -14,7 +15,7 @@ import org.xmtp.proto.message.contents.SignatureOuterClass
1415
data class WalletConnectV2Account(
1516
val session: Modal.Model.ApprovedSession,
1617
val chain: String,
17-
private val sendSessionRequestDeepLink: (Uri) -> Unit
18+
private val sendSessionRequestDeepLink: (Uri) -> Unit,
1819
) :
1920
SigningKey {
2021
override val address: String
@@ -25,10 +26,34 @@ data class WalletConnectV2Account(
2526
)
2627

2728
override suspend fun sign(data: ByteArray): SignatureOuterClass.Signature? {
28-
return sign(String(data))
29+
return signLegacy(String(data))
2930
}
3031

31-
override suspend fun sign(message: String): SignatureOuterClass.Signature? {
32+
override fun sign(text: String): ByteArray {
33+
val (parentChain, chainId, account) = session.namespaces.getValue(chain).accounts[0].split(":")
34+
val requestParams = session.namespaces.getValue(chain).methods.find { method ->
35+
method == "personal_sign"
36+
}?.let { method ->
37+
Modal.Params.Request(
38+
sessionTopic = session.topic,
39+
method = method,
40+
params = getPersonalSignBody(text, account),
41+
chainId = "$parentChain:$chainId"
42+
)
43+
}
44+
45+
runCatching {
46+
runBlocking {
47+
requestMethod(requestParams!!, sendSessionRequestDeepLink).first().getOrThrow()
48+
}
49+
}.onSuccess {
50+
return it
51+
}.onFailure {}
52+
53+
return byteArrayOf()
54+
}
55+
56+
override suspend fun signLegacy(message: String): SignatureOuterClass.Signature? {
3257
val (parentChain, chainId, account) = session.namespaces.getValue(chain).accounts[0].split(":")
3358
val requestParams = session.namespaces.getValue(chain).methods.find { method ->
3459
method == "personal_sign"

‎library/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dokkaGfmPartial {
1414

1515
ktlint {
1616
filter {
17-
exclude { it.file.path.contains("xmtp_dh") }
17+
exclude { it.file.path.contains("xmtpv3") }
1818
}
1919
}
2020

@@ -23,7 +23,7 @@ android {
2323
compileSdk 33
2424

2525
defaultConfig {
26-
minSdk 22
26+
minSdk 23
2727
targetSdk 33
2828

2929
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

‎library/src/androidTest/java/org/xmtp/android/library/ClientTest.kt

+56
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.xmtp.android.library
22

33
import androidx.test.ext.junit.runners.AndroidJUnit4
4+
import androidx.test.platform.app.InstrumentationRegistry
45
import org.junit.Assert.assertEquals
6+
import org.junit.Assert.assertNull
57
import org.junit.Assert.fail
68
import org.junit.Ignore
79
import org.junit.Test
@@ -78,6 +80,60 @@ class ClientTest {
7880
)
7981
}
8082

83+
@Test
84+
fun testV3CanBeCreatedWithBundle() {
85+
val context = InstrumentationRegistry.getInstrumentation().targetContext
86+
val fakeWallet = PrivateKeyBuilder()
87+
val options = ClientOptions(
88+
ClientOptions.Api(XMTPEnvironment.LOCAL, false),
89+
enableAlphaMls = true,
90+
appContext = context
91+
)
92+
val client =
93+
Client().create(account = fakeWallet, options = options)
94+
assertEquals(
95+
client.address.lowercase(),
96+
client.libXMTPClient?.accountAddress()?.lowercase()
97+
)
98+
99+
val bundle = client.privateKeyBundle
100+
val clientFromV1Bundle = Client().buildFromBundle(bundle, account = fakeWallet, options = options)
101+
assertEquals(client.address, clientFromV1Bundle.address)
102+
assertEquals(
103+
client.privateKeyBundleV1.identityKey,
104+
clientFromV1Bundle.privateKeyBundleV1.identityKey,
105+
)
106+
assertEquals(
107+
client.libXMTPClient?.accountAddress(),
108+
clientFromV1Bundle.libXMTPClient?.accountAddress()
109+
)
110+
}
111+
112+
@Test
113+
fun testCreatesAV3Client() {
114+
val context = InstrumentationRegistry.getInstrumentation().targetContext
115+
val fakeWallet = PrivateKeyBuilder()
116+
val client =
117+
Client().create(
118+
account = fakeWallet,
119+
options = ClientOptions(
120+
ClientOptions.Api(XMTPEnvironment.LOCAL, false),
121+
enableAlphaMls = true,
122+
appContext = context
123+
)
124+
)
125+
val v3Client = client.libXMTPClient
126+
assertEquals(client.address.lowercase(), v3Client?.accountAddress()?.lowercase())
127+
}
128+
129+
@Test
130+
fun testDoesNotCreateAV3Client() {
131+
val fakeWallet = PrivateKeyBuilder()
132+
val client = Client().create(account = fakeWallet)
133+
val v3Client = client.libXMTPClient
134+
assertNull(v3Client)
135+
}
136+
81137
@Test
82138
fun testCanMessage() {
83139
val fixtures = fixtures()

‎library/src/androidTest/java/org/xmtp/android/library/MessageTest.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class MessageTest {
135135
}
136136

137137
@Test
138+
@Ignore("Dev network flaky should be moved to local")
138139
fun testCanReadGzipCompressedMessages() {
139140
val ints = arrayOf(
140141
225, 2, 36, 98, 37, 243, 68, 234,
@@ -163,7 +164,7 @@ class MessageTest {
163164
assertEquals(client.apiClient.environment, XMTPEnvironment.DEV)
164165
val convo = client.conversations.list()[0]
165166
val message = convo.messages()[0]
166-
assertEquals("hello gzip", message.content())
167+
assertEquals("Test message", message.content())
167168
}
168169

169170
@Test

‎library/src/androidTest/java/org/xmtp/android/library/TestHelpers.kt

+9-5
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,22 @@ class FakeWallet : SigningKey {
4242
}
4343
}
4444

45-
override val address: String
46-
get() = privateKey.walletAddress
47-
4845
override suspend fun sign(data: ByteArray): Signature {
4946
val signature = privateKeyBuilder.sign(data)
5047
return signature
5148
}
5249

53-
override suspend fun sign(message: String): Signature {
54-
val signature = privateKeyBuilder.sign(message)
50+
override fun sign(text: String): ByteArray {
51+
return privateKeyBuilder.sign(text)
52+
}
53+
54+
override suspend fun signLegacy(message: String): Signature {
55+
val signature = privateKeyBuilder.signLegacy(message)
5556
return signature
5657
}
58+
59+
override val address: String
60+
get() = privateKey.walletAddress
5761
}
5862

5963
class FakeStreamHolder {

0 commit comments

Comments
 (0)