Pour les développeurs / Jetons

Liste de jetons et étiquettes d'adresse

Un seul dépôt public décide quels jetons portent la marque de vérification, quel logo et quel nom ils affichent, et quelle étiquette un contrat reçoit à la place de son adresse. Y entrer, c'est une pull request.

Ce qu'est la liste

Deux fichiers par réseau. tokenlist.json recense les jetons examinés, au format standard Uniswap Token Lists, pour que n'importe quel portefeuille, interface de DEX ou agrégateur puisse l'importer tel quel. tags.json donne aux contrats connus une étiquette lisible - un nom, une catégorie et un projet - pour qu'un explorateur puisse afficher « Pepper router » là où il afficherait sinon une adresse hexadécimale.

Un jeton listé reçoit la marque de vérification, son logo, son nom et son symbole sur l'explorateur, sur Pepper, dans le Toolkit, sur Names et dans la page Account. Un contrat étiqueté apparaît sous son étiquette dans les listes de transactions, sur les pages d'adresse et dans la recherche.

Ce que dit la marque, et ce qu'elle ne dit pas

La marque de vérification dit que le jeton a été examiné et que l'adresse de son contrat est bien celle qui correspond à ce nom. Ce n'est ni un conseil d'investissement, ni une recommandation, ni un audit du contrat.

Rien n'est listé automatiquement. Un jeton lancé avec le lanceur de jetons de Pepper n'est pas ajouté parce qu'il existe ; il l'est quand quelqu'un ouvre une pull request et qu'il remplit les critères.

Où elle se trouve

La liste se trouve dans un dépôt GitHub public, github.com/PickleChain/token-list, avec un dossier par réseau :

DossierContient
testnet/chain ID 78270la liste que lisent aujourd'hui les applications Pickle
mainnet/vide pour l'instantla liste et les étiquettes du mainnet seront publiées dans ce dossier au lancement du mainnet
schemas/tags.schema.jsonle JSON Schema de tags.json
scripts/validate.mjsle validateur lancé par npm test et par la CI

Dans un dossier de réseau :

CheminCe que c'est
tokenlist.jsonles jetonsformat Uniswap Token Lists ; chaque entrée a chainId 78270
tags.jsonles étiquettes d'adresseindexées par adresse de contrat avec somme de contrôle
logos/tokens/un logo par jetonnommé d'après l'adresse du jeton avec somme de contrôle
logos/tags/les logos de projetvers lesquels pointent les étiquettes ; plusieurs étiquettes peuvent en partager un

Les URL brutes, toujours sur le dernier commit de main :

text
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tokenlist.json
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tags.json
Lisez logoURI, ne le construisez pas

Le logo d'un jeton peut être un PNG ou un SVG : prenez donc l'URL dans le champ logoURI de l'entrée (ou dans le logo d'une étiquette) plutôt que de l'assembler à partir de l'adresse.

Pour un site web, récupérez les fichiers côté serveur et servez-les depuis votre propre origine au lieu de lier directement raw.githubusercontent.com depuis le navigateur des visiteurs : leurs adresses IP restent à l'écart d'un tiers, vous évitez les limites de débit de GitHub et vous pouvez garder la dernière copie valide quand GitHub est injoignable. Dans un portefeuille ou une interface de DEX, ajoutez l'URL brute de tokenlist.json comme liste de jetons personnalisée.

Comment les applications Pickle s'en servent

L'API de l'explorateur est la seule partie de la pile Pickle qui interroge GitHub pour ces fichiers. Elle récupère les deux environ toutes les dix minutes, valide chaque fichier dans son ensemble - forme, chain ID, sommes de contrôle, doublons - et garde la dernière copie valide en mémoire et sur disque. Un fichier en échec est rejeté en entier et le précédent reste en service, si bien qu'un mauvais commit ne peut jamais effacer une étiquette ou un logo. Chaque site Pickle lit ensuite la copie de l'explorateur depuis sa propre origine :

RouteSert
GET /api/tokenlisttokenlist.json tel que validé en dernier503 tant qu'aucune première copie valide n'existe
GET /api/tagstags.json tel que validé en dernier
GET /api/tokenlogo/{address}les octets du logo du jeton404 quand le jeton n'est pas listé ou n'a pas de logo
GET /api/taglogo/{address}les octets du logo de l'étiquette

Les routes sont sur https://explorer.picklechain.xyz, derrière la liste d'autorisation CORS de l'explorateur : elles servent les sites Pickle. Votre propre application lit les fichiers bruts ci-dessus.

Combien de temps avant qu'un merge apparaisse

Environ dix minutes après le merge d'une pull request, la nouvelle entrée est sur toutes les applications Pickle ; avec le cache de GitHub et ceux des sites en travers, cela peut prendre jusqu'à vingt. Un logo remplacé sous le même nom de fichier peut mettre jusqu'à six heures, parce que les logos sont mis en cache par URL.

Ajouter un jeton

