[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [local‑first/Evolu](https://evolu.dev/docs/api-reference/common/local-first/Evolu) › hasWrappedDeviceSecret

```ts
function hasWrappedDeviceSecret(
  appName: string & Brand<"UrlSafeString"> & Brand<"AppName">,
): Task<
  boolean,
  UnknownError,
  CreateDbWorkerDep &
    CreateBroadcastChannelDep &
    CreateMessageChannelDep &
    DevicePersistenceDep &
    LockManagerDep &
    ReloadAppDep &
    Partial<ConsoleDep> &
    Partial<CreateMemoryInstanceWorkerDep> &
    Partial<FlushSyncDep> &
    Partial<RequestPersistentStorageDep> &
    StoredWorkerDep
>;
```

Defined in: [packages/common/src/local-first/Evolu.ts:2926](https://github.com/evoluhq/evolu/blob/aa223771feea747ffb1b0f5f3271574455633e37/packages/common/src/local-first/Evolu.ts#L2926)

Whether the app has a stored [WrappedDeviceSecret](https://evolu.dev/docs/api-reference/common/local-first/Auth/variables/WrappedDeviceSecret), without a prompt,
such as to label a button "Create account" or "Unlock". A setup that stopped
before storing it doesn't count, and where the platform keeps nothing, it's
false. It fails with [UnknownError](https://evolu.dev/docs/api-reference/common/Error/variables/UnknownError) when SQLite fails to read it or its
database is refused. Like [createEvoluApp](https://evolu.dev/docs/api-reference/common/local-first/Evolu/functions/createEvoluApp), it stays pending while
another build of the app keeps it waiting or the shared worker fails to load.
See [unlockWrappedDeviceSecret](https://evolu.dev/docs/api-reference/common/local-first/Evolu/functions/unlockWrappedDeviceSecret).

It reads without waiting for a setup running in another tab, which can store
a secret right after, so don't use it to skip the warning before starting
over; [forgetWrappedDeviceSecret](https://evolu.dev/docs/api-reference/common/local-first/Evolu/functions/forgetWrappedDeviceSecret) with `onlyPending` checks under the
setup's lock.