Skip to content

v0.68.0

Choose a tag to compare

@jleni jleni released this 08 Sep 17:12
· 2 commits to main since this release
a8b20cf

Highlights

  • Nano S support removed. Speculos dropped the model from the emulator image that zemu ships as default, so nanos is gone from TModel. The default model is now nanosp. Supported devices: Nano S+, Nano X, Stax, Flex and Apex P.
  • gRPC server works again from the npm package. Previous releases shipped zemu.proto in the wrong folder, so startGRPCServer() failed with ENOENT. The file is now next to the compiled router and a test guards it.
  • Transport keeps the @ledgerhq/hw-transport contract. getTransport().send(...) returns the response for status words listed in statusList instead of throwing. Non-0x9000 status words are still recorded, so waitUntilScreenIs, waitForText and getEvents fail fast on critical codes. getLastTransportError() and clearTransportError() are public.
  • Container lifecycle hardened. start() retries with fresh host ports when Docker reports a port conflict and removes the container on any failure after creation. stop() tolerates already-stopped and already-removed containers. Docker helpers return Promises.
  • Container pool removed. It never worked outside this repository and its cleanup removed containers of other test workers. IStartOptions.disablePool remains as a deprecated no-op.
  • Retries on a dedicated HTTP client. zemu no longer installs axios-retry interceptors on the global axios instance on every request.
  • start() no longer mutates the options object passed by the caller.
  • WINDOW_APEX is 300x400, matching Speculos.
  • Dependencies updated; pnpm audit --prod reports no advisories.

Breaking changes

  • nanos removed from TModel, checkElf and the window tables.
  • Zemu.initializePool, enablePool, disablePool, isPoolEnabled, cleanupPool and getPoolStatus removed.
  • getTransport().send(...) returns a Buffer for status words in statusList; exchange() no longer throws on non-0x9000 status words.
  • Zemu.stopAllEmuContainers() returns a Promise; startGRPCServer() returns a Promise that resolves with the bound port.

Migrating

  • Replace model: 'nanos' with 'nanosp' (or another supported model) and remove Nano S ELFs from your device list.
  • If a test relied on send(..., statusList) throwing for an accepted status word, check the last two bytes of the returned Buffer instead.
  • If you called startGRPCServer without awaiting it, await it now: bind failures reject.
  • Remove any call to the pool APIs.

Full changes: #643