Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import com.worldcoin.idkit.IDKitRequestConfig
import com.worldcoin.idkit.documentLegacy
import com.worldcoin.idkit.idkitResultToJson
import com.worldcoin.idkit.deviceLegacy
import com.worldcoin.idkit.identityCheck
import com.worldcoin.idkit.orbLegacy
import com.worldcoin.idkit.secureDocumentLegacy
import com.worldcoin.idkit.selfieCheckLegacy
Expand All @@ -53,7 +54,9 @@ import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONArray
import org.json.JSONObject
import uniffi.idkit_core.DocumentType
import uniffi.idkit_core.Environment
import uniffi.idkit_core.IdentityAttribute
import uniffi.idkit_core.RpContext

class MainActivity : ComponentActivity() {
Expand Down Expand Up @@ -239,7 +242,7 @@ private fun LegacyPresetSelector(
onSelect: (SampleLegacyPreset) -> Unit,
) {
Column(verticalArrangement = Arrangement.spacedBy(6.dp)) {
Text("Legacy preset", style = MaterialTheme.typography.labelLarge)
Text("Preset", style = MaterialTheme.typography.labelLarge)

SampleLegacyPreset.entries
.chunked(2)
Expand Down Expand Up @@ -281,6 +284,7 @@ private enum class SampleLegacyPreset(val label: String) {
DOCUMENT("document"),
DEVICE("device"),
SELFIE_CHECK("selfie check"),
IDENTITY_CHECK("identity check"),
;

fun toPreset(signal: String) = when (this) {
Expand All @@ -289,6 +293,14 @@ private enum class SampleLegacyPreset(val label: String) {
DOCUMENT -> documentLegacy(signal = signal)
DEVICE -> deviceLegacy(signal = signal)
SELFIE_CHECK -> selfieCheckLegacy(signal = signal)
IDENTITY_CHECK -> identityCheck(
attributes = listOf(
IdentityAttribute.MinimumAge(21u),
IdentityAttribute.Nationality("JPN"),
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
),
requireProofOfHumanity = true,
)
}
}

Expand Down Expand Up @@ -366,7 +378,7 @@ private class SampleModel {
deepLinkReceivedForPendingRequest = false

android.util.Log.i("IDKitSample", "IDKit connector URL: ${request.connectorURI}")
log("Using legacy preset: ${legacyPreset.label}")
log("Using preset: ${legacyPreset.label}")
log("Generated request ID: ${request.requestId}")
log("Configured return_to callback: $returnToURL")
startPollingForRequest(
Expand Down
20 changes: 20 additions & 0 deletions kotlin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,12 @@ import com.worldcoin.idkit.IDKit
import com.worldcoin.idkit.IDKitPollOptions
import com.worldcoin.idkit.IDKitRequestConfig
import com.worldcoin.idkit.IDKitCompletionResult
import com.worldcoin.idkit.IdentityAttribute
import com.worldcoin.idkit.selfieCheckLegacy
import com.worldcoin.idkit.identityCheck
import com.worldcoin.idkit.orbLegacy
import com.worldcoin.idkit.deviceLegacy
import uniffi.idkit_core.DocumentType
import uniffi.idkit_core.Environment
import uniffi.idkit_core.RpContext

Expand Down Expand Up @@ -117,6 +120,23 @@ val request = IDKit
.preset(selfieCheckLegacy(signal = "user-123"))
```

For document-based identity attestation, use:

```kotlin
val request = IDKit
.request(config)
.preset(
identityCheck(
attributes = listOf(
IdentityAttribute.MinimumAge(21u),
IdentityAttribute.Nationality("JPN"),
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
),
requireProofOfHumanity = true,
),
)
```

## Credential request options parity

```kotlin
Expand Down
15 changes: 15 additions & 0 deletions kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ typealias IDKitRequestConfig = IdKitRequestConfig
typealias IDKitResult = IdKitResult
typealias RpContext = uniffi.idkit_core.RpContext
typealias Environment = uniffi.idkit_core.Environment
typealias DocumentType = uniffi.idkit_core.DocumentType
typealias IdentityAttribute = uniffi.idkit_core.IdentityAttribute

class IDKitClientError(message: String) : IllegalArgumentException(message)

Expand Down Expand Up @@ -332,6 +334,19 @@ fun deviceLegacy(signal: String? = null): Preset = Preset.DeviceLegacy(signal =
*/
fun selfieCheckLegacy(signal: String? = null): Preset = Preset.SelfieCheckLegacy(signal = signal)

/**
* Returns the identity check preset.
*
* This preset requires World ID 4.0-compatible clients.
*/
fun identityCheck(
attributes: List<IdentityAttribute>,
requireProofOfHumanity: Boolean = false,
): Preset = Preset.IdentityCheck(
attributes = attributes,
requireProofOfHumanity = requireProofOfHumanity,
)

fun idkitResultToJson(result: IDKitResult): String = nativeIdkitResultToJson(result)

fun idkitResultFromJson(json: String): IDKitResult = nativeIdkitResultFromJson(json)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import kotlin.test.assertTrue
import uniffi.idkit_core.AppError
// TODO: Re-enable when World ID 4.0 is live
// import uniffi.idkit_core.CredentialType
import uniffi.idkit_core.DocumentType
import uniffi.idkit_core.Environment
import uniffi.idkit_core.IdentityAttribute
import uniffi.idkit_core.Preset
import uniffi.idkit_core.ResponseItem
import uniffi.idkit_core.RpContext
Expand Down Expand Up @@ -298,6 +300,25 @@ class IDKitTests {
assertEquals("f", (face as Preset.SelfieCheckLegacy).signal)
}

@Test
fun `identityCheck helper exposes canonical preset`() {
val attributes = listOf(
IdentityAttribute.MinimumAge(21u),
IdentityAttribute.Nationality("JPN"),
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
)

val preset = identityCheck(
attributes = attributes,
requireProofOfHumanity = true,
)

assertTrue(preset is Preset.IdentityCheck)
preset as Preset.IdentityCheck
assertEquals(attributes, preset.attributes)
assertTrue(preset.requireProofOfHumanity)
}

@Test
fun `idkit result json helpers roundtrip`() {
val input = sampleResult()
Expand Down
3 changes: 3 additions & 0 deletions scripts/build-kotlin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ esac

HOST_LIB="$PROJECT_ROOT/target/release/libidkit.$LIB_EXT"

echo "🎯 Installing Android Rust targets"
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android >/dev/null

echo "🔧 Building Rust library (host) for binding generation"
CARGO_PROFILE_RELEASE_STRIP=none cargo build --package idkit-core --release --locked --features uniffi-bindings

Expand Down
Loading