開発者へ / トークン

トークンリストとアドレスタグ

どのトークンが検証済みマークを持ち、どのロゴと名前を表示し、コントラクトがアドレスの代わりにどんなラベルを得るかは、一つの公開リポジトリが決めます。そこに載る方法はプルリクエストです。

リストとは何か

ネットワークごとに二つのファイルがあります。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 の最新のコミットを指します:

text
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tokenlist.json
https://raw.githubusercontent.com/PickleChain/token-list/main/testnet/tags.json
logoURI は読むもので、組み立てるものではありません

トークンのロゴは 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 ごとに キャッシュされるため、最大で六時間かかることがあります。

トークンを追加する

まず基準を確認してください。基準を満たさないトークンの プルリクエストは閉じられます。そのうえで、リポジトリのフォークで:

  1. チェックサム付きのアドレスを用意します。EIP-55 の大文字小文字混在で、 すべて小文字ではありません。間違っていれば、バリデーターが正しい形を表示します。
  2. ロゴを追加します。置き場所は testnet/logos/tokens/ で、 ファイル名はそのアドレスそのものです:testnet/logos/tokens/0x0000…dEaD.png(または .svg)。ロゴの規則に従う必要があります。
  3. エントリーを追加します。testnet/tokenlist.json の tokens の末尾に、下の例のように。
  4. バージョンを上げます。tokenlist.json の バージョンです。トークンの追加はマイナーの更新で、1.4.2 は 1.5.0 になります。そして timestamp を現在時刻に、ISO 8601 の UTC で設定します。
  5. チェックを実行します。npm test で。必要なのは Node 22 以降だけです。バリデーターには依存関係がないので、インストールするものは何もありません。
  6. プルリクエストを開きます。main に向けて。説明には、 プロジェクト自身のウェブサイトか公式アカウントの、コントラクトアドレスを明記した投稿への リンクを入れてください。
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 文字アプリがロゴの横に表示するもの
symbol1-20 文字、空白なしリスト内で、大文字小文字を区別せずに一意
decimals整数 0-255コントラクトの decimals() が返す値
logoURItestnet/logos/tokens/ を指す raw の 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.

ロゴの規則

規則要件
形式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 で稼働して いなければならず、アドレスはプロジェクト自身のドキュメントかデプロイファイルで確認できる 必要があります。

  1. エントリーを追加します。testnet/tags.json の tags に、チェックサム付きのアドレスをキーにして。
  2. 必要ならロゴを追加します。testnet/logos/tags/ に、トークンの ロゴと同じ形式の規則で、ファイル名は自由です。そして logo をその raw の URL に向けます。同じプロジェクトの複数のタグで一つのファイルを共有できます。
  3. バージョンを上げます。tags.json のバージョンと timestamp を更新し、npm test を実行して、プルリクエストを 開きます。
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 文字コントラクトが属するプロジェクト
urlhttps:// のリンク、または null必須:ないときは null と書きます
logotestnet/logos/tags/ を指す raw の URL、または null必須:ないときは null と書きます
note任意、最大 200 文字コントラクトが何をするかを一文で

現在定義されているカテゴリー:

キー用途
tokenトークンのコントラクトメタデータとロゴは tokenlist.json にあり、タグはラベルを与えます
protocol中核のコントラクト手数料、ステーキング、バーン、フォーセット、レジストリ
bridgeETH ブリッジPickle Chain とその決済レイヤーのあいだ
dexPepper の取引所のコントラクトファクトリー、ルーター、クォーター、トークンランチャー
poolPepper の流動性プール
toolkitToolkit のコントラクトマルチセンド、ロッカー、ストリーム、デプロイ用ファクトリー
namesPickle 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 になる
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

レビューで確認されること

どのプルリクエストでも 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 changestimestamp を現在の 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() の参照を取り除く