面向开发者 / 代币

代币列表与地址标签

一个公开仓库决定了哪些代币带有已验证标记、它们显示哪个 logo 和名称,以及一个合约用什么标签代替它的地址。想被收录,提一个 pull request 就行。

这份列表是什么

每个网络两个文件。tokenlist.json 列出经过审核的代币,采用标准的 Uniswap Token Lists 格式,所以任何钱包、DEX 界面或聚合器都可以原样导入。tags.json 给知名合约一个可读的标签,即名称、类别和项目,这样浏览器就能在原本显示十六进制地址的地方显示「Pepper router」。

被收录的代币会在浏览器、Pepper、Toolkit、Names 和 Account 页面上显示已验证标记、它的 logo、名称和符号。被打上标签的合约在交易列表、地址页和搜索中都以它的标签显示。

这个标记说明什么,不说明什么

已验证标记说明这个代币经过了审核,而且它的合约地址确实对应这个名称。它不是投资建议,不是背书,也不是对合约的审计。

没有任何东西会被自动收录。用 Pepper 的代币发行器发行的代币,不会因为存在就被加进来;只有当有人提了 pull request 并且它符合标准时,才会被加入。

它放在哪里

这份列表放在一个公开的 GitHub 仓库里,github.com/PickleChain/token-list,每个网络一个文件夹:

文件夹内容
testnet/链 ID 78270Pickle 应用目前读取的列表
mainnet/目前为空主网上线时,主网的列表和标签会发布在这个文件夹里
schemas/tags.schema.jsontags.json 的 JSON Schema
scripts/validate.mjs由 npm test 和 CI 运行的校验器

一个网络文件夹里面:

路径是什么
tokenlist.json代币Uniswap Token Lists 格式;每个条目的 chainId 都是 78270
tags.json地址标签以校验和格式的合约地址为键
logos/tokens/每个代币一个 logo以该代币校验和格式的地址命名
logos/tags/项目 logo供标签引用;多个标签可以共用一个

原始文件 URL,始终指向 main 上的最新提交:

text
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tokenlist.json
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tags.json
读取 logoURI,不要自己拼

代币的 logo 可以是 PNG 也可以是 SVG,所以请从条目的 logoURI(或标签的 logo)取 URL,而不是根据地址拼出来。

如果是网站,请在服务端抓取这些文件并从你自己的来源提供,而不是让访客的浏览器直接热链 raw.githubusercontent.com:这样访客的 IP 地址不会暴露给第三方,也能避开 GitHub 的速率限制,并且在 GitHub 连不上时还能保留最后一份有效副本。在钱包或 DEX 界面里,把 tokenlist.json 的原始 URL 添加为自定义代币列表即可。

Pickle 应用如何使用它

在整个 Pickle 技术栈里,只有浏览器 API 会为这些文件去访问 GitHub。它大约每十分钟抓取一次这两个文件,把每个文件作为整体校验一遍,包括结构、链 ID、校验和、重复项,并把最后一份有效副本保存在内存和磁盘上。校验失败的文件会被整个拒绝,之前那份继续使用,所以一次坏提交永远不会让某个标签或 logo 变成空白。之后每个 Pickle 站点都从自己的来源读取浏览器的这份副本:

路由提供
GET /api/tokenlist最后一次校验通过的 tokenlist.json在第一份有效副本出现之前返回 503
GET /api/tags最后一次校验通过的 tags.json
GET /api/tokenlogo/{address}代币 logo 的字节代币未被收录或没有 logo 时返回 404
GET /api/taglogo/{address}标签 logo 的字节

这些路由位于 https://explorer.picklechain.xyz 上,受浏览器的 CORS 允许名单保护:它们服务于 Pickle 站点。你自己的应用请读取上面的原始文件。

合并之后多久能看到

pull request 合并后大约十分钟,新条目就会出现在每个 Pickle 应用上;再加上 GitHub 自己的缓存和各站点的缓存,最多可能要二十分钟。以同一文件名替换的 logo 最多可能要六个小时,因为 logo 是按 URL 缓存的。

