Casa Tookan Développeurs
Guide d’intégration

Votre site, dans chaque casa.

Casa Tookan parle déjà les API de portefeuille qu’utilise votre site. Passez de zéro ligne de code aux comptes joueurs, un petit niveau à la fois.

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.

Niveau 0 · 0 minute

Ç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.

EVMwindow.ethereum (EIP-1193), annoncé via EIP-6963. Fonctionne avec wagmi, RainbowKit et Web3Modal.
Bitcoinsats-connect, Wallet Standard et window.unisat. Adresses SegWit, Taproot et Legacy.
Counterpartywindow.webXCP et window.web3xcp. L’utilisateur voit ce que fait une PSBT avant de signer.
La fenêtre de Casa Tookan demandant la connexion à Spells of Genesis, avec la casa et l’adresse Bitcoin à partager
Votre site demande à se connecterLa fenêtre de Casa Tookan affiche votre nom et laisse l’utilisateur choisir une casa et une adresse.
Spells of Genesis ouvert dans le navigateur de Casa Tookan, connecté, la pastille de la casa dans la barre d’adresse
Votre site, connectéLa pastille de la casa dans la barre indique qui est connecté. Un point vert signifie connecté.
  1. Ouvrez votre site dans l’app

    Dans Casa Tookan, allez dans Explorer et tapez votre URL.

  2. 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.

    connect.js
    const [address] = await window.ethereum.request({ method: 'eth_requestAccounts' });
    const signature = await window.ethereum.request({
      method: 'personal_sign',
      params: ['Welcome to Orb Quest!', address],
    });
  3. 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.

    connect.js
    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.

detect.js
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.

buy.js · sats-connect
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.
  • address et sats : 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/ avec Access-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.

Niveau 1 · Un lien

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 ».

open-in-casa.html
<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>
i
Un seul lien https, tous les cas. Avec Casa Tookan installée, iOS et Android passent 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.
Niveau 2 · 5 minutes

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.

La page du Dev Playground dans Casa Tookan : bannière, icône, nom, sous-titre, catégorie, chaînes et description 1 2 3 4 5 6 7
  1. 1
    Bannière · wallet.heroImageUrl, 1200×630
  2. 2
    Icône · icons, 1024×1024 opaque
  3. 3
    Nom · name, 32 caractères
  4. 4
    Sous-titre · wallet.subtitle, 30 caractères
  5. 5
    Catégorie · la première de vos categories
  6. 6
    Chaînes · wallet.chains
  7. 7
    Description · 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
  1. Décrivez votre app

    Seul le nom est obligatoire. Le JSON se met à jour pendant la saisie.

    Chaînes nécessaires

    Pour un site qui n’a pas encore de manifest.

    site.webmanifest
    Standard W3C, vous l’avez peut-être déjàwallet, ce que vous ajoutez
  2. 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.

  3. 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, un farcaster.json absent ressemble à une panne réseau.

    .htaccess
    # 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>
  4. 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.

Niveau 3 · Une ligne

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.

main.js
await loadAssets();
renderTitleScreen();
window.wallet?.ready();   // le splash s’efface, votre jeu est là
Avec wallet.readyLe splash attend ready(), jusqu’à 10 secondes.
SansLe splash disparaît 2,5 secondes après que la page s’est stabilisée.
Mini app Farcastersdk.actions.ready() fonctionne de la même façon.
i
Mise à niveau ? 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.
Niveau 4 · 30 minutes

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.

  1. Envoyez le joueur vers Casa Tookan

    Votre serveur génère un challenge aléatoire à usage unique. Votre page ouvre le lien.

    login.js
    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);
  2. 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, msg et sig :

    https://orbquest.game/auth/casa?address=…&msg=…&sig=…
    address = chain:bitcoin;1Ca5a…T00k;;separator;;chain:ethereum;0x1614…1313
    sig     = chain:bitcoin;H8k2…=;;separator;;chain:ethereum;0x5f1c…1b
  3. 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.

    verify.js
    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.

i
Voyez d’abord comment ça marche. Ouvrez le testeur de deep links sur votre téléphone. Il envoie une vraie demande et vérifie la réponse.
Niveau 5 · Un après-midi Aperçu

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.

  1. Déclarez-le dans votre manifest

    Dans votre membre wallet :

    site.webmanifest · wallet
    "capabilities": { "required": ["casatookan:identity.ceid"] },
    "extensions": {
      "casatookan": {
        "identity": { "reason": "Votre CEID conserve votre progression sur tous vos appareils." }
      }
    }
  2. Connectez le joueur

    signin.js
    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 });
    }
  3. Vérifiez le jeton sur votre serveur

    server.js · jose
    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
i
Aperçu. Pour l’instant, le CEID fonctionne uniquement dans les versions Dev de Casa Tookan. Testez avec 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.

casa-tookan-brief.md
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.

Boîte à outils