Skip to content

Commit 97131d7

Browse files
authored
Merge pull request #287 from reown-com/develop
BOM_1.6.5
2 parents eb19b16 + 4d1488e commit 97131d7

File tree

16 files changed

+683
-132
lines changed

16 files changed

+683
-132
lines changed

buildSrc/src/main/kotlin/Versions.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ const val KEY_SDK_NAME = "SDK_NAME"
88
const val DEFAULT_PUBLISH_GROUP = "com.reown"
99

1010
//Latest versions
11-
const val BOM_VERSION = "1.6.4"
12-
const val FOUNDATION_VERSION = "1.6.4"
13-
const val CORE_VERSION = "1.6.4"
14-
const val SIGN_VERSION = "1.6.4"
15-
const val NOTIFY_VERSION = "1.6.4"
16-
const val WALLETKIT_VERSION = "1.6.4"
17-
const val APPKIT_VERSION = "1.6.4"
18-
const val MODAL_CORE_VERSION = "1.6.4"
19-
const val POS_VERSION = "0.0.6"
20-
const val PAY_VERSION = "1.0.4"
11+
const val BOM_VERSION = "1.6.5"
12+
const val FOUNDATION_VERSION = "1.6.5"
13+
const val CORE_VERSION = "1.6.5"
14+
const val SIGN_VERSION = "1.6.5"
15+
const val NOTIFY_VERSION = "1.6.5"
16+
const val WALLETKIT_VERSION = "1.6.5"
17+
const val APPKIT_VERSION = "1.6.5"
18+
const val MODAL_CORE_VERSION = "1.6.5"
19+
const val POS_VERSION = "0.0.7"
20+
const val PAY_VERSION = "1.0.5"
2121

2222
//Artifact ids
2323
const val ANDROID_BOM = "android-bom"