添加一个代币

先看一下标准:不符合标准的代币的 pull request 会被关闭。然后在你 fork 的仓库里:

  1. 拿到校验和格式的地址。EIP-55 大小写混合,不是全小写。如果你的写错了,校验器会打印出正确的形式。
  2. 添加 logo 到 testnet/logos/tokens/,文件名与该地址完全一致:testnet/logos/tokens/0x0000…dEaD.png(或 .svg)。它必须符合 logo 规则。
  3. 追加一个条目到 testnet/tokenlist.json 的 tokens 中,如下面的示例所示。
  4. 提升 tokenlist.json 的版本号:添加代币是一次 minor 升级,1.4.2 变成 1.5.0;并把 timestamp 设为当前时间,采用 ISO 8601 UTC 格式。
  5. 运行检查:npm test。它只需要 Node 22 或更高版本,别无其他:校验器没有任何依赖,所以什么都不用安装。
  6. 向 main 提一个 pull request。在描述里附上一个链接,指向项目自己的网站或官方账号上写明了该合约地址的帖子。
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 代表你完整的、42 个字符的校验和格式地址;它只是一个占位符,不是代币。

字段规则
chainId78270文件夹对应的网络;其他值都会失败
addressEIP-55 校验和格式在列表中唯一
name1-40 个字符应用在 logo 旁边显示的内容
symbol1-20 个字符,不含空格在列表中唯一,不区分大小写
decimals0-255 的整数合约的 decimals() 返回的值
logoURI指向 testnet/logos/tokens/ 的原始 URL以地址命名的文件,.png 或 .svg
tags可选列表顶层 tags 中定义的 id,最多 10 个
extensions可选最多 10 个值,每个都是字符串、数字、布尔值或 null

在命令行上走完整个流程:

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.

Logo 规则

规则要求
格式PNG 或 SVG类型根据文件字节判断,而不是根据扩展名
PNG 尺寸正好 256 x 256 像素
文件大小最多 100 KB
文件名<校验和格式地址>.png 或 .svg针对代币;在 GitHub 上大小写有区别
位置与列表相同的网络文件夹testnet 的列表只能指向 testnet/logos/
图案正方形,在 20 像素下依然清晰可辨透明或纯色背景;应用通常会裁成圆形

SVG 必须是纯粹的图形

不能有 <script>,不能有事件处理属性,不能有 <foreignObject>,不能有外部的 href 或 url(),不能有 DOCTYPE。只提交你拥有或有权使用的图案。

logos/ 下的每个文件都必须被列表或标签引用。没有被任何东西引用的 logo 会导致检查失败,所以删除条目时,请在同一个 pull request 里一并删除它的 logo。

添加一个地址标签

标签是给人们在交易中会遇到的合约用的:协议合约、路由器、工厂、池子、金库、游戏、跨链桥。个人钱包永远不会被打标签。项目必须已经在 Pickle Chain 上运行,并且地址必须能在项目自己的文档或部署文件中核实。

  1. 添加一个条目到 testnet/tags.json 的 tags 中,以校验和格式的地址为键。
  2. 可选地添加一个 logo 到 testnet/logos/tags/:格式规则与代币 logo 相同,文件名随意;然后把 logo 指向它的原始 URL。同一个项目的多个标签可以共用一个文件。
  3. 提升 tags.json 的版本号并更新它的 timestamp,运行 npm test,然后提 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."
}
字段规则
name1-40 个字符,在文件中唯一代替地址显示,所以要简短、具体
categorycategories 中的一个键见下面的列表
project1-40 个字符该合约所属的项目
url一个 https:// 链接,或 null必填:没有时写 null
logo指向 testnet/logos/tags/ 的原始 URL,或 null必填:没有时写 null
note可选,最多 200 个字符用一句话说明该合约做什么

