Logos Kit

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)

MethodUser-facingThrough intentRequired paramsRealFake
lez_connectyeslez.wallet.connectchainssilent restore; else intentsilent restore; else intent
lez_disconnect——sessionIdyesyes
lez_getSession———yesyes
lez_getAccounts———yesyes
lez_chainId———yesyes
lez_getCapabilities———yesyes
lez_getBalance——chain, accountyesyes
lez_readAccount——chain, account, programyesyes
lez_openExplorer——chainyesyes
lez_signAndSendTransactionyeslez.transaction.sendchain, account, instructionsyesyes
lez_getTransactionStatus——handleyesyes
lez_signMessageyeslez.message.signaccount, messageintent onlyintent only
lez_signInyeslez.wallet.sign_in—intent onlyintent only
lez_requestFundsyeslez.wallet.request_fundschain, accountintent onlyintent only
lez_switchChainyes—chainintent onlyintent only

Intents (opened through the Basecamp shell)

IntentMethodRealFake
lez.wallet.connectlez_connectyesyes
lez.transaction.sendlez_signAndSendTransactionyesyes
lez.message.signlez_signMessageyesyes
lez.wallet.sign_inlez_signInyesyes
lez.wallet.request_fundslez_requestFundsyesyes
lez.wallet.open— (opens the wallet)yes—

Capabilities (lez_getCapabilities)

FieldRealFake
accountKinds["public", "private"]["public", "private"]
signTransactionfalsefalse
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"]
signMessagetruetrue
signIntruetrue
requestFundstruetrue

Error codes

Whether each wallet can answer with the code (found in its source).

CodeNameDefault messageRealFake
4001UserRejectedRequest declinedyesyes
4100UnauthorizedThis app isn't connected to that accountyesyes
4200UnsupportedMethodThe wallet doesn't support this requestyesyes
4900DisconnectedWallet disconnectedyes—
4901ChainDisconnectedNetwork disconnectedyes—
4902UnknownChainUnknown networkyesyes
-32602InvalidParamsyesyes
-32603Internalyesyes
5700UnsupportedCapabilityUnsupported capabilityyes—
5720DuplicateIdDuplicate request idyesyes
5730UnknownHandleUnknown transaction handleyesyes
5740BatchTooLargeToo many instructionsyesyes
5760AtomicityUnsupportedAtomic execution isn't supportedyes—
6100AccountKindUnsupportedThis account type can't do thatyes—
6101SimulationFailedCouldn't simulate this transaction——
6102ProofFailedProof failed: nothing was sentyes—
6103SubmissionFailedThe sequencer rejected the transactionyes—
6104InvalidProposalInvalid transaction proposalyesyes
6105OriginAttestationRequiredOrigin could not be verified——
6106StaleApprovalSomething changed since you approved. Please review againyesyes
6107RequestPendingA request is already open in your walletyes—
6108TimeoutThe wallet didn't respondyesyes
6109UnavailableThe wallet isn't availableyesyes

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).

NotificationRealFake
lez_accountsChanged——
lez_chainChanged——
lez_sessionChanged——
lez_disconnected——
lez_transactionUpdated——
lez_capabilitiesChanged——

Fake wallet scenarios

ScenarioWhat the fake does
happyConnect 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.
rejectThe user declines every wallet prompt: each intent answers cancelled (LWS-0 4001).
timeoutLike happy, but the send intent answers only after 50 s: the SDK times out at 45 s (6108) and the handle arrives late (onLateResult).
staleThe send is approved, then the chain moved: status goes signing → dropped with error 6106 (StaleApproval). Nothing was sent.
unknown_outcomeThe send is included but the wallet can't tell whether it worked: included, outcome unknown, outcomeSource none.
failed_onchainThe send is included and failed on chain: included, outcome failure (own-account-invariant).
rate_limitedBalance 0. The faucet refuses: rate_limited, retryAfterSeconds 60. Everything else is happy.
faucet_unknownBalance 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_fundsBalance 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_switchAfter 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.
unavailableThe wallet is not running: every method answers 6109, every intent unavailable.

On this page