Changelog
Protocol and SDK changes that affect integrators.
A running log of the changes that move user-visible SDK or on-chain behaviour. Internal refactors and perf work are summarised when they affect CU budgets or account sizes.
2026-04-20 — Phase 2.1 & API unification
Breaking
- Mode 0 dropped. The Secp256r1 auth path now only supports raw
clientDataJSONfrom a real browser authenticator.Secp256r1Signer.sign()must returnclientDataJson; thetypeAndFlagsparameter ofbuildAuthPayloadis gone. Bot / programmatic signing should use Ed25519 authorities instead. - Authority account layout changed. Secp256r1 authorities now store
rpIdHash(32 bytes) instead of the variable-lengthrpIdstring. Account size is fixed at 145 bytes (Ed25519 authorities stay at ~80 bytes). Instruction data forCreateWallet/AddAuthority/TransferOwnershipis unchanged — clients still sendrpId; the program hashes it once at write time. - Unified prepare/finalize API. Every Secp256r1 op now has a matching
client.prepare*/client.finalize*pair —prepareExecute/finalizeExecute,prepareCreateSession/finalizeCreateSession, etc. The old*Preparemethods that returned an embeddedfinalizeclosure are gone. - Fee model. Protocol fee is now charged on every transaction when the protocol
is enabled — not opt-in per
fee_payer. Registering aFeeRecordis opt-in for reward tracking; unregistered payers still pay the fee but don't accumulate a claim at token launch.
Improvements
- CU reductions. Execute Secp256r1:
10,883 → 9,495 CU(-12.8%). Execute Session:4,723 → 4,105 CU(-13.1%). Zero-copy compact instructions + elimination of Vec concats in the hot path. publicKeyBytesauto-fetch.Secp256r1Params.publicKeyBytesis now optional — the client reads the pubkey off the on-chain Authority account via the newreadAuthorityPubkeyhelper. Integrators only need to persistcredentialIdHashper user.- Serializable
DeferredPayload. NewserializeDeferredPayload()/deserializeDeferredPayload()helpers turn a payload into JSON-safe bytes. Unblocks cross-machine deferred flows (sign TX1 on the user's device, submit TX2 from a server relayer).
Security hardening
H1— vault / token invariants enforced around CPIs in session+actions execute (prevents round-trip swap bypass ofSolMaxPerTx).H2— admin paths require program-ownedProtocolConfigandTreasuryShardaccounts (prevents account-spoofing on withdraw / update).M1—clientDataJSONparser correctly skips strings nested inside objects.payerandadminAuthoritymetas switched to writable where required for rent refunds.
What to do
RN SDK upgrade guide
wallet-mobile-adapter ≥ 2.0.0 — no code changes for consumers, internal methods renamed.
React SDK upgrade guide
@lazorkit/wallet upgrades bring prepare/finalize + publicKeyBytes optional.
web3.js v1 types
Updated Secp256r1Params + cross-machine deferred helpers.
Troubleshooting
Full error code map kept in sync — including 0xbd0 session exhaustion.
Earlier milestones
- Solita artifacts removed. The SDK is now fully hand-written for fine-grained control over wire layout. No IDL-generated wrappers remain.
- Protocol fee system live on mainnet. Sharded treasury (16 shards by default),
per-
fee_payerFeeRecordcounters, fees collected in native SOL. - Seedless + session.money launched. First production integrators running on the LazorKit execution layer.
For the authoritative change history, browse the
lazorkit-protocol git log.