Vérifiez d'abord les critères : une pull request pour un jeton qui ne les remplit pas est fermée. Ensuite, sur votre fork du dépôt :

  1. Récupérez l'adresse avec somme de contrôle. Casse mixte EIP-55, pas tout en minuscules. Si la vôtre est fausse, le validateur affiche la forme attendue.
  2. Ajoutez le logo dans testnet/logos/tokens/, nommé exactement d'après cette adresse : testnet/logos/tokens/0x0000…dEaD.png (ou .svg). Il doit suivre les règles pour les logos.
  3. Ajoutez une entrée à la fin de tokens dans testnet/tokenlist.json, comme dans l'exemple ci-dessous.
  4. Montez la version de tokenlist.json - ajouter un jeton est une montée mineure, 1.4.2 devient 1.5.0 - et réglez timestamp sur maintenant, en ISO 8601 UTC.
  5. Lancez les vérifications avec npm test. Il faut Node 22 ou plus récent et rien d'autre : le validateur n'a aucune dépendance, il n'y a donc rien à installer.
  6. Ouvrez une pull request vers main. Dans sa description, mettez le lien d'une publication du site web ou du compte officiel du projet qui cite l'adresse du contrat.
testnet/tokenlist.json - one entry of tokens
{
  "chainId": 78270,
  "address": "0x0000…dEaD",
  "name": "Example Token",
  "symbol": "EXM",
  "decimals": 18,
  "logoURI": "https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/logos/tokens/0x0000…dEaD.png",
  "extensions": {
    "website": "https://your-project.example",
    "explorer": "https://explorer.picklechain.xyz/address/0x0000…dEaD"
  }
}

0x0000…dEaD tient lieu de votre adresse complète de 42 caractères avec somme de contrôle ; c'est un exemple de remplacement, pas un jeton.

ChampRègle
chainId78270le réseau du dossier ; toute autre valeur échoue
addresssomme de contrôle EIP-55unique dans la liste
name1-40 caractèresce que les applications affichent à côté du logo
symbol1-20 caractères, sans espaceunique dans la liste, sans tenir compte de la casse
decimalsentier de 0 à 255la valeur que renvoie decimals() sur le contrat
logoURIune URL brute dans testnet/logos/tokens/le fichier nommé d'après l'adresse, .png ou .svg
tagsfacultatifdes identifiants définis dans les tags de premier niveau de la liste, 10 au plus
extensionsfacultatif10 valeurs au plus, chacune une chaîne, un nombre, un booléen ou null

L'aller-retour complet en ligne de commande :

bash
# Fork and clone (or fork on the website and clone your fork):
gh repo fork PickleChain/token-list --clone
cd token-list
git checkout -b add-exm

# Logo, entry, version and timestamp, then:
npm test

git add testnet/tokenlist.json testnet/logos/tokens/
git commit -m "Add Example Token (EXM)"
git push origin add-exm
# ...and open the pull request on GitHub.

Règles pour les logos

RègleExigence
FormatPNG ou SVGle type est vérifié d'après les octets, pas d'après l'extension
Taille du PNGexactement 256 x 256 pixels
Poids du fichier100 KB au plus
Nom du fichier<adresse avec somme de contrôle>.png ou .svgpour un jeton ; la casse compte sur GitHub
Emplacementle même dossier de réseau que la listeune liste testnet ne peut pointer que vers testnet/logos/
Visuelcarré, lisible à 20 pixelsfond transparent ou uni ; les applications le recadrent souvent en cercle

Un SVG doit être un simple dessin

Pas de <script>, pas d'attributs de gestionnaire d'événement, pas de <foreignObject>, pas de href ou de url() externe, pas de DOCTYPE. Ne soumettez que des visuels qui vous appartiennent ou que vous avez le droit d'utiliser.

Chaque fichier sous logos/ doit être référencé par la liste ou par les étiquettes. Un logo vers lequel rien ne pointe fait échouer les vérifications : retirez-le donc dans la même pull request que son entrée.

Ajouter une étiquette d'adresse

Les étiquettes sont pour les contrats que l'on croise dans les transactions : contrats de protocole, routers, factories, pools, coffres, jeux, bridges. Les portefeuilles personnels ne sont jamais étiquetés. Le projet doit être en service sur Pickle Chain, et l'adresse doit pouvoir être vérifiée dans la documentation ou les fichiers de déploiement du projet lui-même.

  1. Ajoutez une entrée à tags dans testnet/tags.json, indexée par l'adresse avec somme de contrôle.
  2. Ajoutez éventuellement un logo dans testnet/logos/tags/ - mêmes règles de format que pour un logo de jeton, nom de fichier libre - et faites pointer logo vers son URL brute. Plusieurs étiquettes d'un même projet peuvent partager un fichier.
  3. Montez la version de tags.json et son timestamp, lancez npm test et ouvrez la pull request.
testnet/tags.json - one entry of tags
"0x0000…dEaD": {
  "name": "Example vault",
  "category": "protocol",
  "project": "Example",
  "url": "https://your-project.example",
  "logo": "https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/logos/tags/example.png",
  "note": "Holds deposits and pays out the weekly yield."
}
ChampRègle
name1-40 caractères, unique dans le fichieraffiché à la place de l'adresse : gardez-le court et précis
categoryune clé de categoriesvoir la liste ci-dessous
project1-40 caractèresle projet auquel appartient le contrat
urlun lien https://, ou nullobligatoire : écrivez null s'il n'y en a pas
logoune URL brute dans testnet/logos/tags/, ou nullobligatoire : écrivez null s'il n'y en a pas
notefacultatif, 200 caractères au plusce que fait le contrat, en une phrase