product/pay/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ dependencies {
7979
// implementation("com.github.reown-com:yttrium-wcpay:unspecified")
8080

8181
//jitpack
82-
implementation("com.github.reown-com.yttrium:yttrium-wcpay:0.10.22") {
82+
implementation("com.github.reown-com.yttrium:yttrium-wcpay:0.10.34") {
8383
exclude(group = "net.java.dev.jna", module = "jna")
8484
}
8585
implementation("net.java.dev.jna:jna:5.17.0@aar")

product/pay/src/androidTest/kotlin/com/walletconnect/pay/test/client/WcPayIntegrationTest.kt

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import kotlinx.coroutines.delay
1313
import kotlinx.coroutines.runBlocking
1414
import kotlinx.coroutines.withTimeout
1515
import org.json.JSONArray
16+
import org.json.JSONObject
1617
import org.junit.Assert.assertTrue
1718
import org.junit.Rule
1819
import org.junit.Test
@@ -77,27 +78,25 @@ class WcPayIntegrationTest {
7778
}
7879
println("Signatures generated: ${signatures.size}")
7980

80-
// Step 5: Confirm payment with signatures
81+
// Step 5: Build collected data from schema
82+
val collectedData = options.collectDataAction?.schema?.let { schema ->
83+
buildCollectedDataFromSchema(schema)
84+
}
85+
println("Collected data from schema: ${collectedData?.map { "${it.id}=${it.value}" }}")
86+
87+
// Step 6: Confirm payment with signatures
8188
val confirmResult = WalletConnectPay.confirmPayment(
8289
paymentId = options.paymentId,
8390
optionId = selectedOption.id,
8491
signatures = signatures,
85-
collectedData = options.collectDataAction?.fields?.map { field ->
86-
Pay.CollectDataFieldResult(
87-
id = field.id,
88-
value = when (field.fieldType) {
89-
Pay.CollectDataFieldType.TEXT -> "test@example.com"
90-
Pay.CollectDataFieldType.DATE -> "1990-01-01"
91-
}
92-
)
93-
}
92+
collectedData = collectedData
9493
)
9594
assertTrue("Failed to confirm payment: ${confirmResult.exceptionOrNull()}", confirmResult.isSuccess)
9695

9796
val confirmation = confirmResult.getOrThrow()
9897
println("Payment confirmation status: ${confirmation.status}")
9998

100-
// Step 6: Assert payment succeeded or is processing
99+
// Step 7: Assert payment succeeded or is processing
101100
assertTrue(
102101
"Unexpected payment status: ${confirmation.status}",
103102
confirmation.status == Pay.PaymentStatus.SUCCEEDED || confirmation.status == Pay.PaymentStatus.PROCESSING
@@ -229,4 +228,43 @@ class WcPayIntegrationTest {
229228
assertTrue("Failed to create test payment: ${response.errorBody()?.string()}", response.isSuccessful)
230229
return response.body()!!
231230
}
231+
232+
/**
233+
* Parse schema to build collected data for confirmPayment.
234+
* Uses the 'required' array and 'properties' to determine what fields to fill.
235+
*/
236+
private fun buildCollectedDataFromSchema(schema: String): List<Pay.CollectDataFieldResult> {
237+
val schemaJson = JSONObject(schema)
238+
val properties = schemaJson.optJSONObject("properties") ?: return emptyList()
239+
val requiredArray = schemaJson.optJSONArray("required") ?: return emptyList()
240+
241+
val collectedData = mutableListOf<Pay.CollectDataFieldResult>()
242+
243+
for (i in 0 until requiredArray.length()) {
244+
val fieldId = requiredArray.getString(i)
245+
val fieldProps = properties.optJSONObject(fieldId) ?: continue
246+
val fieldType = fieldProps.optString("type")
247+
val fieldFormat = fieldProps.optString("format")
248+
249+
val value = when {
250+
// Boolean fields (like tosConfirmed)
251+
fieldType == "boolean" -> "true"
252+
// Date fields
253+
fieldFormat == "date" || fieldId == "dob" -> "1990-01-15"
254+
// Country code fields (pattern: ^[A-Z]{2}$)
255+
fieldId == "pobCountry" -> "US"
256+
// Address fields
257+
fieldId == "pobAddress" -> "New York, NY"
258+
// Name fields
259+
fieldId == "fullName" -> "Test User"
260+
// Default text fields
261+
fieldType == "string" -> "test value"
262+
else -> "test"
263+
}
264+
265+
collectedData.add(Pay.CollectDataFieldResult(id = fieldId, value = value))
266+
}
267+
268+
return collectedData
269+
}
232270
}

product/pay/src/androidTest/kotlin/com/walletconnect/pay/test/utils/Common.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.test.platform.app.InstrumentationRegistry
44
import junit.framework.TestCase.fail
55

66
internal object Common {
7-
const val MERCHANT_ID = "ingenico-demo"
7+
const val MERCHANT_ID = "merchant-1768556907"
88
val MERCHANT_API_KEY: String by lazy {
99
InstrumentationRegistry.getArguments().getString("MERCHANT_API_KEY")
1010
?: error("MERCHANT_API_KEY environment variable not set")

product/pay/src/main/java/com/walletconnect/pay/Mappers.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import uniffi.yttrium_wcpay.CollectDataField as YttriumCollectDataField
1919
import uniffi.yttrium_wcpay.CollectDataFieldType as YttriumCollectDataFieldType
2020
import uniffi.yttrium_wcpay.ConfirmPaymentResultResponse as YttriumConfirmPaymentResponse
2121
import uniffi.yttrium_wcpay.CollectDataFieldResult as YttriumCollectDataFieldResult
22+
import uniffi.yttrium_wcpay.PaymentResultInfo as YttriumPaymentResultInfo
2223
import uniffi.yttrium_wcpay.GetPaymentOptionsException as YttriumGetPaymentOptionsError
2324
import uniffi.yttrium_wcpay.GetPaymentRequestException as YttriumGetPaymentRequestError
2425
import uniffi.yttrium_wcpay.ConfirmPaymentException as YttriumConfirmPaymentError
@@ -94,7 +95,9 @@ internal object Mappers {
9495

9596
private fun mapCollectDataAction(action: YttriumCollectDataAction): Pay.CollectDataAction {
9697
return Pay.CollectDataAction(
97-
fields = action.fields.map { mapCollectDataField(it) }
98+
fields = action.fields.map { mapCollectDataField(it) },
99+
url = action.url,
100+
schema = action.schema
98101
)
99102
}
100103

@@ -111,6 +114,7 @@ internal object Mappers {
111114
return when (type) {
112115
YttriumCollectDataFieldType.TEXT -> Pay.CollectDataFieldType.TEXT
113116
YttriumCollectDataFieldType.DATE -> Pay.CollectDataFieldType.DATE
117+
YttriumCollectDataFieldType.CHECKBOX -> Pay.CollectDataFieldType.CHECKBOX
114118
}
115119
}
116120

@@ -119,6 +123,14 @@ internal object Mappers {
119123
status = mapPaymentStatus(response.status),
120124
isFinal = response.isFinal,
121125
pollInMs = response.pollInMs,
126+
info = response.info?.let { mapPaymentResultInfo(it) }
127+
)
128+
}
129+
130+
private fun mapPaymentResultInfo(info: YttriumPaymentResultInfo): Pay.PaymentResultInfo {
131+
return Pay.PaymentResultInfo(
132+
txId = info.txId,
133+
optionAmount = mapAmount(info.optionAmount)
122134
)
123135
}
124136

product/pay/src/main/java/com/walletconnect/pay/Pay.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ object Pay {
6666

6767
enum class CollectDataFieldType {
6868
TEXT,
69-
DATE
69+
DATE,
70+
CHECKBOX
7071
}
7172

7273
data class CollectDataField(
@@ -77,7 +78,10 @@ object Pay {
7778
)
7879

7980
data class CollectDataAction(
80-
val fields: List<CollectDataField>
81+
@Deprecated("Use url for WebView-based data collection or schema to parse field requirements")
82+
val fields: List<CollectDataField>,
83+
val url: String?,
84+
val schema: String?
8185
)
8286

8387
sealed class RequiredAction {
@@ -89,10 +93,16 @@ object Pay {
8993
val value: String
9094
)
9195

96+
data class PaymentResultInfo(
97+
val txId: String,
98+
val optionAmount: Amount
99+
)
100+
92101
data class ConfirmPaymentResponse(
93102
val status: PaymentStatus,
94103
val isFinal: Boolean,
95104
val pollInMs: Long?,
105+
val info: PaymentResultInfo?
96106
)
97107

98108
sealed class PayError : Exception() {

product/pay/src/main/java/com/walletconnect/pay/WalletConnectPay.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ object WalletConnectPay {
132132
collectedData = yttriumCollectedData,
133133
maxPollMs = 60000
134134
)
135+
135136
Result.success(Mappers.mapConfirmPaymentResponse(response))
136137
} catch (e: uniffi.yttrium_wcpay.ConfirmPaymentException) {
137138
Result.failure(Mappers.mapConfirmPaymentError(e))

product/pay/src/test/kotlin/com/walletconnect/pay/PayModelsTest.kt

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,10 @@ class PayModelsTest {
166166
fun `CollectDataFieldType enum should have all required values`() {
167167
val types = Pay.CollectDataFieldType.entries.toTypedArray()
168168

169-
assertEquals(2, types.size)
169+
assertEquals(3, types.size)
170170
assertNotNull(Pay.CollectDataFieldType.valueOf("TEXT"))
171171
assertNotNull(Pay.CollectDataFieldType.valueOf("DATE"))
172+
assertNotNull(Pay.CollectDataFieldType.valueOf("CHECKBOX"))
172173
}
173174

174175
@Test
@@ -202,25 +203,49 @@ class PayModelsTest {
202203
val response = Pay.ConfirmPaymentResponse(
203204
status = Pay.PaymentStatus.PROCESSING,
204205
isFinal = false,
205-
pollInMs = 5000L
206+
pollInMs = 5000L,
207+
info = null
206208
)
207209

208210
assertEquals(Pay.PaymentStatus.PROCESSING, response.status)
209211
assertEquals(false, response.isFinal)
210212
assertEquals(5000L, response.pollInMs)
213+
assertNull(response.info)
211214
}
212215

213216
@Test
214217
fun `ConfirmPaymentResponse with final status`() {
218+
val amount = Pay.Amount(value = "100", unit = "USD", display = null)
219+
val resultInfo = Pay.PaymentResultInfo(
220+
txId = "0x123abc",
221+
optionAmount = amount
222+
)
215223
val response = Pay.ConfirmPaymentResponse(
216224
status = Pay.PaymentStatus.SUCCEEDED,
217225
isFinal = true,
218-
pollInMs = null
226+
pollInMs = null,
227+
info = resultInfo
219228
)
220229

221230
assertEquals(Pay.PaymentStatus.SUCCEEDED, response.status)
222231
assertEquals(true, response.isFinal)
223232
assertNull(response.pollInMs)
233+
assertNotNull(response.info)
234+
assertEquals("0x123abc", response.info?.txId)
235+
assertEquals("100", response.info?.optionAmount?.value)
236+
}
237+
238+
@Test
239+
fun `PaymentResultInfo should hold correct values`() {
240+
val amount = Pay.Amount(value = "50", unit = "USDC", display = null)
241+
val resultInfo = Pay.PaymentResultInfo(
242+
txId = "tx-456",
243+
optionAmount = amount
244+
)
245+
246+
assertEquals("tx-456", resultInfo.txId)
247+
assertEquals("50", resultInfo.optionAmount.value)
248+
assertEquals("USDC", resultInfo.optionAmount.unit)
224249
}
225250

226251
@Test
@@ -237,16 +262,52 @@ class PayModelsTest {
237262
name = "Date of Birth",
238263
fieldType = Pay.CollectDataFieldType.DATE,
239264
required = false
265+
),
266+
Pay.CollectDataField(
267+
id = "terms",
268+
name = "Accept Terms",
269+
fieldType = Pay.CollectDataFieldType.CHECKBOX,
270+
required = true
240271
)
241272
)
242273

243-
val action = Pay.CollectDataAction(fields = fields)
274+
val action = Pay.CollectDataAction(
275+
fields = fields,
276+
url = "https://example.com/ic-form",
277+
schema = "ic-schema-v1"
278+
)
244279

245-
assertEquals(2, action.fields.size)
280+
assertEquals(3, action.fields.size)
246281
assertEquals("email", action.fields[0].id)
247282
assertEquals("dob", action.fields[1].id)
283+
assertEquals("terms", action.fields[2].id)
248284
assertEquals(Pay.CollectDataFieldType.TEXT, action.fields[0].fieldType)
249285
assertEquals(Pay.CollectDataFieldType.DATE, action.fields[1].fieldType)
286+
assertEquals(Pay.CollectDataFieldType.CHECKBOX, action.fields[2].fieldType)
287+
assertEquals("https://example.com/ic-form", action.url)
288+
assertEquals("ic-schema-v1", action.schema)
289+
}
290+
291+
@Test
292+
fun `CollectDataAction should handle null url and schema`() {
293+
val fields = listOf(
294+
Pay.CollectDataField(
295+
id = "email",
296+
name = "Email",
297+
fieldType = Pay.CollectDataFieldType.TEXT,
298+
required = true
299+
)
300+
)
301+
302+
val action = Pay.CollectDataAction(
303+
fields = fields,
304+
url = null,
305+
schema = null
306+
)
307+
308+
assertEquals(1, action.fields.size)
309+
assertNull(action.url)
310+
assertNull(action.schema)
250311
}
251312

252313
@Test
@@ -273,7 +334,9 @@ class PayModelsTest {
273334
fieldType = Pay.CollectDataFieldType.TEXT,
274335
required = true
275336
)
276-
)
337+
),
338+
url = null,
339+
schema = null
277340
)
278341

279342
val response = Pay.PaymentOptionsResponse(

product/walletkit/src/main/kotlin/com/reown/walletkit/client/PayMapper.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ internal fun Pay.PaymentOption.toWallet(): Wallet.Model.PaymentOption =
7272
@JvmSynthetic
7373
internal fun Pay.CollectDataAction.toWallet(): Wallet.Model.CollectDataAction =
7474
Wallet.Model.CollectDataAction(
75-
fields = fields.map { it.toWallet() }
75+
fields = fields.map { it.toWallet() },
76+
url = url,
77+
schema = schema
7678
)
7779

7880
@JvmSynthetic
@@ -89,6 +91,7 @@ internal fun Pay.CollectDataFieldType.toWallet(): Wallet.Model.CollectDataFieldT
8991
when (this) {
9092
Pay.CollectDataFieldType.TEXT -> Wallet.Model.CollectDataFieldType.TEXT
9193
Pay.CollectDataFieldType.DATE -> Wallet.Model.CollectDataFieldType.DATE
94+
Pay.CollectDataFieldType.CHECKBOX -> Wallet.Model.CollectDataFieldType.CHECKBOX
9295
}
9396

9497
@JvmSynthetic
@@ -107,6 +110,13 @@ internal fun Pay.WalletRpcAction.toWallet(): Wallet.Model.WalletRpcAction =
107110
params = params
108111
)
109112

113+
@JvmSynthetic
114+
internal fun Pay.PaymentResultInfo.toWallet(): Wallet.Model.PaymentResultInfo =
115+
Wallet.Model.PaymentResultInfo(
116+
txId = txId,
117+
optionAmount = optionAmount.toWallet()
118+
)
119+
110120
@JvmSynthetic
111121
internal fun Pay.ConfirmPaymentResponse.toWallet(): Wallet.Model.ConfirmPaymentResponse =
112122
Wallet.Model.ConfirmPaymentResponse(

0 commit comments

Comments
 (0)