@cantonconnect/adapter-starter
v0.1.3
Published
Starter template for building CantonConnect wallet adapters
Downloads
298
Readme
CantonConnect Adapter Starter
A starter template for building wallet adapters for CantonConnect SDK.
Quick Start
Copy this package to your project:
cp -r packages/adapter-starter packages/adapters/my-walletRename and customize:
- Rename
adapter.tsto match your wallet (e.g.,mywallet-adapter.ts) - Update
walletIdandnamein the adapter class - Update
package.jsonname and description
- Rename
Implement required methods:
detectInstalled()- Check if wallet is availableconnect()- Establish connection and return partyIdgetCapabilities()- Return supported capabilities
Implement optional methods (if supported):
signMessage()- Sign messagessignTransaction()- Sign transactionssubmitTransaction()- Submit transactionsrestore()- Restore sessions
Run conformance tests:
cantonconnect-conformance run --adapter ./dist
Adapter Contract
All adapters must implement the WalletAdapter interface from @cantonconnect/core:
interface WalletAdapter {
readonly walletId: WalletId;
readonly name: string;
getCapabilities(): CapabilityKey[];
detectInstalled(): Promise<AdapterDetectResult>;
connect(ctx: AdapterContext, opts?): Promise<AdapterConnectResult>;
disconnect(ctx: AdapterContext, session: Session): Promise<void>;
// Optional methods:
restore?(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null>;
signMessage?(ctx: AdapterContext, session: Session, params: SignMessageParams): Promise<SignedMessage>;
signTransaction?(ctx: AdapterContext, session: Session, params: SignTransactionParams): Promise<SignedTransaction>;
submitTransaction?(ctx: AdapterContext, session: Session, params: SubmitTransactionParams): Promise<TxReceipt>;
}Capability Mapping
Declare capabilities your wallet supports:
connect- Required: wallet can connectdisconnect- Required: wallet can disconnectrestore- Optional: wallet supports session restorationsignMessage- Optional: wallet can sign messagessignTransaction- Optional: wallet can sign transactionssubmitTransaction- Optional: wallet can submit transactionsevents- Optional: wallet emits eventsinjected- Optional: browser extension (injected script)popup- Optional: uses popup flowdeeplink- Optional: uses deep link flowremoteSigner- Optional: enterprise remote signer
Error Mapping
Always use mapUnknownErrorToCantonConnectError() to normalize errors:
try {
// Wallet SDK call
} catch (err) {
throw mapUnknownErrorToCantonConnectError(err, {
walletId: this.walletId,
phase: 'connect', // or 'signMessage', 'signTransaction', etc.
transport: 'injected', // or 'popup', 'deeplink', 'remote'
});
}Install Hints
For registry entry, provide installHints:
{
"installHints": {
"injectedKey": "myWallet", // window.myWallet
"extensionId": "abc123...", // Chrome extension ID
"deepLinkScheme": "mywallet", // mywallet://
"universalLinkBase": "https://app.mywallet.com"
}
}Origin Allowlist
If your wallet supports origin allowlist, include it in registry entry:
{
"originAllowlist": [
"https://myapp.com",
"https://*.myapp.com"
]
}SDK will enforce this automatically.
Testing
Local Conformance Tests
# Build your adapter
pnpm build
# Run conformance tests
cantonconnect-conformance run --adapter ./dist
# View report
cantonconnect-conformance report --input conformance-report.jsonIntegration Testing
Test your adapter in a demo dApp:
import { createCantonConnect } from '@cantonconnect/sdk';
import { MyWalletAdapter } from '@mywallet/adapter';
const client = createCantonConnect({
registryUrl: 'https://registry.cantonconnect.io',
network: 'devnet',
app: { name: 'My dApp' },
});
// Register adapter
client.registerAdapter(new MyWalletAdapter());
// Connect
const session = await client.connect({ walletId: 'mywallet' });Security Checklist
- ✅ State parameter (nonce) for CSRF protection
- ✅ Origin validation
- ✅ Redirect URI validation
- ✅ Timeout enforcement
- ✅ Error mapping (never expose sensitive errors)
- ✅ No private keys stored (only session metadata)
- ✅ Signing payload display (user-friendly format)
See docs/security-checklist.md for complete checklist.
Registry Onboarding
Add to beta registry:
cantonconnect-registry add-wallet \ --channel beta \ --walletId mywallet \ --name "My Wallet" \ --adapterPackage "@mywallet/adapter" \ --adapterRange "^1.0.0" \ --capabilities connect,disconnect,signMessage \ --installHints '{"injectedKey":"myWallet"}' \ --docs '["https://docs.mywallet.com"]'Run conformance tests (must pass)
Promote to stable:
cantonconnect-registry promote --from beta --to stable
See docs/registry-onboarding.md for detailed workflow.
Examples
See existing adapters for reference:
packages/adapters/console- Browser extension adapterpackages/adapters/loop- QR code/popup adapterpackages/adapters/cantor8- Deep link adapter with vendor modulepackages/adapters/bron- Enterprise remote signer adapter
Support
- Documentation:
docs/wallet-provider-guide.md - Issues: GitHub Issues
- Security: [email protected]