Les catégories définies aujourd'hui :

CléPour
tokenun contrat de jetonles métadonnées et le logo sont dans tokenlist.json ; l'étiquette lui donne un libellé
protocolles contrats de basefrais, staking, burn, faucet, registre
bridgele bridge ETHentre Pickle Chain et sa couche de règlement
dexles contrats de l'échange Pepperfactories, routers, quoters et le lanceur de jetons
poolun pool de liquidité Pepper
toolkitles contrats du Toolkitmultisend, locker, streams et la factory de déploiement
namesle Pickle Name Service
oracleles flux de prix
arcadela banque de l'arcade et ses jeux

Si aucune ne convient, proposez une nouvelle catégorie dans la même pull request : une clé en minuscules de 20 caractères au plus, avec un name et une description.

Modifier ou retirer une entrée

  • Modifiez une entrée - un nom, une note, un site web, les décimales - en l'éditant sur place et en montant la version de patch. Ouvrez la pull request depuis l'équipe du jeton, comme pour un ajout.
  • Changez un logo en remplaçant le fichier. Passer de PNG à SVG ou l'inverse le renomme : mettez donc à jour logoURI et supprimez l'ancien fichier.
  • Remplacez un contrat en ajoutant la nouvelle adresse. Pour une étiquette, gardez l'ancienne entrée et ajoutez (previous) à la fin de son nom, pour que les anciennes transactions restent claires.
  • Retirez une entrée en la supprimant avec son fichier de logo, et en montant la version majeure.

Les mainteneurs peuvent retirer un jeton à tout moment - après un exploit, un rug pull, le passage à un nouveau contrat ou un changement trompeur de métadonnées.

Versions

Chaque fichier porte sa propre version, et la montée suit les règles de Token Lists. La CI l'impose par rapport à la branche de base de la pull request, et une version modifiée exige un timestamp plus récent.

ChangementMontée
Une entrée retiréemajor1.4.2 devient 2.0.0
Une entrée ajoutéeminor1.4.2 devient 1.5.0
Une entrée modifiéepatch1.4.2 devient 1.4.3
bash
npm test                                      # every list and logo, then the validator's own tests
node scripts/validate.mjs --base origin/main  # also the version bumps, as CI checks them

Ce que vérifie la revue

Chaque pull request lance npm test et la vérification de version dans GitHub Actions, puis un mainteneur l'examine. Un jeton est ajouté quand toutes ces conditions sont remplies :

  • Il est déployé sur le réseau de ce dossier, et son code source est vérifié ou publié.
  • La pull request est ouverte ou confirmée par l'équipe du jeton, avec le lien d'une publication du site web ou du compte officiel du projet qui cite l'adresse du contrat.
  • Son nom et son symbole n'imitent pas un autre jeton ou projet. Un nouveau PKL ou WETH est refusé.
  • Il a un usage réel : de la liquidité sur Pepper, des détenteurs ou un produit en service - pas un jeton lancé il y a quelques minutes.
  • Le contrat n'a pas de mint caché, de liste noire ou d'interrupteur de frais que l'équipe n'a pas déclaré.

Une étiquette est ajoutée quand l'adresse est un contrat, que le projet est en service sur Pickle Chain et que l'adresse peut être vérifiée dans la documentation ou les fichiers de déploiement du projet lui-même.

Erreurs de validation courantes

npm test affiche chaque problème, pas seulement le premier. Ceux que l'on rencontre le plus, et la correction :

MessageCorrection
is not EIP-55 checksummed (expected …)utilisez l'adresse qu'affiche le message
logo file must be named after the checksummed addressrenommez le logo avec l'adresse exacte, en casse mixte
referenced but missing (case matters on GitHub)le nom de fichier et logoURI diffèrent, souvent seulement par la casse
PNG is 512x512, it must be 256x256redimensionnez l'image en 256 x 256
… bytes, the limit is 102400compressez-la, ou utilisez un SVG
not referenced by this network's tokenlist.json or tags.json; remove itsupprimez le logo orphelin, ou corrigez l'entrée qui pointe vers lui
symbol "EXM" repeats tokens[3]le symbole est déjà pris ; les symboles sont uniques
the file changed but version stayed 1.4.2; bump itmontez la version - voir Versions
this change needs a minor version bumpun ajout est mineur et un retrait majeur ; un patch ne suffit pas
update timestamp when the version changesréglez timestamp sur l'heure UTC actuelle
"logo" is required (use null for url or logo when there is none)écrivez "logo": null ou "url": null au lieu d'omettre le champ
category "vault" is not defined in categoriesutilisez une clé existante, ou ajoutez la catégorie dans la même pull request
SVG must not reference external resourcesintégrez tout en ligne ; retirez les références href et url() externes