Montez aussi haut que nécessaire.
Dans Casa Tookan, les adresses de chaque joueur vivent dans une casa, un profil qui grandit de la cabane au château. Votre intégration grandit de la même façon. Chaque niveau fonctionne seul : arrêtez-vous où vous voulez.
Ça marche déjà.
Si votre site fonctionne avec MetaMask, Xverse, Magic Eden ou Unisat, il fonctionne dans Casa Tookan. Aucun SDK à installer, aucun cas particulier dans votre code.
window.ethereum (EIP-1193), annoncé via EIP-6963. Fonctionne avec wagmi, RainbowKit et Web3Modal.window.unisat. Adresses SegWit, Taproot et Legacy.window.webXCP et window.web3xcp. L’utilisateur voit ce que fait une PSBT avant de signer.

-
Ouvrez votre site dans l’app
Dans Casa Tookan, allez dans Explorer et tapez votre URL.
-
Connectez et signez, comme d’habitude
Chaque demande ouvre la fenêtre de signature de Casa Tookan. Elle montre votre site et la casa qui signe : vous n’avez aucune interface à construire.
const [address] = await window.ethereum.request({ method: 'eth_requestAccounts' }); const signature = await window.ethereum.request({ method: 'personal_sign', params: ['Welcome to Orb Quest!', address], });import { request } from 'sats-connect'; const res = await request('getAddresses', { purposes: ['payment', 'ordinals'] }); if (res.status === 'success') console.log(res.result.addresses); // Ou le dialecte Unisat : l’adresse Legacy de la casa, où vivent les actifs Counterparty. const [legacy] = await window.unisat.requestAccounts();// L’API Counterparty classique, avec des callbacks à la Node. window.webXCP.getAccounts((err, accounts) => { if (err) return showError(err); loadCards(accounts); });Les sites conçus pour le Casa Tookan d’origine ou IndieSquare continuent de fonctionner. Pour du code neuf, préférez une PSBT via
signPsbt: Casa Tookan décode les envois, ordres et dispensers Counterparty avant que l’utilisateur signe. -
Suivez la casa
L’utilisateur peut changer de casa depuis la barre d’adresse à tout moment, et votre page reçoit l’événement habituel. Chaque casa a aussi son propre
localStorage: les sessions ne se mélangent pas.window.ethereum.on('accountsChanged', ([next]) => setPlayer(next));
Choisir Casa Tookan parmi d’autres portefeuilles · EIP-6963
Sur un navigateur de bureau, MetaMask peut verrouiller window.ethereum pour qu’aucun autre portefeuille ne le prenne, version web de Casa Tookan comprise. Utilisez le provider annoncé comme com.everdreamsoft.casatookan : il fonctionne partout. Sur téléphone, window.ethereum est de toute façon celui de Casa Tookan.
window.addEventListener('eip6963:announceProvider', (e) => {
if (e.detail.info.rdns === 'com.everdreamsoft.casatookan') useProvider(e.detail.provider);
});
window.dispatchEvent(new Event('eip6963:requestProvider'));
// Vous voulez juste savoir si vous êtes dans Casa Tookan ?
const inCasaTookan = window.casaTookan?.isCasaTookan === true;La détection sert à dire bonjour ou à sauter votre sélecteur de portefeuille. Pour activer ou désactiver des fonctions, fiez-vous aux providers : ce sont eux, l’API.
Déclarer vos frais · sats-connect, unisat
sats-connect est le format de requête ouvert de Xverse pour les portefeuilles Bitcoin (window.BitcoinProvider, ou le paquet npm sats-connect qui le trouve), repris par la plupart des portefeuilles Bitcoin. unisat (window.unisat) est celui d’UniSat, utilisé par de nombreuses places de marché Ordinals et Counterparty. Casa Tookan répond aux deux, avec le même signataire : gardez le code écrit pour Xverse ou UniSat.
Quand votre transaction vous paie aussi (des frais de service sur un achat, une redevance, un pourboire), déclarez-le avec la PSBT. Casa Tookan affiche alors Service fee · 0.0000075 BTC → bc1q… (declared by the site). Sans déclaration, l’utilisateur est averti que des BTC partent vers une adresse que vous n’avez pas déclarée.
await window.BitcoinProvider.request('signPsbt', {
psbt, // base64
signInputs: { [address]: [0, 1] },
broadcast: true,
fees: [{ kind: 'service', address: 'bc1q…', sats: 750 }],
});
// Dialecte Unisat : les mêmes frais dans les options (signPsbts : dans les options de chaque PSBT).
await window.unisat.signPsbt(psbtHex, {
toSignInputs,
fees: [{ kind: 'service', address: 'bc1q…', sats: 750 }],
});kind:'service','royalty'ou'tip'. C’est Casa Tookan qui le formule ; il n’y a pas de champ texte.addressetsats: une sortie de la transaction, exactement. Trois frais au plus.- Aucune sortie ne correspond (autre montant, autre adresse) : l’utilisateur voit un avertissement rouge. Ce que l’action paie elle-même (le distributeur d’un dispense, le destinataire d’un envoi) n’est jamais un frais.
- Autre chose dans la liste (un autre
kind, un libellé, un champ en trop) et toute la déclaration est ignorée, en le signalant à l’utilisateur.
Les portefeuilles qui ne connaissent pas fees l’ignorent : déclarer ne casse jamais rien. Valable pour toutes les actions Counterparty et les transactions Bitcoin simples. L’ancien webXCP ne prend pas d’options : passez par sats-connect ou unisat.
Tester depuis votre ordinateur · sans téléphone
devapp.casatookan.com est Casa Tookan dans un navigateur, avec des portefeuilles de test. Il exécute votre site dans un frame, où les navigateurs appliquent des règles qu’un téléphone n’applique pas. Quatre changements, tous de votre côté :
- Chargez le bridge web depuis votre
<head>. - Autorisez devapp à afficher vos pages dans un frame :
frame-ancestors 'self' https://devapp.casatookan.com. - Répondez à toute requête
/.well-known/avecAccess-Control-Allow-Origin: *, 404 comprises (voir le niveau 2). - Donnez à votre cookie de session
SameSite=None; Secure; Partitioned.
Pas à pas, avec le snippet du bridge : Tester votre app dans la version web.
Faites entrer les joueurs directement.
Quelqu’un qui visite votre site dans Safari ou Chrome n’y a pas de portefeuille. Un bouton ouvre la même page dans Casa Tookan. Sans l’app, il ouvre une page avec l’App Store, Google Play et « continuer dans le navigateur ».
<a id="open-casa" href="#">
<img src="https://casatookan.com/assets/badges/open-in-casatookan-fr-dark.svg"
alt="Ouvrir dans Casa Tookan" width="212" height="56">
</a>
<script>
// déjà dans Casa Tookan : rien à ouvrir
if (window.casaTookan) document.getElementById('open-casa').hidden = true;
else document.getElementById('open-casa').href =
'https://casatookan.com/open?url=' + encodeURIComponent(location.href) + '&ref=votre-app';
</script>casatookan.com/open directement à l’app (un portefeuille verrouillé ouvre votre page juste après le déverrouillage). Sans l’app, la page du lien propose les stores et votre site dans le navigateur ; sur un ordinateur, elle affiche un QR code pour le téléphone. Seule une url en https est ouverte. ref (a–z, 0–9, . _ -, 64 caractères) nous sert à compter les joueurs que vous amenez ; name titre la page. Badges : /assets/badges/open-in-casatookan-{en|fr|ja}-{dark|light}.svg.
Devenez une app.
Votre site a sans doute déjà un web manifest. Ajoutez-y un membre wallet et Casa Tookan présente votre site comme une app.
1
2
3
4
5
6
7
- 1Bannière ·
wallet.heroImageUrl, 1200×630 - 2Icône ·
icons, 1024×1024 opaque - 3Nom ·
name, 32 caractères - 4Sous-titre ·
wallet.subtitle, 30 caractères - 5Catégorie · la première de vos
categories - 6Chaînes ·
wallet.chains - 7Description ·
description, 170 caractères
La page du Dev Playground, dessinée à partir de son manifest avec la mise en page de Casa Tookan par le validateur. Votre manifest remplit chacun de ces éléments.
- Votre nom et votre icôneDans la barre d’adresse et la fenêtre de signature
- Un écran de démarrageVotre visuel sur votre couleur pendant le chargement
- Une carte dans Explorer › AppsAvec votre bannière, à un geste
- Des prérequis clairsUn message explique ce qui manque
-
Décrivez votre app
Seul le nom est obligatoire. Le JSON se met à jour pendant la saisie.
Pour un site qui n’a pas encore de manifest.
Standard W3C, vous l’avez peut-être déjàwallet, ce que vous ajoutez -
Publiez-le
L’un ou l’autre. Casa Tookan vérifie les deux et utilise le premier qui contient un membre
wallet.Où Quand le choisir Votre manifest existant, lié par <link rel="manifest">sur votre page d’accueilVous en avez déjà un. Gardez le lien dans le HTML servi : un lien ajouté par un script n’est pas vu. /.well-known/wallet-app.jsonVous préférez le garder à part. Même JSON, servi seul. Servez-le en
application/json. Placez les images à côté : une icône opaque de 1024×1024, une bannière de 1200×630, un splash de 200×200. Ce sont les tailles de Farcaster : un seul jeu d’images sert aux deux. -
Autorisez les navigateurs à le lire
Envoyez
Access-Control-Allow-Origin: *sur tout ce qui est sous/.well-known/, 404 comprises, et sur vos images. Le validateur et Casa Tookan sur le web en ont besoin ; l’app mobile s’en passe. Sans cela, unfarcaster.jsonabsent ressemble à une panne réseau.# THE_REQUEST, pas REQUEST_URI : reste /.well-known/ après une réécriture vers index.php <If "%{THE_REQUEST} =~ m#\s/\.well-known/#"> Header always set Access-Control-Allow-Origin "*" </If>location /.well-known/ { add_header Access-Control-Allow-Origin "*" always; } -
Vérifiez-le
Le validateur charge votre manifest en ligne, teste chaque image et montre votre app telle que Casa Tookan la dessinera. Casa Tookan lit les manifests une fois par lancement : relancez l’app pour voir un changement.
Vous avez déjà un farcaster.json ou un casatookan.json ?
Les deux sont toujours lus, et fusionnés champ par champ : casatookan.json (l’ancien format) d’abord, puis le Wallet App Manifest, puis farcaster.json. Une mini app Farcaster n’ajoute que ce qui diffère dans Casa Tookan, comme une bannière, Bitcoin ou Counterparty.
wallet est un format ouvert, le Wallet App Manifest, que tout portefeuille peut lire. Les champs que seul Casa Tookan comprend portent le préfixe casatookan:. Si votre serveur tombe en panne, Casa Tookan garde ce qu’il savait déjà de votre app. Référence complète : Créer une app Casa Tookan.
Levez le rideau au bon moment.
Déclarez wallet.ready dans vos capabilities. Votre splash reste alors affiché jusqu’à ce que votre premier écran soit dessiné : les joueurs ne voient jamais une page à moitié chargée.
await loadAssets();
renderTitleScreen();
window.wallet?.ready(); // le splash s’efface, votre jeu est làAvec wallet.ready | Le splash attend ready(), jusqu’à 10 secondes. |
| Sans | Le splash disparaît 2,5 secondes après que la page s’est stabilisée. |
| Mini app Farcaster | sdk.actions.ready() fonctionne de la même façon. |
casatookan.ready et window.casaTookan.ready() fonctionnent toujours. wallet.ready est le nom neutre, et tout portefeuille qui héberge des apps peut le proposer.
Connexion depuis partout.
Depuis un navigateur ordinaire ou un jeu natif, envoyez le joueur vers Casa Tookan avec un challenge. Il revient avec ses adresses Bitcoin et Ethereum, chacune prouvée par une signature, sans mot de passe ni extension.
-
Envoyez le joueur vers Casa Tookan
Votre serveur génère un challenge aléatoire à usage unique. Votre page ouvre le lien.
const { challenge } = await fetch('/auth/challenge').then((r) => r.json()); location.href = 'casatookan://x-callback-url/getaddress' + '?x-success=' + encodeURIComponent('https://orbquest.game/auth/casa') + '&msg=' + encodeURIComponent(challenge); -
Le joueur approuve
Il voit votre site dans la fenêtre de signature, choisit une casa et touche Se connecter. Casa Tookan ouvre alors votre callback avec
address,msgetsig:address = chain:bitcoin;1Ca5a…T00k;;separator;;chain:ethereum;0x1614…1313 sig = chain:bitcoin;H8k2…=;;separator;;chain:ethereum;0x5f1c…1b -
Vérifiez sur votre serveur
Vérifiez que le challenge est le vôtre et inutilisé, puis vérifiez les deux signatures. Attention : celle d’EVM n’est pas
personal_sign.import bitcoinMessage from 'bitcoinjs-message'; import { recoverAddress, keccak256, toUtf8Bytes } from 'ethers'; // "chain:bitcoin;1Ca5…;;separator;;chain:ethereum;0x16…" → { bitcoin, ethereum } const entries = (s) => Object.fromEntries(s.split(';;separator;;').map((e) => { const i = e.indexOf(';'); return [e.slice('chain:'.length, i), e.slice(i + 1)]; })); export function verifyCasaLogin(query, expectedChallenge) { const p = new URLSearchParams(query); const msg = p.get('msg'); if (msg !== expectedChallenge) throw new Error('challenge'); // puis brûlez-le const addr = entries(p.get('address')); const sig = entries(p.get('sig')); // Bitcoin : BIP-137, signé par l’adresse Legacy. if (!bitcoinMessage.verify(msg, addr.bitcoin, sig.bitcoin)) throw new Error('bitcoin'); // EVM : secp256k1 brut sur keccak256(msg), pas EIP-191. const signer = recoverAddress(keccak256(toUtf8Bytes(msg)), sig.ethereum); if (signer.toLowerCase() !== addr.ethereum.toLowerCase()) throw new Error('ethereum'); return addr; }
App native, ou autres chaînes ?
App native : utilisez votre scheme comme callback, x-success=orbquest. Casa Tookan ouvre orbquest://sendaddress?address=…&msg=…&sig=…. Ces valeurs ne sont pas encodées en URL, comme l’attendent les apps web3XCP existantes : découpez donc la query sur &address=, &msg= et &sig=.
Autres chaînes : signForAddress?chain=bitcoin,base&… signe sur les chaînes que vous listez, dans cet ordre.
Les callbacks doivent être en https:// ou un scheme d’app ; http:// est refusé. Tous les détails sont dans Connexions dApp et deep links.
Connaissez vos joueurs.
Un Casa Estates ID, c’est un compte par joueur, quels que soient ses appareils et ses phrases de récupération. Indexez vos sauvegardes sur un numéro stable ; ne demandez les adresses que lorsque vous en avez besoin. Conçu pour les jeux qui distribuent des récompenses.
-
Déclarez-le dans votre manifest
Dans votre membre
wallet:"capabilities": { "required": ["casatookan:identity.ceid"] }, "extensions": { "casatookan": { "identity": { "reason": "Votre CEID conserve votre progression sur tous vos appareils." } } } -
Connectez le joueur
if (window.casaTookan?.ceid?.available) { const { nonce } = await fetch('/auth/nonce').then((r) => r.json()); const { token } = await window.casaTookan.ceid.signIn({ nonce }); await fetch('/auth/casa', { method: 'POST', body: token }); } -
Vérifiez le jeton sur votre serveur
import { createRemoteJWKSet, jwtVerify } from 'jose'; const JWKS = createRemoteJWKSet(new URL('https://ctserver.everdreamsoft.com/.well-known/jwks.json')); const { payload } = await jwtVerify(token, JWKS, { issuer: 'https://ctserver.everdreamsoft.com', audience: 'https://orbquest.game', clockTolerance: 60, }); // vérifiez payload.nonce, puis identifiez le joueur par payload.ceid
jwks-dev.json. Le jeton, les indices anti-multicompte et les règles qui s’appliquent aux joueurs sont dans Se connecter avec un Casa Estates ID.Avant de publier
Six vérifications. Vos coches sont enregistrées dans ce navigateur.
Laissez votre IA le faire.
Collez ceci dans Claude, Cursor ou ce qui écrit votre code. Cela couvre les niveaux 0 à 4.
Intègre mon site au portefeuille Casa Tookan (casatookan.com/docs/integrate.html).
Faits :
- Le navigateur intégré de Casa Tookan injecte des providers standard ; n’ajoute pas de SDK spécifique :
window.ethereum (EIP-1193, EIP-6963 rdns "com.everdreamsoft.casatookan"),
sats-connect / WBIP-004 / Wallet Standard / window.unisat pour Bitcoin
(unisat = l’adresse Legacy, où vivent les actifs Counterparty),
window.webXCP et window.web3xcp pour Counterparty.
- Si une transaction paie aussi mon site (des frais), les déclarer avec la PSBT pour que le
signataire les affiche comme tels : paramètres signPsbt / options unisat +
fees: [{ kind: "service"|"royalty"|"tip", address, sats }] (sortie exacte, 3 max, pas de texte).
- Préfère le provider EIP-6963 de rdns "com.everdreamsoft.casatookan" (sur ordinateur,
MetaMask peut verrouiller window.ethereum). Détection : window.casaTookan?.isCasaTookan.
Écoute accountsChanged : l’utilisateur peut changer de casa (compte) à tout moment.
Chaque casa a son propre localStorage.
- Lien « Ouvrir dans Casa Tookan » : https://casatookan.com/open?url={encodeURIComponent(url)}&ref={votre-app} (ouvre l’app si elle est installée, sinon une page avec les stores ; à cacher quand window.casaTookan existe). casatookan://browse/{encodeURIComponent(url)} marche encore sur le téléphone.
- Manifest d’app = le Wallet App Manifest (github.com/wallet-apps/manifest) : le web
manifest W3C (name, icons PNG opaque 1024x1024, start_url, scope, background_color,
description, categories) plus un membre "wallet" :
{ "version": "1", "subtitle" (30 caractères), "heroImageUrl" (1200x630),
"splashImageUrl" (200x200), "chains": { "required": [CAIP-2] },
"capabilities": { "required": [...] }, "extensions": { "casatookan": {...} } }
Servi via <link rel="manifest"> sur la page d’accueil ou /.well-known/wallet-app.json,
en application/json. Envoie Access-Control-Allow-Origin: * sur tout ce qui est sous
/.well-known/ (404 comprises) et sur les images.
Bitcoin = bip122:000000000019d6689c085ae165831e93, Ethereum = eip155:1, Base = eip155:8453.
Capabilities : provider.ethereum, provider.bitcoin, provider.counterparty, wallet.ready ;
Casa Tookan uniquement : casatookan:identity.ceid. Counterparty = Bitcoin + provider.counterparty.
- Avec wallet.ready déclaré, appelle window.wallet?.ready() une fois le premier écran dessiné.
- Connexion depuis un navigateur ordinaire ou une app native :
casatookan://x-callback-url/getaddress?x-success={encodeURIComponent(callback https)}&msg={encodeURIComponent(challenge)}
Réponse : callback?address=…&msg=…&sig=… (encodé en URL pour les callbacks https).
address/sig = "chain:bitcoin;VALUE;;separator;;chain:ethereum;VALUE".
Signature Bitcoin : BIP-137 en base64 par l’adresse Legacy (verify de bitcoinjs-message).
Signature EVM : secp256k1 brut sur keccak256(utf8(msg)), 0x r s v (v=27+recid), PAS EIP-191 :
ethers recoverAddress(keccak256(toUtf8Bytes(msg)), sig).
Les challenges sont aléatoires, à usage unique, vérifiés sur le serveur.
- Tests sur ordinateur dans devapp.casatookan.com (voir ctserver.everdreamsoft.com/docs/web.html) :
bridge web dans <head>, frame-ancestors 'self' https://devapp.casatookan.com,
CORS sur /.well-known/, cookie de session SameSite=None; Secure; Partitioned.
