Tempo Passkey (P-256 / WebAuthn) Integration
Tempo Passkey (P-256 / WebAuthn) Integration
Accept Tempo root-passkey wallets for EVM credits redemption on the Tempo chain.
Overview
Tempo passkey users control a Tempo account with a P-256 / WebAuthn passkey. The passkey private key stays in the user’s authenticator/keychain, and the Tempo account address is derived from the passkey public key. Coinflow’s Tempo credits-redemption path accepts root WebAuthn passkey signatures for credits-only redemptions, so users do not need a separate MetaMask-style secp256k1 wallet for this flow.
This page covers what you need to do on the merchant side to wire a Tempo
passkey wallet into <CoinflowPurchase>. The recommended integration uses
Tempo’s wagmi webAuthn connector
and a production key manager as described in
Tempo’s embed-passkeys guide.
Coinflow does not create or store passkeys for the merchant; your app owns the
Tempo registration/sign-in UI and passes a compatible EthWallet adapter into
Coinflow.
If you are also settling to a merchant contract on Tempo, your contract must be whitelisted first. See Whitelist Your Contracts.
What’s supported
Tempo checkout does not support partial Credits + USDC top-up. The iframe
hides the USDC toggle on Tempo, and direct API callers get a 400 response
for usdcAmount > 0. Use a full-credits payment instead.
How it works
- Your app — hosts the registration / sign-in UI, manages the Tempo
passkey session via wagmi, and exposes a standard
EthWalletadapter to<CoinflowPurchase>. The adapter routes the signing request that Coinflow sends throughsignMessageto the Tempo connector — no other changes to how you embed Coinflow are needed. - Coinflow — verifies the passkey signature, submits the redemption transaction on your behalf, and returns the result to your app. Passkey wallets work the same way secp256k1 wallets do from your integration’s point of view.
- Networks — Coinflow supports Tempo mainnet and the Moderato testnet. No extra configuration is required on your side when switching between them beyond the wagmi chain id.
Merchant integration
1. Configure the Tempo webAuthn connector in your wagmi config
Register Tempo’s WebAuthn connector alongside your existing EVM connectors. Use a remote key manager in production. Local storage is acceptable only for local demos because it stores the credential/public-key mapping in the browser; the passkey key material remains in the authenticator, but clearing storage or switching devices breaks lookup.
KeyManager.localStorage() is demo-only — ship a server-backed
KeyManager.http(url) before production. The snippet below disables the
connector entirely when VITE_TEMPO_KEY_MANAGER_URL is missing in a
production build so you don’t silently fall back to browser storage.
2. Drive sign-up / sign-in through wagmi
The connector accepts a capabilities argument on connect() that selects
between registering a new passkey (sign-up) and authenticating with an
existing one (sign-in). Pass the Tempo chain id when connecting so the
connector session is created for the same Tempo network that Coinflow will use.
3. Adapt the wagmi session to an EthWallet for <CoinflowPurchase>
Coinflow’s iframe passes EIP-712 typed data into signMessage as a
JSON-stringified object, the same shape secp256k1 merchants already handle.
Parse the string, detect the EIP-712 shape, and route typed data through
wagmi’s useSignTypedData (which invokes the Tempo connector under the
hood). Let typed-data errors surface — do not retry as personal_sign.
Compose the gate, adapter hook, and <CoinflowPurchase>:
4. Hide the USDC top-up toggle on Tempo
Partial Credits + USDC is not supported on Tempo. Pass
partialUsdcChecked={false} when blockchain === 'tempo' so the option is not
offered to users:
If a direct API caller bypasses the UI, /redeem/evm/creditsAuthMsg returns
400 with:
If a caller reaches /redeem/evm/sendGaslessTx with a Tempo passkey signature
and customerUsdcAuthData, Coinflow rejects the request — root passkey
redemptions are credits-only.
Login signatures
The same signMessage adapter you wired in step 3 also handles Coinflow’s
login challenge — no extra client-side work is required for users to sign
in with their Tempo passkey.
Errors your users may see
The Coinflow iframe surfaces these messages to the user during the Tempo passkey flow:
Operational notes
- Production key storage. Use
KeyManager.http(url)pointed at a server-side key store for production.KeyManager.localStorage()is demo-only because it stores the credential/public-key mapping in the browser, so the app cannot recover the mapping after browser storage is cleared or the user switches devices. - Only required for Tempo passkey users. If a merchant never needs root passkey support, this integration is optional — standard EVM wallets on Tempo continue to work through Coinflow’s normal EVM flow.
Related documentation
- Implement Settlement to EVM Contract — baseline EVM settlement guide.
- How EVM Transactions Work — lifecycle of a Coinflow EVM transaction.
- Whitelist Your Contracts — whitelisting prerequisite for merchants settling to a contract.

