Wallets & assets
Wallets, in-app payments and transfers, and member benefits, with key operations protected inside a trusted execution environment.
The wallet module gives members a wallet inside the community app: balances, in-app payments and transfers, and member benefits. Balances, transfers, payment records and benefit rules live in the operator's deployment on the wallet-service component. Wallet modules integrate a trusted execution environment (TEE) for protected key operations.
The module is in developer preview because its specified key protection — TEE — is new to Symorva. The reference deployment already runs a wallet service with on-chain deposits and withdrawals, in-app transfers, chat payments, a double-entry ledger and a separately deployed custody boundary that keeps private keys out of every business API. The TEE-backed path described here builds on that design.
Capabilities
| Capability | Status | Notes |
|---|---|---|
| In-app payments and transfers | Available in the reference deployment | PIN-confirmed, idempotent, recorded in a double-entry ledger |
| Deposits and withdrawals | Available in the reference deployment | Confirmation depth, reorganisation handling, operator withdrawal review |
| Multi-network wallet | Preview | Networks are configured per community in networks |
| TEE key protection | Preview | keyProtection: "tee" |
| Member benefits and access passes | Preview | Controlled by memberBenefits |
| Tipping | Planned | Delivered with the creator economy |
Configuration
{
"modules": {
"wallet": {
"enabled": true,
"keyProtection": "tee",
"payments": true,
"memberBenefits": true,
"networks": ["network-a", "network-b"]
}
}
}Prop
Type
Network identifiers are chosen by the operator. Identifiers that appear in CLI templates are placeholders; listing a network does not imply that Symorva operates on it or has deployed anything to it.
Key protection
In the module design, every operation that touches private key material — key generation, address derivation, signing — runs inside a trusted execution environment. The wallet service's business logic, its transaction workers, the admin console and the operator's staff request operations through a narrow interface and never handle raw keys.
The reference deployment establishes the boundary this design builds on:
- A separate custody service. Key creation and signing are exposed only as internal operations — create or recover a key and derive its address; authorise and sign a fixed-size digest — and the custody service is deployed as its own security boundary.
- Separate databases. Custody key data and signing records live in databases separate from each other and from the business database, each with its own migrations.
- Explicit policy. Allowed networks, key purposes and amount limits are explicit configuration. Withdrawals to member-chosen destinations must be enabled explicitly; other movements go only to allowlisted destinations.
- Pluggable custody models. A sealed single-key model, a 2-of-3 threshold signing model in which one compromised share cannot sign, and an external key-management service. Changing models never rewrites existing keys.
- Hot and cold separation. Online wallets pay out; cold addresses receive consolidation and their keys never enter online systems.
Exact key handling depends on the wallet implementation a community deploys — for example whether keys are held by the community's custody service or by members. TEE protection does not make on-chain transactions anonymous, does not imply any particular custody or regulatory model, and is not insurance.
Payments and confirmation
Money movement is always confirmation-driven:
- No optimistic balances. Apps show a transfer as complete only when the wallet service confirms it.
- Payment PIN. The member's PIN is encrypted on the device with the server's public key before it is sent. Biometric confirmation is enabled only when the server advertises a verification protocol for it.
- Idempotent commands. Every payment command carries a stable request identifier; retrying it cannot charge twice.
- Unknown results are queried, never resent. If the outcome of a command is unknown — for example after a network failure — the app queries the original command instead of submitting a new one.
Ledger integrity
The wallet service records every movement as balanced double-entry postings. In the reference deployment, restored backups are checked against invariants before use: postings balance and are paired, orders and refunds are posted consistently, references resolve, and no account is negative.
Events
Preview webhook events.
| Event | Fired when | Key fields |
|---|---|---|
wallet.transfer.created | A transfer is admitted | transferId, fromMemberId, toMemberId, asset, amount |
wallet.transfer.settled | A transfer completes | transferId, settledAt |
wallet.transfer.failed | A transfer fails | transferId, reason |
wallet.deposit.confirmed | A deposit reaches confirmation depth | depositId, memberId, network, asset, amount |
wallet.withdrawal.requested | A member requests a withdrawal | withdrawalId, memberId, network, asset, amount |
wallet.withdrawal.reviewed | An operator approves or rejects it | withdrawalId, decision, reviewedBy |
Privacy scope
Key operations are processed inside a trusted execution environment (TEE).
Balances and payment records are visible to the member and to operator staff with finance roles. Key material is visible to no one.
Shared services and metering
The wallet module uses no shared services and has no metered units. All wallet operations stay inside the operator's deployment.
Limits
| Field | Bound |
|---|---|
networks entries | 2 to 32 characters each |
keyProtection | tee only |
Per-network, per-asset and per-member limits are operator configuration in the wallet service.
AI & creator studio
An AI assistant, image generation, AI short dramas and product ad creation inside the community, with explicit, revocable member grants for conversation access.
DApps & ecosystem
A curated, operator-managed directory that makes partner applications and DeFi services reachable from the community, with member approval for every data request.