目前定义的类别:

键用于
token代币合约元数据和 logo 放在 tokenlist.json 里;标签只给它一个名字
protocol核心合约费用、质押、销毁、水龙头、注册表
bridgeETH 跨链桥位于 Pickle Chain 与其结算层之间
dexPepper 交易所合约工厂、路由器、报价器和代币发行器
pool一个 Pepper 流动性池
toolkitToolkit 合约批量转账、锁仓、流式支付和部署工厂
namesPickle 域名服务
oracle价格源
arcadeArcade 资金池及其游戏

如果都不合适,可以在同一个 pull request 里提议一个新类别:一个最多 20 个字符的小写键,带上 name 和 description。

更新或移除一个条目

  • 修改一个条目,比如名称、说明、网站、小数位:直接原地编辑,并提升 patch 版本号。和添加时一样,pull request 要由该代币的团队提交。
  • 更换 logo:替换文件即可。在 PNG 和 SVG 之间切换会改变文件名,所以要同时更新 logoURI 并删除旧文件。
  • 替换合约:添加新地址。对于标签,保留旧条目,并在它的名称后面加上 (previous),这样旧交易依然清晰可读。
  • 移除一个条目:删除它和它的 logo 文件,并做一次 major 版本升级。

维护者可以随时移除一个代币,比如在遭到攻击、卷款跑路、换到新合约,或元数据被误导性地修改之后。

版本

每个文件都有自己的 version,版本升级遵循 Token Lists 的规则。CI 会对照 pull request 的目标分支强制检查,而版本号一旦改变,就需要一个更新的 timestamp。

变更升级
移除一个条目major1.4.2 变成 2.0.0
添加一个条目minor1.4.2 变成 1.5.0
修改一个条目patch1.4.2 变成 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

审核检查什么

每个 pull request 都会在 GitHub Actions 里运行 npm test 和版本检查,然后由一位维护者审核。满足以下全部条件时,代币才会被加入:

  • 它部署在该文件夹对应的网络上,并且源码已验证或已公开。
  • pull request 由该代币的团队提交或确认,并附上一个链接,指向项目自己的网站或官方账号上写明了该合约地址的帖子。
  • 它的名称和符号没有模仿其他代币或项目。新的 PKL 或 WETH 会被拒绝。
  • 它有真实的用途:在 Pepper 上有流动性、有持有者,或有一个在运行的产品,而不是几分钟前才发行的代币。
  • 合约里没有团队未披露的隐藏增发、黑名单或手续费开关。

满足以下条件时,标签才会被加入:该地址是一个合约,项目已经在 Pickle Chain 上运行,并且地址能在项目自己的文档或部署文件中核实。

常见校验错误

npm test 会打印出每一个问题,而不只是第一个。大家最常遇到的错误及其修复方法:

消息修复
is not EIP-55 checksummed (expected …)使用消息里打印出的那个地址
logo file must be named after the checksummed address把 logo 重命名为大小写完全一致的地址
referenced but missing (case matters on GitHub)文件名和 logoURI 不一致,常常只是大小写不同
PNG is 512x512, it must be 256x256把图片缩放到 256 x 256
… bytes, the limit is 102400压缩它,或改用 SVG
not referenced by this network's tokenlist.json or tags.json; remove it删除残留的 logo,或修正指向它的条目
symbol "EXM" repeats tokens[3]这个符号已被占用;符号必须唯一
the file changed but version stayed 1.4.2; bump it提升版本号,见「版本」一节
this change needs a minor version bump添加是 minor,移除是 major;patch 不够
update timestamp when the version changes把 timestamp 设为当前的 UTC 时间
"logo" is required (use null for url or logo when there is none)写上 "logo": null 或 "url": null,而不是省略这个字段
category "vault" is not defined in categories使用已有的键,或在同一个 pull request 里添加这个类别
SVG must not reference external resources把一切都内联;移除外部的 href 和 url() 引用