• Stars
    star
    926
  • Rank 47,712 (Top 1.0 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 4 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

📚 The Token Lists specification

@uniswap/token-lists (beta)

Tests npm

This package includes a JSON schema for token lists, and TypeScript utilities for working with token lists.

The JSON schema represents the technical specification for a token list which can be used in a dApp interface, such as the Uniswap Interface.

What are token lists?

Uniswap Token Lists is a specification for lists of token metadata (e.g. address, decimals, ...) that can be used by any dApp interfaces that needs one or more lists of tokens.

Anyone can create and maintain a token list, as long as they follow the specification.

Specifically an instance of a token list is a JSON blob that contains a list of ERC20 token metadata for use in dApp user interfaces. Token list JSON must validate against the JSON schema in order to be used in the Uniswap Interface. Tokens on token lists, and token lists themselves, are tagged so that users can easily find tokens.

JSON Schema $id

The JSON schema ID is https://uniswap.org/tokenlist.schema.json

Validating token lists

This package does not include code for token list validation. You can easily do this by including a library such as ajv to perform the validation against the JSON schema. The schema is exported from the package for ease of use.

import { schema } from '@uniswap/token-lists'
import Ajv from 'ajv'
import addFormats from 'ajv-formats'
import fetch from 'node-fetch'

const ARBITRUM_LIST = 'https://bridge.arbitrum.io/token-list-42161.json'

async function validate() {
  const ajv = new Ajv({ allErrors: true, verbose: true })
  addFormats(ajv)
  const validator = ajv.compile(schema);
  const response = await fetch(ARBITRUM_LIST)
  const data = await response.json()
  const valid = validator(data)
  if (valid) {
    return valid
  }
  if (validator.errors) {
    throw validator.errors.map(error => {
      delete error.data
      return error
    })
  }
}

validate()
  .then(console.log("Valid List."))
  .catch(console.error)

Authoring token lists

Manual

The best way to manually author token lists is to use an editor that supports JSON schema validation. Most popular code editors do, such as IntelliJ or VSCode. Other editors can be found here.

The schema is registered in the SchemaStore, and any file that matches the pattern *.tokenlist.json should automatically utilize the JSON schema for the supported text editors.

In order for your token list to be able to be used, it must pass all JSON schema validation.

Automated

If you want to automate token listing, e.g. by pulling from a smart contract, or other sources, you can use this npm package to take advantage of the JSON schema for validation and the TypeScript types. Otherwise, you are simply working with JSON. All the usual tools apply, e.g.:

import { TokenList, schema } from '@uniswap/token-lists'

// generate your token list however you like.
const myList: TokenList = generateMyTokenList();

// use a tool like `ajv` to validate your generated token list
validateMyTokenList(myList, schema);

// print the resulting JSON to stdout
process.stdout.write(JSON.stringify(myList));

Semantic versioning

Lists include a version field, which follows semantic versioning.

List versions must follow the rules:

  • Increment major version when tokens are removed
  • Increment minor version when tokens are added
  • Increment patch version when tokens already on the list have minor details changed (name, symbol, logo URL, decimals)

Changing a token address or chain ID is considered both a remove and an add, and should be a major version update.

Note that list versioning is used to improve the user experience, but not for security, i.e. list versions are not meant to provide protection against malicious updates to a token list; i.e. the list semver is used as a lossy compression of the diff of list updates. List updates may still be diffed in the client dApp.

Deploying your list

Once you have authored the list, you can make it available at any URI. Prefer pinning your list to IPFS (e.g. via pinata.cloud) and referencing the list by an ENS name that resolves to the contenthash.

If hosted on HTTPS, make sure the endpoint is configured to send an access-control-allow-origin header to avoid CORS errors.

Linking an ENS name to the list

An ENS name can be assigned to an IPFS hash via the contenthash text record. This is the preferred way of referencing your list.

Examples

You can find a simple example of a token list in test/schema/example.tokenlist.json.

A snapshot of the Uniswap default list encoded as a token list is found in test/schema/bigexample.tokenlist.json.

More Repositories

1

web3-react

A simple, maximally extensible, dependency minimized framework for building modern Ethereum dApps
TypeScript
5,373
star
2

interface

🦄 Open source interfaces for the Uniswap protocol
TypeScript
4,729
star
3

v3-core

🦄 🦄 🦄 Core smart contracts of Uniswap v3
TypeScript
4,154
star
4

v2-core

🦄 🦄 Core smart contracts of Uniswap V2
TypeScript
2,813
star
5

v4-core

🦄 🦄 🦄 🦄 Core smart contracts of Uniswap v4
Solidity
1,810
star
6

v3-periphery

🦄 🦄 🦄 Peripheral smart contracts for interacting with Uniswap v3
TypeScript
1,114
star
7

v2-periphery

🎚 Peripheral smart contracts for interacting with Uniswap V2
Solidity
916
star
8

permit2

🔑🔑🔑 next generation token approvals mechanism
Solidity
668
star
9

v4-periphery

🦄 🦄 🦄 🦄 Peripheral smart contracts for interacting with Uniswap v4
Solidity
640
star
10

wallet

Uniswap Wallet is the simplest, safest, and most powerful self-custodial crypto wallet. It is developed by the Uniswap Labs team, inventors of the Uniswap Protocol.
TypeScript
530
star
11

merkle-distributor

📦 A smart contract that distributes a balance of tokens according to a merkle root
TypeScript
497
star
12

v3-sdk

🛠 An SDK for building applications on top of Uniswap V3
TypeScript
453
star
13

v1-contracts

🐍Uniswap V1 smart contracts
Python
438
star
14

v2-sdk

🛠 An SDK for building applications on top of Uniswap V2
TypeScript
421
star
15

v2-subgraph

Uniswap V2 subgraph 📊
TypeScript
392
star
16

v3-info

Interface for Uniswap V3 analytics. 📊
TypeScript
378
star
17

smart-order-router

TypeScript
369
star
18

universal-router

Uniswap's Universal Router for NFT and ERC20 swapping
TypeScript
363
star
19

UniswapX

🦄 Gasless ERC20 swap settlement protocol 🦄
Solidity
355
star
20

v3-staker

Canonical liquidity mining contract for Uniswap V3
TypeScript
330
star
21

v3-subgraph

Subgraph for Uniswap V3
TypeScript
312
star
22

docs

📓 Uniswap V3 docs website
TypeScript
299
star
23

default-token-list

◦ The Uniswap default token list
JavaScript
298
star
24

info

ℹ️ Uniswap v1+v2 analytics
JavaScript
283
star
25

tokenlists-org

A site for browsing featured token lists
JavaScript
175
star
26

sybil-list

List of verified mappings from Ethereum addresses to social profiles
162
star
27

org-v1

🌐 Uniswap protocol homepage
JavaScript
144
star
28

routing-api

TypeScript
131
star
29

solidity-lib

📖 Solidity libraries that are shared across Uniswap contracts
TypeScript
131
star
30

governance-seatbelt

Make governance safer
TypeScript
116
star
31

token-list-bridge-utils

TypeScript
116
star
32

widgets

TypeScript
112
star
33

retroactive-query

👀⬅️ Queries for surfacing information about past users of Uniswap
109
star
34

v3-market-depth-study

Market depth calculation for Uniswap v3
Python
107
star
35

examples

TypeScript
103
star
36

swap-router-contracts

Smart contracts for swapping on Uniswap V2 and V3. Superseded by https://github.com/Uniswap/universal-router
TypeScript
102
star
37

unisocks

🧦
JavaScript
101
star
38

redux-multicall

A React + Redux library for fetching, batching, and caching chain state via the MultiCall contract.
TypeScript
93
star
39

api-deprecated

🔮 Uniswap market data
TypeScript
86
star
40

governance

🏛 Governance contracts for the Uniswap protocol
Solidity
78
star
41

sdk-core

⚙️ Code shared across TypeScript Uniswap SDK versions
TypeScript
77
star
42

universal-router-sdk

TypeScript
75
star
43

hardhat-v3-deploy

Hardhat plugin for Uniswap V3 deployment
TypeScript
75
star
44

v3-polars

Jupyter Notebook
75
star
45

sybil-interface

Interface that incorporates Sybil, a governance tool for discovering delegates.
TypeScript
69
star
46

deploy-v3

CLI to deploy Uniswap V3 to any Ethereum compatible network
TypeScript
62
star
47

liquidity-staker

Initial UNI liquidity staking contracts
TypeScript
60
star
48

unisocks-erc721

🧦
Python
52
star
49

v1-docs

42
star
50

widgets-demo

@uniswap/widgets demo
40
star
51

uniswapx-sdk

SDK bindings for the UniswapX protocol
TypeScript
39
star
52

unipig

🦄🐷
JavaScript
38
star
53

v3-new-chain-deployments

Instructions for deploying the Uniswap V3 protocol to new chains after receiving approval from governance.
32
star
54

uniswapx-service

UniswapX Order Service
TypeScript
32
star
55

marketdepth-v3

Uniswap v3 onchain market depth calculator
Solidity
32
star
56

unified-routing-api

TypeScript
31
star
57

uniswapx-parameterization-api

TypeScript
31
star
58

permit2-sdk

TypeScript
29
star
59

old-solidity-contracts

⚠️ DEPRECATED
Python
29
star
60

unisocks-erc20

🧦
Python
26
star
61

v3-core-optimism

Optimism fork of the V3 core contracts
TypeScript
25
star
62

lp-action-contracts

Solidity
25
star
63

sybil-verifier-worker

Cloudlfare worker to verify mappings for Sybil, a governance tool for delegates.
JavaScript
25
star
64

uniswap-first-contract-example

Example code for the smart contract getting started example.
JavaScript
24
star
65

router-sdk

TypeScript
21
star
66

advanced-weth

A smart contract that wraps WETH that adds functionality for transparently dealing in WETH
JavaScript
20
star
67

v3-periphery-optimism

Optimism fork of the V3 periphery contracts
TypeScript
17
star
68

ethers-rs-mobile

Rust
16
star
69

ds-tools

Python
15
star
70

jest-environment-hardhat

TypeScript
15
star
71

conedison

Utilities for Uniswap repositories
TypeScript
13
star
72

extended-token-list

JavaScript
12
star
73

v1-interface

💀 Legacy interface for the Uniswap V1 protocol
JavaScript
12
star
74

returns-comparison-study

Python
11
star
75

mask-app

TypeScript
10
star
76

convert-cidv0-cidv1

GitHub action that converts CIDv0 for IPFS to CIDv1
JavaScript
9
star
77

polygon-bridge

Bridge contract for Polygon
TypeScript
9
star
78

mrkl-drop-data-chunks

The Merkle drop data broken up into chunks of 101 addresses and including a mapping file
TypeScript
8
star
79

fx-comparison-study

R
7
star
80

snapshot-gas-cost

Tiny utility package for snapshotting gas costs
TypeScript
7
star
81

eslint-config

Uniswap ESLint config
JavaScript
7
star
82

analytics

Uniswap analytics
TypeScript
7
star
83

interface-redirects

↪️ Redirects for alternative app.uniswap.org domains
6
star
84

analytics-events

Uniswap analytics events
TypeScript
6
star
85

permit2-dashboard

a dashboard for managing permit2 permissions
TypeScript
6
star
86

replace-vercel-dns-records

GitHub action for replacing Vercel DNS records, particularly useful for IPFS DNSLink TXT records
JavaScript
5
star
87

view-quoter-v3

Solidity
5
star
88

ticketblaster

a whimsical ticketing thing
TypeScript
4
star
89

relayer

Contracts supporting relayed UniversalRouter swaps
Solidity
4
star
90

v1-sdk

🛠 An SDK for building applications on top of Uniswap V1
TypeScript
3
star
91

signer

TypeScript
3
star
92

info-redirects

↪️ Redirects for the uniswap.info domain
1
star