Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<!--
Thanks for contributing to the Wallet Directory Program. Fill in the
section(s) that apply and delete the rest. See CONTRIBUTING.md for the full
process.
-->

### Type of submission
<!-- check one -->
- [ ] New wallet application
- [ ] Update to an existing wallet's feature support
- [ ] Third-party verification (confirmed, or disputed as unsupported) of an existing claim
- [ ] Marking a feature as not supported, with a reason

### Summary

<!-- One or two sentences: what is this PR doing and why. -->

### Checklist

- [ ] `wallets/<wallet-name>.yaml` added or updated (self-attestation)
- [ ] A heading added to `proofs/<wallet-name>/<wallet-name>-self-attestation.md`
for every feature newly claimed as `supported: true`
- [ ] `python scripts/generate_table.py` was run and the regenerated
`WALLET_DIRECTORY.md` is included in this PR (a CI check will catch
this if it's missed, but running it locally saves a round trip)
- [ ] If applying for the first time: confirmed membership in
`#ext-temp-party-scaling` and set `slack_party_scaling_channel_joined: true`
- [ ] If marking a feature as not supported: reason filled in under that
feature's `reason:` field, not just left blank
- [ ] If this is a verification: the heading added to
`proofs/<wallet-name>/<wallet-name>-third-party-attestation.md`
reflects evidence gathered independently, not copied from the
wallet's self-attestation, and `result` on the matching
`verified_by` entry is set to `verified` or `unsupported` to match

### Additional context

<!-- Anything reviewers should know: links, related Slack threads, etc. -->
32 changes: 32 additions & 0 deletions .github/workflows/verify-wallet-directory.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Verify WALLET_DIRECTORY.md

# Regenerates WALLET_DIRECTORY.md from wallets/*.yaml and fails the PR if the
# committed file doesn't match. generate_table.py has no dependencies, so
# this workflow needs no install step -- it just runs the script.

on:
pull_request:
paths:
- "wallets/**"
- "scripts/**"
- "WALLET_DIRECTORY.md"

jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.x"

- name: Regenerate WALLET_DIRECTORY.md
run: python3 scripts/generate_table.py

- name: Fail if WALLET_DIRECTORY.md is out of date
run: |
if ! git diff --exit-code -- WALLET_DIRECTORY.md; then
echo "::error file=WALLET_DIRECTORY.md::WALLET_DIRECTORY.md is out of date with wallets/*.yaml. Run 'python3 scripts/generate_table.py' locally and commit the regenerated file."
exit 1
fi
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
__pycache__/
*.pyc
.DS_Store
173 changes: 173 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# Contributing to the Wallet Directory Program

This repo is the source of truth for the Canton Foundation's Wallet
Directory Program: which wallet providers support which Canton Network
features, and the public evidence backing each claim. This file explains
how it all works -- for both wallet providers and third-party
verifiers.

## How the program works

1. A wallet provider self-attests to feature support by opening a PR that
adds or edits `wallets/<wallet-name>.yaml`, with evidence in
`proofs/<wallet-name>/<wallet-name>-self-attestation.md`.
2. Wallet providers must also join and stay active in
`#ext-temp-party-scaling`, and be able to demonstrate sign-up
rate-limiting / circuit-breaker controls (tracked in
`slack_party_scaling_channel_joined`).
3. The Canton Foundation reviews and merges the PR.
4. Anyone -- individuals or organizations not affiliated with the wallet --
can independently verify a claim by adding a heading with their evidence
to `proofs/<wallet-name>/<wallet-name>-third-party-attestation.md` and a
`verified_by` entry in the wallet's YAML.
5. `WALLET_DIRECTORY.md` is generated from all `wallets/*.yaml` files and is
the public page people read. Never edit it by hand.

## The three places data lives

- **`WALLET_DIRECTORY.md`** -- the generated summary table everyone reads.
Never edit it by hand; it's produced by `scripts/generate_table.py`.
- **`wallets/<wallet-name>.yaml`** -- one file per wallet provider, holding
their name, website, and their claim (`supported: true/false`) on every
feature. This is the only file a wallet provider edits to update their
listing.
- **`proofs/<wallet-name>/`** -- one folder per wallet provider, holding the
evidence behind those claims:
```
proofs/
<wallet-name>/
<wallet-name>-self-attestation.md <- the wallet's own evidence, one heading per feature
<wallet-name>-self-attestation-images/ <- screenshots/recordings referenced from the self-attestation.md file
<wallet-name>-third-party-attestation.md <- independent verifiers' evidence, one heading per (feature, verifier)
<wallet-name>-third-party-attestation-images/ <- screenshots/recordings referenced from the third-party-attestation.md file
```
Self-attestation and third-party verification are kept in separate files
because a verifier's evidence must be independently gathered, not copied
from the wallet's own claims -- separate files make that easy to audit.
Each heading covers one feature, formatted exactly as it appears in
`wallets/_feature_registry.yaml`, e.g.:
```markdown
## CC support (transfers and holding) `cc_support`
```
In the third-party attestation file, each heading also names the verifier
and the outcome (see "Third-party verification" below), and is unique per
(feature, verifier) pair, so more than one verifier can check the same
feature. The heading text matters: GitHub turns it into the page anchor
that `WALLET_DIRECTORY.md` and the wallet's `proof:` /
`verified_by[].proof` fields link to -- keep headings exactly as shown
and don't reuse one for two different features. Free-text features
(Wallet Type block, `key_generation_method`, `assets_supported`,
`languages_supported`) never get a heading here as there's no link to
proof.

## Applying as a new wallet provider

1. Copy `wallets/TEMPLATE.yaml` to `wallets/<your-wallet-name>.yaml` and
fill it in -- every feature is already listed there with a description
and suggested test, in order. See `examples/acme-wallet.yaml` for a
worked (fictional) example.
2. Copy `proofs/_TEMPLATE/TEMPLATE-self-attestation.md` to
`proofs/<your-wallet-name>/<your-wallet-name>-self-attestation.md` and
add a heading for every feature you mark `supported: true` and want to
back with evidence -- only the ones you're claiming. Put screenshots/videos in
`proofs/<your-wallet-name>/<your-wallet-name>-self-attestation-images/`
(create that folder alongside the `.md` file) and reference them from
your heading. Unproven claims are allowed, but evidence makes your
listing more credible to readers. See
`proofs/dummy-wallet/dummy-wallet-self-attestation.md` for a worked
example. Reference the resulting file + heading anchor in that
feature's `proof:` field in your wallet YAML.

A handful of boolean features are marked `self_attested_only: true` in
`wallets/_feature_registry.yaml` -- generic wallet capabilities (e.g.
key recovery, threshold signing, compliance certifications) that don't
require proof. For those, just set `supported` (and `reason` if false)
in your wallet YAML and skip `proof`/`verified_by` and the evidence
heading entirely -- there's no mechanism to back or verify these claims.
3. Run `python3 scripts/generate_table.py` and include the regenerated
`WALLET_DIRECTORY.md` in your PR. No install step -- it only uses the
Python standard library, so any Python 3 works.
4. Open a PR using the pull request template. A maintainer will review
and, once approved, merge your PR.

## Updating an existing listing

Same process, but scoped to the fields that changed. Because each wallet
has its own YAML file, your PR only touches your own file (plus the
generated `WALLET_DIRECTORY.md`) -- it won't conflict with other wallets'
submissions.

## Marking a feature as not supported

If you don't support a feature -- because it doesn't apply to your
product, it's not built yet, or any other reason -- you can leave the
feature out of your YAML entirely, and it'll render as "—" on
`WALLET_DIRECTORY.md`. If you'd rather give readers a reason instead of
silence, set `supported: false` and add `reason: "<short explanation>"`
under that feature. There's no approval or waiver involved -- it's just an
optional way to be upfront about a gap instead of leaving it blank. The
cell then reads "Not supported" and links to your wallet's YAML file where
the reason is written.

## Third-party verification

Anyone not affiliated with the wallet provider can verify a claim, for any
feature except one marked `self_attested_only: true` in
`wallets/_feature_registry.yaml` -- those are generic wallet capabilities
that aren't Canton Network specific, so there's nothing to independently
test; they're self-attested claims only, with no verification mechanism.
To verify a feature that does support it:

1. Independently reproduce the feature's test where one is defined (see
`suggested_test` in `wallets/_feature_registry.yaml`) -- do not simply
copy the wallet's self-attestation.
2. Copy `proofs/_TEMPLATE/TEMPLATE-third-party-attestation.md` to
`proofs/<wallet-name>/<wallet-name>-third-party-attestation.md` (or add
a heading to the existing file if one's already there), formatted as
`## <Feature name> \`<feature_id>\` — Verified by <Your Name>`, and fill
in your evidence underneath (screenshots/videos go in the matching
`-images/` folder).
3. Add an entry to that feature's `verified_by` list in the wallet's YAML:
```yaml
verified_by:
- by: Your Name or Org
date: "2026-07-01"
result: verified
proof: proofs/<wallet-name>/<wallet-name>-third-party-attestation.md#<anchor-for-your-heading>
```
4. Run `python3 scripts/generate_table.py` and include the regenerated
`WALLET_DIRECTORY.md` in your PR, same as a wallet provider would.
5. Open a PR. Once merged, that feature's cell on `WALLET_DIRECTORY.md`
links your name (with a 🛡️) to your evidence, alongside the wallet's
own self-attestation link.

### Unverified features

If you can't verify a feature leave it blank.

If instead you're able to show a feature isn't actually supported, despite
the wallet claiming `supported: true`, mark it as unsupported:

- Add a heading `## <Feature name> \`<feature_id>\` — Unsupported by <Your Name>`
to the third-party attestation file, with your evidence that the feature
doesn't work as claimed.
- Add a `verified_by` entry with `result: unsupported` (instead of
`result: verified`), pointing at that heading.

That feature's cell on `WALLET_DIRECTORY.md` then shows a ❌ next to your
name, linked to your evidence, alongside the wallet's own claim -- so
readers see the dispute rather than a plain, unchallenged ✅.

## Regenerating the summary page

`WALLET_DIRECTORY.md` is generated, never hand-edited:

```
python3 scripts/generate_table.py
```

Run this locally after any change to a file under `wallets/` and commit
the result. It has no dependencies to install. A GitHub Action
(`.github/workflows/verify-wallet-directory.yml`) also regenerates and
diffs this file on every PR touching `wallets/` or `scripts/`, and fails
the check if it's out of sync, in case you forget.
19 changes: 17 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,17 @@
# wallets
Wallets
# Wallets

Source of truth for the Canton Foundation's **Wallet Directory Program**:
which wallet providers support which Canton Network features, and the
public evidence backing each claim.

- **[WALLET_DIRECTORY.md](./WALLET_DIRECTORY.md)** -- the generated summary
page. Start here.
- **[CONTRIBUTING.md](./CONTRIBUTING.md)** -- how to add a wallet, update a
listing, or verify someone else's claim.
- **`wallets/`** -- one YAML file per wallet provider (their
self-attestation) plus `_feature_registry.yaml`, the single source of
truth for feature IDs, names, and required-feature tests.
- **`proofs/`** -- evidence backing each claim, self-attested and
independently verified, organized by wallet and feature.
- **`scripts/generate_table.py`** -- regenerates `WALLET_DIRECTORY.md` from
the `wallets/` directory.
70 changes: 70 additions & 0 deletions WALLET_DIRECTORY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<!--
GENERATED FILE -- do not edit by hand.
Source of truth: wallets/*.yaml + wallets/_feature_registry.yaml
Regenerate with: python3 scripts/generate_table.py
-->

# Wallet Directory

Source of truth for Canton Network wallet providers' supported features and
assets, per the Wallet Directory Program (see [CONTRIBUTING.md](./CONTRIBUTING.md)).

**Legend:** ✅ self-attested -- click through to the evidence · 🛡️ *name* verified by an
independent third party -- click the name for their evidence · ❌ *name* found this claim to
be unsupported, contradicting the wallet -- click the name for their evidence · a linked
"Not supported" means the wallet has said no with a reason ·
— no claim made either way.

## Wallet Overview & Primary Canton Network Features

| Feature | [Dummy Wallet](wallets/dummy-wallet.yaml) |
|---|---|
| **Wallet Overview** | |
| &nbsp;&nbsp;&nbsp;&nbsp;Website | [https://example.com/dummy-wallet](https://example.com/dummy-wallet) |
| &nbsp;&nbsp;&nbsp;&nbsp;Added | 2026-06-10 |
| **Wallet Type** | |
| &nbsp;&nbsp;&nbsp;&nbsp;Retail / Enterprise | retail, enterprise |
| &nbsp;&nbsp;&nbsp;&nbsp;Custody Type | self-custodial |
| &nbsp;&nbsp;&nbsp;&nbsp;Form factor (Mobile / Browser / Desktop / Browser Extension / Hardware) | browser, mobile |
| &nbsp;&nbsp;&nbsp;&nbsp;Deployment Model (Self-hosted / SaaS / Hybrid) | saas, hybrid |
| **Canton Coin** | |
| &nbsp;&nbsp;&nbsp;&nbsp;CC support (transfers and holding) | [✅](proofs/dummy-wallet/dummy-wallet-self-attestation.md#cc-support-transfers-and-holding-cc_support) 🛡️[Blockdaemon](proofs/dummy-wallet/dummy-wallet-third-party-attestation.md#cc-support-transfers-and-holding-cc_support-verified-by-blockdaemon) |
| &nbsp;&nbsp;&nbsp;&nbsp;Pre-approvals for CC | [✅](proofs/dummy-wallet/dummy-wallet-self-attestation.md#pre-approvals-for-cc-preapprovals) |
| **Token Standard** | |
| &nbsp;&nbsp;&nbsp;&nbsp;CIP-0056 token standard transfer support | [✅](proofs/dummy-wallet/dummy-wallet-self-attestation.md#cip-0056-token-standard-transfer-support-cip_0056_transfer) |
| &nbsp;&nbsp;&nbsp;&nbsp;CIP-0056 token standard allocation support | — |
| &nbsp;&nbsp;&nbsp;&nbsp;CIP-112 token standard v2 support | ✅ |
| **Interoperability** | |
| &nbsp;&nbsp;&nbsp;&nbsp;CIP-0103 dApp API support | [✅](proofs/dummy-wallet/dummy-wallet-self-attestation.md#cip-0103-dapp-api-support-cip_0103_dapp_api) |
| &nbsp;&nbsp;&nbsp;&nbsp;Wallet Connect support | [Not supported](wallets/dummy-wallet.yaml) |
| &nbsp;&nbsp;&nbsp;&nbsp;Memo tag support for transfers to exchanges | [✅](proofs/dummy-wallet/dummy-wallet-self-attestation.md#memo-tag-support-for-transfers-to-exchanges-memo_tag_support) |

## Other Features

| Feature | [Dummy Wallet](wallets/dummy-wallet.yaml) |
|---|---|
| **App Specific** | |
| &nbsp;&nbsp;&nbsp;&nbsp;Pre-approvals for DA Registry issued assets | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Wallet Gateway signing driver | — |
| **Party Specific** | |
| &nbsp;&nbsp;&nbsp;&nbsp;Key generation method | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Key recovery | ✅ |
| &nbsp;&nbsp;&nbsp;&nbsp;Social recovery | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Multi-address / account | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Distributed parties | — |
| **Network relevant features** | |
| &nbsp;&nbsp;&nbsp;&nbsp;UTXO merge delegation contract enabled | — |
| **Transaction Signing** | |
| &nbsp;&nbsp;&nbsp;&nbsp;Policy workflows | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Threshold Signature Scheme | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Hardware wallet support | ✅ |
| **Wallet Capabilities** | |
| &nbsp;&nbsp;&nbsp;&nbsp;Compliance | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Validator hosting (self-hosted / BYOV) | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Tokenization | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Reward minting | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Transfer object / proof of transfer support | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Clear signing | ✅ |
| &nbsp;&nbsp;&nbsp;&nbsp;Integrated swaps | — |
| &nbsp;&nbsp;&nbsp;&nbsp;Assets supported | CC, USDC (CIP-0056), Example Token (CIP-0056) |
| &nbsp;&nbsp;&nbsp;&nbsp;Languages supported | English, German |
Loading
Loading