接続と署名のシートは Casa を主役にします。その色、その家、その名前、そのアドレス。Casa Tookan は、どの Casa がどのサイトに接続したかをこの端末に記録します。適切な Casa を提案しますが、勝手に切り替えることはなく、適切な Bitcoin アドレスを選びます。同じシートが、アプリ内ブラウザ、WalletConnect、そして casatookan:// リンクでログインするアプリに応答します。
例のウォレット:2 つのエステートに 3 つの Casa、さらにインポートした鍵。「Casa Yodark」は Farcaster アカウント @yodark を所有し、すでに Velocimon に接続しています。アクティブな Casa は「Ma Casa」です。
シートの主役は Casa です。ユーザーの操作なしには何も変わりません。アクティブな Casa が選ばれたままで、そのサイトをすでに知っている Casa をワンタップで提案します。
Velocimonには選んだCasaのアドレスが表示されます。
選択は同じシートの中(‹ 戻る)で行われ、リクエストは失われません。各行には、このサイトにとってその Casa の何が特別かが表示されます。互換性のない Casa は消えずに、理由とともに表示されたままです。
「使う」をタップすると、トーストが切り替えを知らせ、元に戻すこともできます。ボタンには「承認」のような汎用の文言の代わりに、使うアイデンティティ(@yodark)が表示されます。
VelocimonはFarcasterアカウントでサインインします。
説明のない無効ボタンはありません。メインのアクションが解決策になります。Farcaster アカウントを持つ Casa がない場合は「Farcasterアカウントをインポート」(リカバリーフレーズ)になります。
履歴がない場合は SegWit があらかじめ選択されます。各タイプにはアドレスの先頭(bc1q、1、bc1p)が表示されるので、サイトに表示されるアドレスと見比べられます。
Legacy にコインや Counterparty アセットがあり、SegWit が空の場合は、Legacy があらかじめ選択され、その理由がはっきり表示されます(「12件のアセット · 0.0042 BTC」)。ユーザーはいつでも変更できます。
署名とトランザクションは、すでにアドレスを知っているサイトから届きます。Casa は固定され、「変更」はありません。アカウントを切り替えるには、アドレスバーの Casa ピルをタップします。
この端末にのみ保存されます。エステートを削除しても残るため、どのアドレスをサイトが知っているかを確認できます。
インデックスは端末内にのみ保存され、エステートを削除しても残ります。消えた Casa は、最後に知られた名前でグレー表示のまま一覧に残ります。
切断すると、Casaはこのアドレスでこのサイトに応答しなくなります。ただし、サイト側のサーバーには記録が残っている場合があります。
ユーザーはサイトがどのアドレスを知っているかを正確に確認できます。「切断」は接続を終了し、「削除」は消えた Casa の行を消去します。
アプリや Web ページは getaddress で Casa のアドレスを求めます。同じシート、同じルールです。リクエスト元はコールバック(アプリのスキーム、または https ページのホスト)で表示され、Casa は変更でき、応答は接続済みサイトに記録されます。
状況ごとに Casa Tookan があらかじめ選択するもの。ユーザーがタップしない限り、Casa を切り替えることはありません。
| 状況 | あらかじめ選択される Casa | ユーザーに表示される内容 |
|---|---|---|
| アクティブな Casa がすでにサイトに接続済み | アクティブな Casa | 緑のチップ「…からこのサイトに接続済み」。提案はなし。 |
| アクティブな Casa はサイトが初めてで、別の Casa がそのサイトを知っている | アクティブな Casa | チップ「このサイトは初めてです」と、提案がひとつ:このサイトで最後に使われた Casa と「使う」。他の Casa はピッカー内で示されます。 |
| どの Casa もサイトを知らない | アクティブな Casa | チップ「このサイトは初めてです」、提案はなし。 |
| 既知の Casa が削除したエステートに属している | アクティブな Casa | 提案はなし(もう署名できないため)。設定 › 接続済みサイトには表示されたままです。 |
| Farcaster サインインで、Casa がそのアカウントを所有していない | アクティブな Casa | 警告と、メインボタン「<アカウントを所有する Casa>を使う」。所有する Casa がない場合は「Farcasterアカウントをインポート」。 |
| サイトが Ethereum を求めていて、Casa が Bitcoin 専用の鍵(またはその逆) | なし | その行はピッカーに無効の状態で残り、理由が表示されます。 |
| 接続済みサイトからの署名またはトランザクション | 接続済みの Casa(固定) | 「変更」はなし:サイトはこのアドレスを想定しています。アカウントはアドレスバーの Casa ピルから切り替え、サイトはそのとき accountsChanged を受け取ります。 |
| このサイトとこの Casa で Bitcoin アドレスがすでに選ばれている | 同じタイプ | 記憶された選択(変更可能)。 |
| Bitcoin アドレス、初めて | BTC か Counterparty アセットがあり、SegWit が空なら Legacy。それ以外は SegWit。 | 選択の下に理由(「12件のアセット · 0.0042 BTC」)。Taproot があらかじめ選択されることはありません。 |
サイトやアプリがウォレットにアクセスするあらゆる方法に、ひとつのシートとひとつの接続インデックスが使われます。
via: "walletconnect" として記録されます。getaddress、signForAddress)も同じシートを使います。ディープリンクを参照してください。via: "deeplink" として、アプリのスキーム(sogapp://)またはページのオリジンの下に記録されます。端末(AsyncStorage)に、保管庫やエステートとは別に保存されます。Casa はインデックス番号ではなくアドレスで識別されます。インデックス番号はエステートを削除すると変わるためです。名前、色、エステートは接続時にコピーされるので、消えた Casa も表示できます。インデックスは空の状態から始まります。それ以前の接続は移行されないため、各 Casa はサイトごとに一度「初めて」になります。
// key: "dappConnections.v1"
{
"https://farcaster.velocimon.com": {
"origin": "https://farcaster.velocimon.com",
"name": "Velocimon",
"icon": "https://farcaster.velocimon.com/…/icon.png",
"via": "browser", // "browser" | "walletconnect" | "deeplink"
"connections": [{
"chain": "evm", // "evm" | "bitcoin"
"address": "0x1614…1313", // stable identity
"btcPurpose": null, // "segwit" | "legacy" | "taproot"
"farcasterFid": 399250,
"casa": { // copied at connection time
"name": "Casa Yodark",
"color": "#9B59B6",
"estateName": "Farcaster estate",
"ghost": false // imported key
},
"connectedAt": "2026-10-05T18:12:00Z",
"lastUsedAt": "2026-10-05T19:40:00Z",
"disconnectedAt": null
}]
}
}
eth_accounts と getAddresses に直接応答します。lastUsedAt と Casa のスナップショット(名前、色)が更新されます。disconnectedAt を設定し、「削除」は行を取り除きます。ウォレットを削除するとインデックス全体が消去されます。Casa Tookan は iOS と Android で casatookan:// スキームを登録します。他のアプリや Web ページはこれを使って、ウォレット内で dApp を開いたり、署名済みチャレンジでユーザーをログインさせたりします(初代 Casa Tookan の web3XCP x-callback-url プロトコル)。ウォレットのロックが解除されている必要があります。ロック中は、browse と getaddress のリンクは無視され、キューにも入りません。
| リンク | パラメーター | 動作 |
|---|---|---|
https://casatookan.com/open?url={url}&ref={app} | url:開く https ページ(URL エンコード)。ref:ユーザーを送った人(任意)。 | Universal Link / App Link:dApp ブラウザでページを開きます。ロック中なら解除の後に。アプリがなければ、ストアとブラウザのページ。 |
casatookan://browse/{url} | url:開くページ(URL エンコード)。 | アプリ内の dApp ブラウザでページを開きます。 |
casatookan://x-callback-url/getaddress?x-success={callback}&msg={message} | x-success:応答の送り先(下記参照)。msg:署名するチャレンジ(URL エンコード)。 | Bitcoin + Ethereum での Web3 ログイン:署名シートがユーザーに確認し、Casa Tookan が選ばれた Casa で msg に署名してコールバックを呼び出します。 |
casatookan://x-callback-url/signForAddress?chain={chains}&x-success={callback}&msg={message} | chain:カンマ区切りのチェーン ID(例:bitcoin,base)。bitcoin またはウォレットで有効な任意の EVM チェーン(ethereum、base、polygon…)。 | getaddress と同じ動作を、指定したチェーンで、その順番で行います。 |
x-successx-success=myapp(英字、数字、+ . -)。myapp://sendaddress?address=…&msg=…&sig=… を開きます。&address=、&msg=、&sig= で分割してください。x-success=https://example.com/login(リンク内では URL エンコード)。https://example.com/login?address=…&msg=…&sig=… を開きます。既存のクエリ文字列は保持され(& を使用)、#fragment も保持されます。+ と / が含まれるため)。URLSearchParams で読み取ってください。http:// やその他の送り先は拒否されます。署名が平文で送られてしまうためです。address = chain:bitcoin;1Ca5a…T00k;;separator;;chain:ethereum;0x1614…1313 msg = the challenge, unchanged sig = chain:bitcoin;H8k2…=;;separator;;chain:ethereum;0x5f1c…1b
chain:{id};{value} のエントリーがひとつ、リクエストされた順に並び、;;separator;; で連結されます。address と sig のエントリーは順番が対応しています。m/0'/0/{casa}。任意の BIP-137 検証ツールで、返されたアドレスに対して検証してください。keccak256(utf8(msg)) の生の secp256k1 署名で、0x{r}{s}{v}(v = 27 + recid)としてシリアライズされます。EIP-191 ではありません。personal_sign の検証ツールでは拒否されます。SigningKey.recoverPublicKey(keccak256(toUtf8Bytes(msg)), sig))、返されたアドレスと比較してください。パスは m/44'/60'/0'/0/{casa}。sogapp://)またはページのオリジンの下で、共有した Legacy Bitcoin アドレスと Ethereum アドレスとともに記録されます。chain にサポートされていないチェーン ID がある、x-success がない、またはチェーンのリストが空の場合、リンクは無効です。何も表示されず、何も送信されません。Casa Tookan をインストールしたスマートフォンでディープリンクテスターを開いてください。上記のすべてのリンクを作成し、Casa Tookan の応答とともに自身に戻り(x-success = 自身の URL)、それをデコードして Ethereum の署名を検証します。