開発者へ / トークン
トークンリストとアドレスタグ
どのトークンが検証済みマークを持ち、どのロゴと名前を表示し、コントラクトがアドレスの代わりにどんなラベルを得るかは、一つの公開リポジトリが決めます。そこに載る方法はプルリクエストです。
リストとは何か
ネットワークごとに二つのファイルがあります。tokenlist.json はレビュー済みの トークンを標準の Uniswap Token Lists 形式で並べたもので、どのウォレット、DEX の インターフェース、アグリゲーターもそのままインポートできます。tags.json は よく知られたコントラクトに読みやすいラベル(名前、カテゴリー、プロジェクト)を与え、 エクスプローラーが十六進のアドレスの代わりに「Pepper router」と表示できるようにします。
リストに載ったトークンは、エクスプローラー、Pepper、Toolkit、Names、そして Account の ページで、検証済みマーク、ロゴ、名前、シンボルを得ます。タグの付いたコントラクトは、 トランザクションの一覧、アドレスのページ、検索でそのラベルで表示されます。
マークが言っていること、言っていないこと
検証済みマークが言っているのは、そのトークンがレビューされ、そのコントラクトアドレスが その名前に対して正しいものだということです。投資の助言でも、推奨でも、コントラクトの 監査でもありません。
自動で載るものは何もありません。Pepper のトークンランチャーで発行された トークンも、存在するから追加されるのではありません。誰かがプルリクエストを開き、それが基準を満たしたときに追加されます。
どこにあるか
リストは公開の GitHub リポジトリ github.com/PickleChain/token-list に あり、ネットワークごとに一つのフォルダーがあります。
| フォルダー | 中身 |
|---|---|
| testnet/ | chain ID 78270いま Pickle のアプリが読んでいるリスト |
| mainnet/ | 今のところ空メインネットの開始時に、メインネットのリストとタグがこのフォルダーで公開されます |
| schemas/ | tags.schema.jsontags.json の JSON Schema |
| scripts/ | validate.mjsnpm test と CI が実行するバリデーター |
ネットワークのフォルダーの中身:
| パス | 内容 |
|---|---|
| tokenlist.json | トークンUniswap Token Lists 形式。どのエントリーも chainId 78270 |
| tags.json | アドレスタグチェックサム付きのコントラクトアドレスをキーにする |
| logos/tokens/ | トークンごとに一つのロゴトークンのチェックサム付きアドレスをファイル名にする |
| logos/tags/ | プロジェクトのロゴタグが指すもの。複数のタグで一つを共有できます |
raw の URL。常に main の最新のコミットを指します:
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tokenlist.json https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tags.json
トークンのロゴは PNG でも SVG でもありうるので、アドレスから組み立てずに、エントリーの logoURI(タグなら logo)から URL を取ってください。
ウェブサイトでは、訪問者のブラウザから raw.githubusercontent.com を直接 読み込ませるのではなく、サーバー側でファイルを取得して自分のオリジンから配信してください。 訪問者の IP アドレスを第三者に渡さずに済み、GitHub のレート制限を避けられ、GitHub に 届かないときも最後の正常なコピーを保てます。ウォレットや DEX のインターフェースでは、tokenlist.json の raw の URL をカスタムトークンリストとして追加してください。
Pickle のアプリはどう使うか
これらのファイルのために GitHub と通信するのは、Pickle のスタックの中でエクスプローラー API だけです。およそ十分ごとに両方を取得し、それぞれのファイルを全体として検証し(形、 チェーン ID、チェックサム、重複)、最後の正常なコピーをメモリーとディスクに保ちます。 検証に落ちたファイルは丸ごと拒否され、前のものが使われ続けるので、悪いコミットがラベルや ロゴを消すことは決してありません。そのうえで、どの Pickle のサイトも自分のオリジンから エクスプローラーのコピーを読みます。
| ルート | 返すもの |
|---|---|
| GET /api/tokenlist | 最後に検証された tokenlist.json最初の正常なコピーができるまでは 503 |
| GET /api/tags | 最後に検証された tags.json |
| GET /api/tokenlogo/{address} | トークンのロゴのバイト列トークンが載っていないかロゴがないときは 404 |
| GET /api/taglogo/{address} | タグのロゴのバイト列 |
これらのルートは https://explorer.picklechain.xyz にあり、エクスプローラーの CORS 許可リストの内側にあります。Pickle のサイトのためのものです。自分のアプリケーションは 上の raw のファイルを読んでください。
プルリクエストがマージされてからおよそ十分で、新しいエントリーはすべての Pickle の アプリに出ます。GitHub 自身のキャッシュとサイトのキャッシュが挟まると、最大で二十分 かかることがあります。同じファイル名のままロゴを差し替えた場合は、ロゴが URL ごとに キャッシュされるため、最大で六時間かかることがあります。
トークンを追加する
まず基準を確認してください。基準を満たさないトークンの プルリクエストは閉じられます。そのうえで、リポジトリのフォークで:
- チェックサム付きのアドレスを用意します。EIP-55 の大文字小文字混在で、 すべて小文字ではありません。間違っていれば、バリデーターが正しい形を表示します。
- ロゴを追加します。置き場所は
testnet/logos/tokens/で、 ファイル名はそのアドレスそのものです:testnet/logos/tokens/0x0000…dEaD.png(または.svg)。ロゴの規則に従う必要があります。 - エントリーを追加します。
testnet/tokenlist.jsonのtokensの末尾に、下の例のように。 - バージョンを上げます。
tokenlist.jsonの バージョンです。トークンの追加はマイナーの更新で、1.4.2 は 1.5.0 になります。そしてtimestampを現在時刻に、ISO 8601 の UTC で設定します。 - チェックを実行します。
npm testで。必要なのは Node 22 以降だけです。バリデーターには依存関係がないので、インストールするものは何もありません。 - プルリクエストを開きます。
mainに向けて。説明には、 プロジェクト自身のウェブサイトか公式アカウントの、コントラクトアドレスを明記した投稿への リンクを入れてください。
{
"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 文字のチェックサム付きアドレス全体を表します。これは プレースホルダーで、トークンではありません。
| フィールド | 規則 |
|---|---|
| chainId | 78270フォルダーのネットワーク。それ以外は失敗します |
| address | EIP-55 のチェックサム付きリスト内で一意 |
| name | 1-40 文字アプリがロゴの横に表示するもの |
| symbol | 1-20 文字、空白なしリスト内で、大文字小文字を区別せずに一意 |
| decimals | 整数 0-255コントラクトの decimals() が返す値 |
| logoURI | testnet/logos/tokens/ を指す raw の URLアドレスをファイル名にしたファイル。.png か .svg |
| tags | 任意リストのトップレベルの tags で定義された id。最大 10 個 |
| extensions | 任意最大 10 個の値。それぞれ文字列、数値、真偽値、null のいずれか |
コマンドラインでの一連の流れ:
# 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.
ロゴの規則
| 規則 | 要件 |
|---|---|
| 形式 | PNG または SVG種類は拡張子ではなくバイト列から判定されます |
| PNG のサイズ | ちょうど 256 x 256 ピクセル |
| ファイルサイズ | 最大 100 KB |
| ファイル名 | <checksummed address>.png or .svgトークンの場合。GitHub では大文字小文字が区別されます |
| 置き場所 | リストと同じネットワークのフォルダーテストネットのリストが指せるのは testnet/logos/ だけ |
| デザイン | 正方形で、20 ピクセルでも読めること透明または単色の背景。アプリはたいてい円形に切り抜きます |
SVG は単純な図形でなければなりません
<script>、イベントハンドラーの属性、 <foreignObject>、外部を指す href や url()、 DOCTYPE はいずれも不可です。自分が所有しているか、使用を許可されているデザインだけを 提出してください。
logos/ の下のファイルはすべて、リストかタグから参照されていなければなりません。 何からも指されていないロゴはチェックに落ちるので、エントリーを消すのと同じプルリクエストで ロゴも削除してください。
アドレスタグを追加する
タグは、人がトランザクションの中で出会うコントラクトのためのものです: プロトコルのコントラクト、ルーター、ファクトリー、プール、ボールト、ゲーム、ブリッジ。 個人のウォレットにタグが付くことはありません。プロジェクトは Pickle Chain で稼働して いなければならず、アドレスはプロジェクト自身のドキュメントかデプロイファイルで確認できる 必要があります。
- エントリーを追加します。
testnet/tags.jsonのtagsに、チェックサム付きのアドレスをキーにして。 - 必要ならロゴを追加します。
testnet/logos/tags/に、トークンの ロゴと同じ形式の規則で、ファイル名は自由です。そしてlogoをその raw の URL に向けます。同じプロジェクトの複数のタグで一つのファイルを共有できます。 - バージョンを上げます。
tags.jsonのバージョンとtimestampを更新し、npm testを実行して、プルリクエストを 開きます。
"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."
}| フィールド | 規則 |
|---|---|
| name | 1-40 文字、ファイル内で一意アドレスの代わりに表示されるので、短く具体的に |
| category | categories のキー下の一覧を参照 |
| project | 1-40 文字コントラクトが属するプロジェクト |
| url | https:// のリンク、または null必須:ないときは null と書きます |
| logo | testnet/logos/tags/ を指す raw の URL、または null必須:ないときは null と書きます |
| note | 任意、最大 200 文字コントラクトが何をするかを一文で |
現在定義されているカテゴリー:
| キー | 用途 |
|---|---|
| token | トークンのコントラクトメタデータとロゴは tokenlist.json にあり、タグはラベルを与えます |
| protocol | 中核のコントラクト手数料、ステーキング、バーン、フォーセット、レジストリ |
| bridge | ETH ブリッジPickle Chain とその決済レイヤーのあいだ |
| dex | Pepper の取引所のコントラクトファクトリー、ルーター、クォーター、トークンランチャー |
| pool | Pepper の流動性プール |
| toolkit | Toolkit のコントラクトマルチセンド、ロッカー、ストリーム、デプロイ用ファクトリー |
| names | Pickle Name Service |
| oracle | 価格フィード |
| arcade | アーケードのバンクとそのゲーム |
どれも当てはまらなければ、同じプルリクエストで新しいカテゴリーを提案してください。最大 20 文字の小文字のキーに、name と description を付けます。
エントリーを更新・削除する
- エントリーを変更する(名前、メモ、ウェブサイト、小数桁など)には、その場で 編集してパッチバージョンを上げます。追加のときと同じく、プルリクエストはトークンの チームから開いてください。
- ロゴを変更するには、ファイルを差し替えます。PNG と SVG を切り替えると ファイル名が変わるので、
logoURIを更新して古いファイルを削除してください。 - コントラクトを置き換えるには、新しいアドレスを追加します。タグの場合は 古いエントリーを残し、その名前の末尾に
(previous)を付けてください。古い トランザクションも分かりやすく読めるままになります。 - エントリーを削除するには、それとそのロゴファイルを削除し、メジャー バージョンを上げます。
メンテナーはいつでもトークンを削除できます。エクスプロイト、ラグプル、新しいコントラクトへの 切り替え、誤解を招くメタデータの変更があった後などです。
バージョン
ファイルはそれぞれ自分の version を持ち、その上げ方は Token Lists の規則に 従います。CI はプルリクエストのベースブランチと比べてそれを強制し、バージョンを変えたときは より新しい timestamp が必要です。
| 変更 | 上げ方 |
|---|---|
| エントリーの削除 | major1.4.2 は 2.0.0 になる |
| エントリーの追加 | minor1.4.2 は 1.5.0 になる |
| エントリーの変更 | patch1.4.2 は 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
レビューで確認されること
どのプルリクエストでも GitHub Actions で npm test とバージョンのチェックが 実行され、そのあとメンテナーがレビューします。トークンが追加されるのは、次のすべてが 成り立つときです。
- そのフォルダーのネットワークにデプロイされていて、ソースが検証済みか公開されている。
- プルリクエストがトークンのチームによって開かれるか確認されていて、コントラクトアドレスを 明記したプロジェクト自身のウェブサイトか公式アカウントの投稿へのリンクが付いている。
- 名前とシンボルがほかのトークンやプロジェクトを模倣していない。新しい PKL や WETH は拒否されます。
- 実際に使われている:Pepper での流動性、保有者、あるいは稼働中のプロダクト。数分前に発行されたトークンではないこと。
- チームが開示していない、隠れたミント、ブラックリスト、手数料のスイッチがコントラクトにない。
タグが追加されるのは、アドレスがコントラクトであり、プロジェクトが Pickle Chain で 稼働していて、そのアドレスがプロジェクト自身のドキュメントかデプロイファイルで確認できる ときです。
よくある検証エラー
npm test は最初の一つだけでなく、すべての問題を表示します。よく出会うものと、 その直し方:
| メッセージ | 直し方 |
|---|---|
| is not EIP-55 checksummed (expected …) | メッセージが表示するアドレスを使う |
| logo file must be named after the checksummed address | ロゴのファイル名を、大文字小文字まで正確なアドレスに変える |
| 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 | 残ったロゴを削除するか、それを指すエントリーを直す |
| symbol "EXM" repeats tokens[3] | そのシンボルは使用済み。シンボルは一意 |
| the file changed but version stayed 1.4.2; bump it | バージョンを上げる(「バージョン」を参照) |
| this change needs a minor version bump | 追加はマイナー、削除はメジャー。パッチでは足りない |
| 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 | 既存のキーを使うか、同じプルリクエストでカテゴリーを追加する |
| SVG must not reference external resources | すべてをインライン化し、外部を指す href と url() の参照を取り除く |