feat(lists): allow selecting and adding token lists (#1023)
* more list stuff
Use the selected list instead of the default list, but also use the default list
start list selection code
* move token warning to a modal, fix the install issue
* add/remove/enter key
* handle enter on currency select for ETHER
* change slippage tolerance to be a slider
* make ui closer to the mocks
* commit slider changes
* back to tabs
* copy changes
* bump list version
* some styling for the list select
* bump uniswap default list version
* use contract calls to get ens names and addresses
* show list logo
* fix failing integration test
* .eth.link
* list introduction screen
* remove showSendWithSwap
* fix integration and unit tests
* resolve ENS names
* logos from ens
* fix the lint errors
* some refactoring to better support using a the library provider from the user for resolving ENS names
* load list info from the list url for the introduction page
* make it slightly harder to remove a list
* minor clean up, some help text and links
* remove icon from list update popup
* show added/removed tokens
* add GA everywhere, don't debounce contenthash lookups
* show tags
* fix tag key
* tag display, list rendering, needs optimization
* fix list fetching in firefox, style issue in safari
* sort the lists, clean up styling
* use client provider when possible
* show token warning for url loaded tokens
* improve the warning modal
* some refactoring to fix the list fetching on networks other than mainnet
* fix tests
* some minor improvements
* increase timeout to maybe fix integration tests which pass locally
* build for tests using the dev network url
* reset the lists if we deleted the other two copies
* improve how we handle updating the default list of lists
* fix integration test
* Update token list selection styles
* fix external links, reuse the on click outside code, show add errors
* show the list origin instead of the full url
* fix update list link
* show host instead of hostname
do not automatically dismiss major version upgrades for lists
* fix link to tokenlists.org
* add uma
* clean up styling in list rows
* bump token list version
* bump token list version again
* hover symbol to see currency name
* bump version
* add cmc lists, dharma list
Co-authored-by: Callil Capuozzo <callil.capuozzo@gmail.com>
2020-08-26 16:46:21 +03:00
|
|
|
import { TokenList } from '@uniswap/token-lists'
|
|
|
|
import schema from '@uniswap/token-lists/src/tokenlist.schema.json'
|
|
|
|
import Ajv from 'ajv'
|
|
|
|
import contenthashToUri from './contenthashToUri'
|
|
|
|
import { parseENSAddress } from './parseENSAddress'
|
|
|
|
import uriToHttp from './uriToHttp'
|
|
|
|
|
|
|
|
const tokenListValidator = new Ajv({ allErrors: true }).compile(schema)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Contains the logic for resolving a list URL to a validated token list
|
|
|
|
* @param listUrl list url
|
|
|
|
* @param resolveENSContentHash resolves an ens name to a contenthash
|
|
|
|
*/
|
|
|
|
export default async function getTokenList(
|
|
|
|
listUrl: string,
|
|
|
|
resolveENSContentHash: (ensName: string) => Promise<string>
|
|
|
|
): Promise<TokenList> {
|
|
|
|
const parsedENS = parseENSAddress(listUrl)
|
|
|
|
let urls: string[]
|
|
|
|
if (parsedENS) {
|
|
|
|
let contentHashUri
|
|
|
|
try {
|
|
|
|
contentHashUri = await resolveENSContentHash(parsedENS.ensName)
|
|
|
|
} catch (error) {
|
|
|
|
console.debug(`Failed to resolve ENS name: ${parsedENS.ensName}`, error)
|
|
|
|
throw new Error(`Failed to resolve ENS name: ${parsedENS.ensName}`)
|
|
|
|
}
|
|
|
|
let translatedUri
|
|
|
|
try {
|
|
|
|
translatedUri = contenthashToUri(contentHashUri)
|
|
|
|
} catch (error) {
|
|
|
|
console.debug('Failed to translate contenthash to URI', contentHashUri)
|
|
|
|
throw new Error(`Failed to translate contenthash to URI: ${contentHashUri}`)
|
|
|
|
}
|
|
|
|
urls = uriToHttp(`${translatedUri}${parsedENS.ensPath ?? ''}`)
|
|
|
|
} else {
|
|
|
|
urls = uriToHttp(listUrl)
|
|
|
|
}
|
|
|
|
for (let i = 0; i < urls.length; i++) {
|
|
|
|
const url = urls[i]
|
|
|
|
const isLast = i === urls.length - 1
|
|
|
|
let response
|
|
|
|
try {
|
2021-04-26 18:50:34 +03:00
|
|
|
response = await fetch(url, { credentials: 'omit' })
|
feat(lists): allow selecting and adding token lists (#1023)
* more list stuff
Use the selected list instead of the default list, but also use the default list
start list selection code
* move token warning to a modal, fix the install issue
* add/remove/enter key
* handle enter on currency select for ETHER
* change slippage tolerance to be a slider
* make ui closer to the mocks
* commit slider changes
* back to tabs
* copy changes
* bump list version
* some styling for the list select
* bump uniswap default list version
* use contract calls to get ens names and addresses
* show list logo
* fix failing integration test
* .eth.link
* list introduction screen
* remove showSendWithSwap
* fix integration and unit tests
* resolve ENS names
* logos from ens
* fix the lint errors
* some refactoring to better support using a the library provider from the user for resolving ENS names
* load list info from the list url for the introduction page
* make it slightly harder to remove a list
* minor clean up, some help text and links
* remove icon from list update popup
* show added/removed tokens
* add GA everywhere, don't debounce contenthash lookups
* show tags
* fix tag key
* tag display, list rendering, needs optimization
* fix list fetching in firefox, style issue in safari
* sort the lists, clean up styling
* use client provider when possible
* show token warning for url loaded tokens
* improve the warning modal
* some refactoring to fix the list fetching on networks other than mainnet
* fix tests
* some minor improvements
* increase timeout to maybe fix integration tests which pass locally
* build for tests using the dev network url
* reset the lists if we deleted the other two copies
* improve how we handle updating the default list of lists
* fix integration test
* Update token list selection styles
* fix external links, reuse the on click outside code, show add errors
* show the list origin instead of the full url
* fix update list link
* show host instead of hostname
do not automatically dismiss major version upgrades for lists
* fix link to tokenlists.org
* add uma
* clean up styling in list rows
* bump token list version
* bump token list version again
* hover symbol to see currency name
* bump version
* add cmc lists, dharma list
Co-authored-by: Callil Capuozzo <callil.capuozzo@gmail.com>
2020-08-26 16:46:21 +03:00
|
|
|
} catch (error) {
|
|
|
|
console.debug('Failed to fetch list', listUrl, error)
|
|
|
|
if (isLast) throw new Error(`Failed to download list ${listUrl}`)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
if (isLast) throw new Error(`Failed to download list ${listUrl}`)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
const json = await response.json()
|
|
|
|
if (!tokenListValidator(json)) {
|
|
|
|
const validationErrors: string =
|
|
|
|
tokenListValidator.errors?.reduce<string>((memo, error) => {
|
|
|
|
const add = `${error.dataPath} ${error.message ?? ''}`
|
|
|
|
return memo.length > 0 ? `${memo}; ${add}` : `${add}`
|
|
|
|
}, '') ?? 'unknown error'
|
|
|
|
throw new Error(`Token list failed validation: ${validationErrors}`)
|
|
|
|
}
|
|
|
|
return json
|
|
|
|
}
|
|
|
|
throw new Error('Unrecognized list URL protocol.')
|
|
|
|
}
|