From d52a562aaa15189a2bb3e0dc6e741cfcbda95174 Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:13:36 -0700 Subject: [PATCH 1/2] feat: add feature unavailable error --- .changeset/tidy-plums-check.md | 5 +++++ js/packages/core/src/__tests__/smoke.test.ts | 1 + js/packages/core/src/types/result.ts | 1 + .../bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt | 2 ++ .../src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt | 4 ++++ rust/core/src/bridge.rs | 1 + rust/core/src/error.rs | 5 +++++ rust/core/src/wasm_bindings.rs | 1 + swift/Sources/IDKit/IDKit.swift | 3 +++ swift/Tests/IDKitTests/IDKitTests.swift | 6 ++++++ 10 files changed, 29 insertions(+) create mode 100644 .changeset/tidy-plums-check.md diff --git a/.changeset/tidy-plums-check.md b/.changeset/tidy-plums-check.md new file mode 100644 index 00000000..b27ab0ab --- /dev/null +++ b/.changeset/tidy-plums-check.md @@ -0,0 +1,5 @@ +--- +"@worldcoin/idkit-core": minor +--- + +Add the `feature_unavailable` World App error code. diff --git a/js/packages/core/src/__tests__/smoke.test.ts b/js/packages/core/src/__tests__/smoke.test.ts index c46d57e3..c634d4e5 100644 --- a/js/packages/core/src/__tests__/smoke.test.ts +++ b/js/packages/core/src/__tests__/smoke.test.ts @@ -377,6 +377,7 @@ describe("Enums", () => { expect(IDKitErrorCodes.CredentialUnavailable).toBe( "credential_unavailable", ); + expect(IDKitErrorCodes.FeatureUnavailable).toBe("feature_unavailable"); expect(IDKitErrorCodes.UserPresenceFailed).toBe("user_presence_failed"); expect(IDKitErrorCodes.WorldId4NotAvailable).toBe( "world_id_4_not_available", diff --git a/js/packages/core/src/types/result.ts b/js/packages/core/src/types/result.ts index 7a529bbf..e0db1608 100644 --- a/js/packages/core/src/types/result.ts +++ b/js/packages/core/src/types/result.ts @@ -59,6 +59,7 @@ export enum IDKitErrorCodes { UserRejected = "user_rejected", VerificationRejected = "verification_rejected", CredentialUnavailable = "credential_unavailable", + FeatureUnavailable = "feature_unavailable", WorldId4NotAvailable = "world_id_4_not_available", WorldId3NotAvailable = "world_id_3_not_available", MalformedRequest = "malformed_request", diff --git a/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt b/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt index b422357a..eabae952 100644 --- a/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt +++ b/kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt @@ -108,6 +108,7 @@ enum class IDKitErrorCode(val rawValue: String) { USER_REJECTED("user_rejected"), VERIFICATION_REJECTED("verification_rejected"), CREDENTIAL_UNAVAILABLE("credential_unavailable"), + FEATURE_UNAVAILABLE("feature_unavailable"), WORLD_ID_4_NOT_AVAILABLE("world_id_4_not_available"), WORLD_ID_3_NOT_AVAILABLE("world_id_3_not_available"), MALFORMED_REQUEST("malformed_request"), @@ -138,6 +139,7 @@ enum class IDKitErrorCode(val rawValue: String) { AppError.USER_REJECTED -> USER_REJECTED AppError.VERIFICATION_REJECTED -> VERIFICATION_REJECTED AppError.CREDENTIAL_UNAVAILABLE -> CREDENTIAL_UNAVAILABLE + AppError.FEATURE_UNAVAILABLE -> FEATURE_UNAVAILABLE AppError.WORLD_ID4_NOT_AVAILABLE -> WORLD_ID_4_NOT_AVAILABLE AppError.WORLD_ID3_NOT_AVAILABLE -> WORLD_ID_3_NOT_AVAILABLE AppError.MALFORMED_REQUEST -> MALFORMED_REQUEST diff --git a/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt b/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt index 3a1fab8a..f209fe86 100644 --- a/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt +++ b/kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt @@ -215,6 +215,10 @@ class IDKitTests { IDKitStatus.Failed(IDKitErrorCode.INVALID_NETWORK), IDKitRequest.mapStatus(StatusWrapper.Failed(AppError.INVALID_NETWORK)), ) + assertEquals( + IDKitStatus.Failed(IDKitErrorCode.FEATURE_UNAVAILABLE), + IDKitRequest.mapStatus(StatusWrapper.Failed(AppError.FEATURE_UNAVAILABLE)), + ) assertEquals( IDKitStatus.Failed(IDKitErrorCode.USER_PRESENCE_FAILED), IDKitRequest.mapStatus(StatusWrapper.Failed(AppError.USER_PRESENCE_FAILED)), diff --git a/rust/core/src/bridge.rs b/rust/core/src/bridge.rs index e49e468d..96b528f3 100644 --- a/rust/core/src/bridge.rs +++ b/rust/core/src/bridge.rs @@ -3443,6 +3443,7 @@ mod tests { ); let cases = [ + ("feature_unavailable", AppError::FeatureUnavailable), ("world_id_4_not_available", AppError::WorldId4NotAvailable), ("world_id_3_not_available", AppError::WorldId3NotAvailable), ("duplicate_nonce", AppError::DuplicateNonce), diff --git a/rust/core/src/error.rs b/rust/core/src/error.rs index 76f82dcf..14d4a058 100644 --- a/rust/core/src/error.rs +++ b/rust/core/src/error.rs @@ -76,6 +76,10 @@ pub enum AppError { #[error("Requested credential is not available")] CredentialUnavailable, + /// Requested feature is not enabled for the app + #[error("Requested feature is not available")] + FeatureUnavailable, + /// World ID 4.0 credential is not available #[error("World ID 4.0 is not available")] #[serde(rename = "world_id_4_not_available")] @@ -178,6 +182,7 @@ impl AppError { "user_rejected" => Self::UserRejected, "verification_rejected" => Self::VerificationRejected, "credential_unavailable" => Self::CredentialUnavailable, + "feature_unavailable" => Self::FeatureUnavailable, "world_id_4_not_available" => Self::WorldId4NotAvailable, "world_id_3_not_available" => Self::WorldId3NotAvailable, "malformed_request" => Self::MalformedRequest, diff --git a/rust/core/src/wasm_bindings.rs b/rust/core/src/wasm_bindings.rs index 00ad8e41..8f1d1f0c 100644 --- a/rust/core/src/wasm_bindings.rs +++ b/rust/core/src/wasm_bindings.rs @@ -1616,6 +1616,7 @@ export type IDKitErrorCode = | "user_rejected" | "verification_rejected" | "credential_unavailable" + | "feature_unavailable" | "world_id_4_not_available" | "world_id_3_not_available" | "malformed_request" diff --git a/swift/Sources/IDKit/IDKit.swift b/swift/Sources/IDKit/IDKit.swift index 0ed57745..210a540a 100644 --- a/swift/Sources/IDKit/IDKit.swift +++ b/swift/Sources/IDKit/IDKit.swift @@ -235,6 +235,7 @@ public enum IDKitErrorCode: String, Equatable { case userRejected = "user_rejected" case verificationRejected = "verification_rejected" case credentialUnavailable = "credential_unavailable" + case featureUnavailable = "feature_unavailable" case worldId4NotAvailable = "world_id_4_not_available" case worldId3NotAvailable = "world_id_3_not_available" case malformedRequest = "malformed_request" @@ -268,6 +269,8 @@ public enum IDKitErrorCode: String, Equatable { .verificationRejected case .credentialUnavailable: .credentialUnavailable + case .featureUnavailable: + .featureUnavailable case .worldId4NotAvailable: .worldId4NotAvailable case .worldId3NotAvailable: diff --git a/swift/Tests/IDKitTests/IDKitTests.swift b/swift/Tests/IDKitTests/IDKitTests.swift index 2fcc26de..cb055758 100644 --- a/swift/Tests/IDKitTests/IDKitTests.swift +++ b/swift/Tests/IDKitTests/IDKitTests.swift @@ -43,6 +43,12 @@ private func sampleRpContext() throws -> RpContext { ) } +@Test("feature unavailable maps to the canonical public error") +func featureUnavailableErrorMapping() { + #expect(IDKitErrorCode.from(appError: .featureUnavailable) == .featureUnavailable) + #expect(IDKitErrorCode.featureUnavailable.rawValue == "feature_unavailable") +} + @Test("IDKit entrypoints expose canonical builders") func idkitEntrypoints() throws { From 13296d3586898839aefd82434890244fe7282b5b Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:40:22 +0200 Subject: [PATCH 2/2] remove changeset --- .changeset/config.json | 11 ----------- .changeset/tidy-plums-check.md | 5 ----- js/package.json | 1 - 3 files changed, 17 deletions(-) delete mode 100644 .changeset/config.json delete mode 100644 .changeset/tidy-plums-check.md diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index f26daf14..00000000 --- a/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "public", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] -} diff --git a/.changeset/tidy-plums-check.md b/.changeset/tidy-plums-check.md deleted file mode 100644 index b27ab0ab..00000000 --- a/.changeset/tidy-plums-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@worldcoin/idkit-core": minor ---- - -Add the `feature_unavailable` World App error code. diff --git a/js/package.json b/js/package.json index 28182030..adddf93e 100644 --- a/js/package.json +++ b/js/package.json @@ -12,7 +12,6 @@ "test": "pnpm -r test" }, "devDependencies": { - "@changesets/cli": "^2.27", "prettier": "^3.3", "turbo": "^2.2", "typescript": "^5.6"