Skip to content

Commit 31401a2

Browse files
committed
Update wallet_sendCalls response handling
1 parent 5968eb2 commit 31401a2

File tree

3 files changed

+267
-1
lines changed

3 files changed

+267
-1
lines changed

protocol/sign/src/main/kotlin/com/reown/sign/engine/model/tvf/TVF.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,23 @@ internal class TVF(private val moshi: Moshi) {
2929
fun collectTxHashes(rpcMethod: String, rpcResult: String, rpcParams: String = ""): List<String>? {
3030
return try {
3131
when (rpcMethod) {
32-
in evm + wallet -> listOf(rpcResult)
32+
in evm + wallet -> {
33+
if (rpcMethod == WALLET_SEND_CALLS) {
34+
val result = moshi.adapter(Wallet::class.java)
35+
.fromJson(rpcResult)
36+
?.let {
37+
val caip345 = it.capabilities?.caip345
38+
val transactionHashes = caip345?.transactionHashes
39+
val transactionHashesList = transactionHashes ?: emptyList()
40+
listOf(it.id) + transactionHashesList
41+
}
42+
43+
result ?: listOf(rpcResult)
44+
45+
} else {
46+
listOf(rpcResult)
47+
}
48+
}
3349

3450
SOLANA_SIGN_TRANSACTION ->
3551
moshi.adapter(SolanaSignTransactionResult::class.java)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.reown.sign.engine.model.tvf
2+
3+
import com.squareup.moshi.JsonClass
4+
5+
@JsonClass(generateAdapter = true)
6+
data class Wallet(
7+
val id: String,
8+
val capabilities: WalletCapabilities?
9+
)
10+
11+
@JsonClass(generateAdapter = true)
12+
data class WalletCapabilities(
13+
val caip345: CAIP345?
14+
)
15+
16+
@JsonClass(generateAdapter = true)
17+
data class CAIP345(
18+
val caip2: String?,
19+
val transactionHashes: List<String>?
20+
)

protocol/sign/src/test/kotlin/com/reown/sign/tvf/TVFTests.kt

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,4 +1051,234 @@ class TVFTests {
10511051
assertEquals("665cd321870f1e416dc61bac60010614d7a0892328feec468c57540b8ba1a99e", result.firstOrNull())
10521052
println("Polkadot transaction hash: ${result.firstOrNull()}")
10531053
}
1054+
1055+
// Wallet SendCalls Tests
1056+
@Test
1057+
fun `collectTxHashes should parse wallet_sendCalls with complete wallet data`() {
1058+
// Arrange
1059+
val rpcMethod = "wallet_sendCalls"
1060+
val rpcResult = """
1061+
{
1062+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1063+
"capabilities": {
1064+
"caip345": {
1065+
"caip2": "eip155:1",
1066+
"transactionHashes": ["0xabc123", "0xdef456"]
1067+
}
1068+
}
1069+
}
1070+
""".trimIndent()
1071+
1072+
// Act
1073+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1074+
1075+
// Assert
1076+
assertNotNull(result)
1077+
assertEquals(3, result!!.size)
1078+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result[0])
1079+
assertEquals("0xabc123", result[1])
1080+
assertEquals("0xdef456", result[2])
1081+
println("Wallet sendCalls result: ${result}")
1082+
}
1083+
1084+
@Test
1085+
fun `collectTxHashes should parse wallet_sendCalls with null capabilities`() {
1086+
// Arrange
1087+
val rpcMethod = "wallet_sendCalls"
1088+
val rpcResult = """
1089+
{
1090+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930"
1091+
}
1092+
""".trimIndent()
1093+
1094+
// Act
1095+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1096+
1097+
// Assert
1098+
assertNotNull(result)
1099+
assertEquals(1, result!!.size)
1100+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result.first())
1101+
println("Wallet sendCalls result with null capabilities: ${result.first()}")
1102+
}
1103+
1104+
@Test
1105+
fun `collectTxHashes should parse wallet_sendCalls with null caip345`() {
1106+
// Arrange
1107+
val rpcMethod = "wallet_sendCalls"
1108+
val rpcResult = """
1109+
{
1110+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1111+
"capabilities": {}
1112+
}
1113+
""".trimIndent()
1114+
1115+
// Act
1116+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1117+
1118+
// Assert
1119+
assertNotNull(result)
1120+
assertEquals(1, result!!.size)
1121+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result.first())
1122+
println("Wallet sendCalls result with null caip345: ${result.first()}")
1123+
}
1124+
1125+
@Test
1126+
fun `collectTxHashes should parse wallet_sendCalls with null caip2`() {
1127+
// Arrange
1128+
val rpcMethod = "wallet_sendCalls"
1129+
val rpcResult = """
1130+
{
1131+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1132+
"capabilities": {
1133+
"caip345": {
1134+
"transactionHashes": ["0xabc123", "0xdef456"]
1135+
}
1136+
}
1137+
}
1138+
""".trimIndent()
1139+
1140+
// Act
1141+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1142+
1143+
// Assert
1144+
assertNotNull(result)
1145+
assertEquals(3, result!!.size)
1146+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result[0])
1147+
assertEquals("0xabc123", result[1])
1148+
assertEquals("0xdef456", result[2])
1149+
println("Wallet sendCalls result with null caip2: ${result}")
1150+
}
1151+
1152+
@Test
1153+
fun `collectTxHashes should parse wallet_sendCalls with null transactionHashes`() {
1154+
// Arrange
1155+
val rpcMethod = "wallet_sendCalls"
1156+
val rpcResult = """
1157+
{
1158+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1159+
"capabilities": {
1160+
"caip345": {
1161+
"caip2": "eip155:1"
1162+
}
1163+
}
1164+
}
1165+
""".trimIndent()
1166+
1167+
// Act
1168+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1169+
1170+
// Assert
1171+
assertNotNull(result)
1172+
assertEquals(1, result!!.size)
1173+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result[0])
1174+
println("Wallet sendCalls result with null transactionHashes: ${result}")
1175+
}
1176+
1177+
@Test
1178+
fun `collectTxHashes should parse wallet_sendCalls with empty transactionHashes`() {
1179+
// Arrange
1180+
val rpcMethod = "wallet_sendCalls"
1181+
val rpcResult = """
1182+
{
1183+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1184+
"capabilities": {
1185+
"caip345": {
1186+
"caip2": "eip155:1",
1187+
"transactionHashes": []
1188+
}
1189+
}
1190+
}
1191+
""".trimIndent()
1192+
1193+
// Act
1194+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1195+
1196+
// Assert
1197+
assertNotNull(result)
1198+
assertEquals(1, result!!.size)
1199+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result[0])
1200+
println("Wallet sendCalls result with empty transactionHashes: ${result}")
1201+
}
1202+
1203+
@Test
1204+
fun `collectTxHashes should parse wallet_sendCalls with single transaction hash`() {
1205+
// Arrange
1206+
val rpcMethod = "wallet_sendCalls"
1207+
val rpcResult = """
1208+
{
1209+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1210+
"capabilities": {
1211+
"caip345": {
1212+
"caip2": "eip155:137",
1213+
"transactionHashes": ["0x1234567890abcdef"]
1214+
}
1215+
}
1216+
}
1217+
""".trimIndent()
1218+
1219+
// Act
1220+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1221+
1222+
// Assert
1223+
assertNotNull(result)
1224+
assertEquals(2, result!!.size)
1225+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result[0])
1226+
assertEquals("0x1234567890abcdef", result[1])
1227+
println("Wallet sendCalls result with single transaction hash: ${result}")
1228+
}
1229+
1230+
@Test
1231+
fun `collectTxHashes should handle wallet_sendCalls with malformed JSON`() {
1232+
// Arrange
1233+
val rpcMethod = "wallet_sendCalls"
1234+
val rpcResult = "{malformed_json}"
1235+
1236+
// Act
1237+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1238+
1239+
// Assert
1240+
assertNull(result)
1241+
}
1242+
1243+
@Test
1244+
fun `collectTxHashes should handle wallet_sendCalls with empty result`() {
1245+
// Arrange
1246+
val rpcMethod = "wallet_sendCalls"
1247+
val rpcResult = ""
1248+
1249+
// Act
1250+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1251+
1252+
// Assert
1253+
assertNull(result)
1254+
}
1255+
1256+
@Test
1257+
fun `collectTxHashes should handle wallet_sendCalls with different chain IDs`() {
1258+
// Arrange
1259+
val rpcMethod = "wallet_sendCalls"
1260+
val rpcResult = """
1261+
{
1262+
"id": "0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930",
1263+
"capabilities": {
1264+
"caip345": {
1265+
"caip2": "eip155:56",
1266+
"transactionHashes": ["0xabc123", "0xdef456", "0x789ghi"]
1267+
}
1268+
}
1269+
}
1270+
""".trimIndent()
1271+
1272+
// Act
1273+
val result = tvf.collectTxHashes(rpcMethod, rpcResult)
1274+
1275+
// Assert
1276+
assertNotNull(result)
1277+
assertEquals(4, result!!.size)
1278+
assertEquals("0x159d1cf182eac62e4ec025cbf32ad35b33ab2d32669f8f93988ffa5623473930", result[0])
1279+
assertEquals("0xabc123", result[1])
1280+
assertEquals("0xdef456", result[2])
1281+
assertEquals("0x789ghi", result[3])
1282+
println("Wallet sendCalls result with BSC chain: ${result}")
1283+
}
10541284
}

0 commit comments

Comments
 (0)