> For the complete documentation index, see [llms.txt](https://docs.zama.org/protocol/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.zama.org/protocol/sdk/changelog/v3/v3-6.md).

# 3.6.x

Web Worker encryption offload, structured wallet-signing and permit-failure events, an interrupted-unshield resume fix, and orphaned relayer entries that warn instead of throwing.

This page covers the `3.6.x` line.

## 3.6.0

*Released 2026-09-11.*

### Orphaned relayer entries warn instead of failing `createConfig`

A `relayers` entry whose chain is not in `chains` no longer throws a `ConfigurationError`. The entry is never used, so `createConfig` warns through the configured logger and continues. A chain without a relayer entry still throws. This lets a static relayer catalog serve a chain list that is filtered per environment without failing at boot.

### Encryption runs in a Web Worker again

`web()` runs encryption in a dedicated Web Worker, as it did before the `@fhevm/sdk` migration, so encrypting a large input no longer blocks the main thread. Nothing changes in your code: `encryptValue()`, `encryptValues()`, and every `Token` method that encrypts keep the same signatures.

Three new `web()` options control it: [`offloadEncrypt`](/protocol/sdk/api-references/sdk/relayerweb.md#offloadencrypt) picks where encryption runs (`"auto"` by default, with one `console.warn` per fallback), [`offloadWorker`](/protocol/sdk/api-references/sdk/relayerweb.md#offloadworker) supplies your own worker source for bundlers or CSPs the built-in spawn can't reach, and [`offloadTimeouts`](/protocol/sdk/api-references/sdk/relayerweb.md#offloadtimeouts) tunes the worker's lifecycle deadlines. Strict `offloadEncrypt: true` rejects with the new [`EncryptOffloadUnavailableError`](/protocol/sdk/api-references/sdk/errors.md#encryptoffloadunavailableerror) (`ENCRYPT_OFFLOAD_UNAVAILABLE`) instead of falling back.

Apps served under a Content Security Policy need `worker-src 'self' blob:`; see the [CSP requirement](/protocol/sdk/api-references/sdk/relayerweb.md#csp-requirement).

### Interrupted unshields no longer leave a stuck resume prompt

An unshield whose finalize confirmed but whose persisted record was never cleared (a closed tab, a failed storage write) used to leave a permanent "resume unshield" prompt. Every resume attempt then submitted a transaction that reverted.

The SDK now verifies the record on-chain. `getPendingUnshield()` clears a record whose unwrap request was already finalized and returns `null`. `resumeUnshield()` throws a new `UnshieldAlreadyFinalizedError` (`UNSHIELD_ALREADY_FINALIZED`) instead of broadcasting a reverting transaction, and `useResumeUnshield` refreshes the pending-unshield and balance queries when it sees this error, so the prompt disappears on its own. Treat the error as completion: the funds already arrived. No API change is required to pick this up. See the [error reference](/protocol/sdk/api-references/sdk/errors.md#unshieldalreadyfinalizederror) and [Unshield tokens](/protocol/sdk/guides/unshield-tokens.md#4-handle-interrupted-unshields).

### Structured events and metadata for wallet signing/permit failures

Wallet-signing failures during permit granting (`grantPermit`, `grantDelegationPermit`, `registerPermit`) are now observable: they emit a `ZamaSDKEvents.PermitError` event via [`onEvent`](/protocol/sdk/api-references/sdk/zamasdk.md#onevent), carrying the failed `operation` and the classified error, mirroring the existing `TransactionError` event for write transactions.

`SigningRejectedError` and `SigningFailedError` also gained structured fields — `operation` (the SDK method that was signing), and, when recoverable from the wallet/provider's raw error, `rpcCode` and `walletErrorName` — so an integrator can group and alert on these instead of parsing the error message. See the [error reference](/protocol/sdk/api-references/sdk/errors.md#signingrejectederror). No API change is required to pick this up: existing thrown-error behavior for `grantPermit`/`grantDelegationPermit`/`registerPermit` is unchanged for callers that don't subscribe to `onEvent`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.zama.org/protocol/sdk/changelog/v3/v3-6.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
