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 :
| Dossier | Contient |
|---|---|
| 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 :
| Chemin | Ce que c'est |
|---|---|
| tokenlist.json | les jetonsformat Uniswap Token Lists ; chaque entrée a chainId 78270 |
| tags.json | les é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 :
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tokenlist.json https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tags.json
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 :
| Route | Sert |
|---|---|
| GET /api/tokenlist | tokenlist.json tel que validé en dernier503 tant qu'aucune première copie valide n'existe |
| GET /api/tags | tags.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.
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 :
- 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.
- 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. - Ajoutez une entrée à la fin de
tokensdanstestnet/tokenlist.json, comme dans l'exemple ci-dessous. - Montez la version de
tokenlist.json- ajouter un jeton est une montée mineure, 1.4.2 devient 1.5.0 - et régleztimestampsur maintenant, en ISO 8601 UTC. - 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. - 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.
{
"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.
| Champ | Règle |
|---|---|
| chainId | 78270le réseau du dossier ; toute autre valeur échoue |
| address | somme de contrôle EIP-55unique dans la liste |
| name | 1-40 caractèresce que les applications affichent à côté du logo |
| symbol | 1-20 caractères, sans espaceunique dans la liste, sans tenir compte de la casse |
| decimals | entier de 0 à 255la valeur que renvoie decimals() sur le contrat |
| logoURI | une URL brute dans testnet/logos/tokens/le fichier nommé d'après l'adresse, .png ou .svg |
| tags | facultatifdes identifiants définis dans les tags de premier niveau de la liste, 10 au plus |
| extensions | facultatif10 valeurs au plus, chacune une chaîne, un nombre, un booléen ou null |
L'aller-retour complet en ligne de commande :
# 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ègle | Exigence |
|---|---|
| Format | PNG ou SVGle type est vérifié d'après les octets, pas d'après l'extension |
| Taille du PNG | exactement 256 x 256 pixels |
| Poids du fichier | 100 KB au plus |
| Nom du fichier | <adresse avec somme de contrôle>.png ou .svgpour un jeton ; la casse compte sur GitHub |
| Emplacement | le même dossier de réseau que la listeune liste testnet ne peut pointer que vers testnet/logos/ |
| Visuel | carré, 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.
- Ajoutez une entrée à
tagsdanstestnet/tags.json, indexée par l'adresse avec somme de contrôle. - 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 pointerlogovers son URL brute. Plusieurs étiquettes d'un même projet peuvent partager un fichier. - Montez la version de
tags.jsonet sontimestamp, lanceznpm testet ouvrez la pull request.
"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."
}| Champ | Règle |
|---|---|
| name | 1-40 caractères, unique dans le fichieraffiché à la place de l'adresse : gardez-le court et précis |
| category | une clé de categoriesvoir la liste ci-dessous |
| project | 1-40 caractèresle projet auquel appartient le contrat |
| url | un lien https://, ou nullobligatoire : écrivez null s'il n'y en a pas |
| logo | une URL brute dans testnet/logos/tags/, ou nullobligatoire : écrivez null s'il n'y en a pas |
| note | facultatif, 200 caractères au plusce que fait le contrat, en une phrase |
Les catégories définies aujourd'hui :
| Clé | Pour |
|---|---|
| token | un contrat de jetonles métadonnées et le logo sont dans tokenlist.json ; l'étiquette lui donne un libellé |
| protocol | les contrats de basefrais, staking, burn, faucet, registre |
| bridge | le bridge ETHentre Pickle Chain et sa couche de règlement |
| dex | les contrats de l'échange Pepperfactories, routers, quoters et le lanceur de jetons |
| pool | un pool de liquidité Pepper |
| toolkit | les contrats du Toolkitmultisend, locker, streams et la factory de déploiement |
| names | le Pickle Name Service |
| oracle | les flux de prix |
| arcade | la 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
logoURIet 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.
| Changement | Montée |
|---|---|
| Une entrée retirée | major1.4.2 devient 2.0.0 |
| Une entrée ajoutée | minor1.4.2 devient 1.5.0 |
| Une entrée modifiée | patch1.4.2 devient 1.4.3 |
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 :
| Message | Correction |
|---|---|
| is not EIP-55 checksummed (expected …) | utilisez l'adresse qu'affiche le message |
| logo file must be named after the checksummed address | renommez 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 256x256 | redimensionnez l'image en 256 x 256 |
| … bytes, the limit is 102400 | compressez-la, ou utilisez un SVG |
| not referenced by this network's tokenlist.json or tags.json; remove it | supprimez 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 it | montez la version - voir Versions |
| this change needs a minor version bump | un ajout est mineur et un retrait majeur ; un patch ne suffit pas |
| update timestamp when the version changes | ré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 categories | utilisez une clé existante, ou ajoutez la catégorie dans la même pull request |
| SVG must not reference external resources | intégrez tout en ligne ; retirez les références href et url() externes |