Capability matrix
Every LWS-0 method, intent and error code, and which ones the Logos Kit wallet and the conformance fake support.
Generated by scripts/capability-matrix.py (just capability-matrix); don't edit by hand.
Protocol 0.1.0. Real is the Logos Kit wallet (core logos_kit_wallet +
UI logos_kit_wallet_ui); fake is the conformance fake (modules/logos_kit_wallet_fake).
Methods (called on the wallet core module)
| Method | User-facing | Through intent | Required params | Real | Fake |
|---|---|---|---|---|---|
lez_connect | yes | lez.wallet.connect | chains | silent restore; else intent | silent restore; else intent |
lez_disconnect | — | — | sessionId | yes | yes |
lez_getSession | — | — | — | yes | yes |
lez_getAccounts | — | — | — | yes | yes |
lez_chainId | — | — | — | yes | yes |
lez_getCapabilities | — | — | — | yes | yes |
lez_getBalance | — | — | chain, account | yes | yes |
lez_readAccount | — | — | chain, account, program | yes | yes |
lez_openExplorer | — | — | chain | yes | yes |
lez_signAndSendTransaction | yes | lez.transaction.send | chain, account, instructions | yes | yes |
lez_getTransactionStatus | — | — | handle | yes | yes |
lez_signMessage | yes | lez.message.sign | account, message | intent only | intent only |
lez_signIn | yes | lez.wallet.sign_in | — | intent only | intent only |
lez_requestFunds | yes | lez.wallet.request_funds | chain, account | intent only | intent only |
lez_switchChain | yes | — | chain | intent only | intent only |
Intents (opened through the Basecamp shell)
| Intent | Method | Real | Fake |
|---|---|---|---|
lez.wallet.connect | lez_connect | yes | yes |
lez.transaction.send | lez_signAndSendTransaction | yes | yes |
lez.message.sign | lez_signMessage | yes | yes |
lez.wallet.sign_in | lez_signIn | yes | yes |
lez.wallet.request_funds | lez_requestFunds | yes | yes |
lez.wallet.open | — (opens the wallet) | yes | — |
Capabilities (lez_getCapabilities)
| Field | Real | Fake |
|---|---|---|
accountKinds | ["public", "private"] | ["public", "private"] |
signTransaction | false | false |
batch | { "maxInstructions": 1, "atomic": "unsupported" } | { "maxInstructions": 1, "atomic": "unsupported" } |
proving | { "location": "local", "typicalSeconds": ETA_SHIELD_S } | { "location": "local", "typicalSeconds": 270 } |
outcomeVerification | ["own-account-invariant"] | ["own-account-invariant"] |
signMessage | true | true |
signIn | true | true |
requestFunds | true | true |
Error codes
Whether each wallet can answer with the code (found in its source).
| Code | Name | Default message | Real | Fake |
|---|---|---|---|---|
| 4001 | UserRejected | Request declined | yes | yes |
| 4100 | Unauthorized | This app isn't connected to that account | yes | yes |
| 4200 | UnsupportedMethod | The wallet doesn't support this request | yes | yes |
| 4900 | Disconnected | Wallet disconnected | yes | — |
| 4901 | ChainDisconnected | Network disconnected | yes | — |
| 4902 | UnknownChain | Unknown network | yes | yes |
| -32602 | InvalidParams | yes | yes | |
| -32603 | Internal | yes | yes | |
| 5700 | UnsupportedCapability | Unsupported capability | yes | — |
| 5720 | DuplicateId | Duplicate request id | yes | yes |
| 5730 | UnknownHandle | Unknown transaction handle | yes | yes |
| 5740 | BatchTooLarge | Too many instructions | yes | yes |
| 5760 | AtomicityUnsupported | Atomic execution isn't supported | yes | — |
| 6100 | AccountKindUnsupported | This account type can't do that | yes | — |
| 6101 | SimulationFailed | Couldn't simulate this transaction | — | — |
| 6102 | ProofFailed | Proof failed: nothing was sent | yes | — |
| 6103 | SubmissionFailed | The sequencer rejected the transaction | yes | — |
| 6104 | InvalidProposal | Invalid transaction proposal | yes | yes |
| 6105 | OriginAttestationRequired | Origin could not be verified | — | — |
| 6106 | StaleApproval | Something changed since you approved. Please review again | yes | yes |
| 6107 | RequestPending | A request is already open in your wallet | yes | — |
| 6108 | Timeout | The wallet didn't respond | yes | yes |
| 6109 | Unavailable | The wallet isn't available | yes | yes |
Notifications
Basecamp modules can't push LWS-0 notifications to an app; wallets emit request_updated and
wallet_event module events, and apps poll (the SDK does).
| Notification | Real | Fake |
|---|---|---|
lez_accountsChanged | — | — |
lez_chainChanged | — | — |
lez_sessionChanged | — | — |
lez_disconnected | — | — |
lez_transactionUpdated | — | — |
lez_capabilitiesChanged | — | — |
Fake wallet scenarios
| Scenario | What the fake does |
|---|---|
happy | Connect shares one public account (and a private handle if asked). Balance 1000000000. A send answers a handle; status reads go submitted → included/success. The faucet funds 1000000000. |
reject | The user declines every wallet prompt: each intent answers cancelled (LWS-0 4001). |
timeout | Like happy, but the send intent answers only after 50 s: the SDK times out at 45 s (6108) and the handle arrives late (onLateResult). |
stale | The send is approved, then the chain moved: status goes signing → dropped with error 6106 (StaleApproval). Nothing was sent. |
unknown_outcome | The send is included but the wallet can't tell whether it worked: included, outcome unknown, outcomeSource none. |
failed_onchain | The send is included and failed on chain: included, outcome failure (own-account-invariant). |
rate_limited | Balance 0. The faucet refuses: rate_limited, retryAfterSeconds 60. Everything else is happy. |
faucet_unknown | Balance 0. The faucet answer is lost: outcome_unknown. The funds do arrive (balance +1000000000), so a dApp that re-reads the balance finds them. |
no_funds | Balance 0. A send is refused by the wallet (intent answers failed, as in every scenario while the account is empty); the faucet funds 1000000000, after which sends work. |
network_switch | After the first connect, the user switches the wallet to lez:local: the next lez_chainId answers lez:local, the old session is gone and calls naming the old chain get 4902. |
unavailable | The wallet is not running: every method answers 6109, every intent unavailable. |