diff --git a/.gitignore b/.gitignore index 4e48f338e..bd490010e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea/ node_modules -build/ \ No newline at end of file +build/ +generated/ \ No newline at end of file diff --git a/internal/buildList.js b/internal/buildList.js new file mode 100644 index 000000000..80b297c1c --- /dev/null +++ b/internal/buildList.js @@ -0,0 +1,74 @@ +const { version } = require("../package.json"); + +const mainnet = require("../tokens/mainnet.json"); +const ropsten = require("../tokens/ropsten.json"); +const rinkeby = require("../tokens/rinkeby.json"); +const goerli = require("../tokens/goerli.json"); +const kovan = require("../tokens/kovan.json"); +const fantom = require("../tokens/fantom.json"); +const fantomTestnet = require("../tokens/fantom-testnet.json"); +const matic = require("../tokens/matic.json"); +const maticTestnet = require("../tokens/matic-testnet.json"); +const xdai = require("../tokens/xdai.json"); +const bsc = require("../tokens/bsc.json"); +const bscTestnet = require("../tokens/bsc-testnet.json"); +const moonbase = require("../tokens/moonbase.json"); +const avalanche = require("../tokens/avalanche.json"); +const fuji = require("../tokens/fuji.json"); +const heco = require("../tokens/heco.json"); +const hecoTestnet = require("../tokens/heco-testnet.json"); +const harmony = require("../tokens/harmony.json"); +const harmonyTestnet = require("../tokens/harmony-testnet.json"); +const okex = require("../tokens/okex.json"); +const okexTestnet = require("../tokens/okex-testnet.json"); +//const arbitrum = require("../tokens/arbitrum.json"); +//const celo = require("../tokens/celo.json"); + +module.exports = function buildList() { + const parsed = version.split("."); + return { + name: "SushiSwap Menu", + timestamp: new Date().toISOString(), + version: { + major: +parsed[0], + minor: +parsed[1], + patch: +parsed[2], + }, + tags: {}, + logoURI: + "https://raw.githubusercontent.com/sushiswap/art/master/sushi/logo-256x256.png", + keywords: ["sushiswap", "default"], + tokens: [ + ...mainnet, + ...ropsten, + ...goerli, + ...kovan, + ...rinkeby, + ...fantom, + ...fantomTestnet, + ...matic, + ...maticTestnet, + ...xdai, + ...bsc, + ...bscTestnet, + ...moonbase, + ...avalanche, + ...fuji, + ...heco, + ...hecoTestnet, + ...harmony, + ...harmonyTestnet, + ...okex, + ...okexTestnet, + //...arbitrum, + //...celo, + ] + // sort them by symbol for easy readability + .sort((t1, t2) => { + if (t1.chainId === t2.chainId) { + return t1.symbol.toLowerCase() < t2.symbol.toLowerCase() ? -1 : 1; + } + return t1.chainId < t2.chainId ? -1 : 1; + }), + }; +}; diff --git a/internal/sync.js b/internal/sync.js new file mode 100644 index 000000000..497e6e9e4 --- /dev/null +++ b/internal/sync.js @@ -0,0 +1,93 @@ +const XLSX = require("xlsx"); + +const { Octokit } = require("@octokit/rest"); + +const octokit = new Octokit(); + +const { ChainId } = require("@sushiswap/sdk"); + +const fs = require("fs"); + +const { resolve } = require("path"); + +const NAME = { + [ChainId.MAINNET]: "mainnet", + [ChainId.FANTOM]: "fantom", + [ChainId.MATIC]: "matic", + [ChainId.XDAI]: "xdai", + [ChainId.BSC]: "bsc", + [ChainId.AVALANCHE]: "avalanche", + [ChainId.HECO]: "heco", + [ChainId.HARMONY]: "harmony", + [ChainId.OKEX]: "okex", + [ChainId.CELO]: "celo", +}; + +(async () => { + try { + const book = XLSX.utils.book_new(); + + for (const key of Object.keys(ChainId)) { + const path = resolve(__dirname, `../tokens/${NAME[key]}.json`); + + if (!fs.existsSync(path)) { + continue; + } + + const tokens = require(path); + + // Grab file file names of the sushiswap/icons repo at the token path + // we can use this to see if our default list is missing icons + const { data } = await octokit.rest.repos.getContent({ + owner: "sushiswap", + repo: "icons", + path: "token", + }); + + const icons = data.map((data) => data.name.replace(".jpg", "")); + + const json = []; + + for (const token of tokens) { + const listIcon = icons.find( + (icon) => icon === token.symbol.toLowerCase() + ); + + // TODO: Check Figma and get icon if available + const figmaIcon = undefined; + + const icon = listIcon || figmaIcon; + + if ((!token.logoURI && !icon) || !icon) { + json.push({ + network: NAME[key], + address: token.address, + name: token.name, + symbol: token.symbol, + logoURI: token?.logoURI || "", + }); + console.log("Add to list to send to chester"); + continue; + } + + // Check if logoURI has correct path + if (!token.logoURI.includes("sushiswap/icons")) { + // TODO: Automate this part... + const logoURI = `https://raw.githubusercontent.com/sushiswap/icons/master/token/${icon}.jpg`; + + console.log(`Update Logo URI for ${token.symbol} with ${logoURI}`); + } else { + console.log(`Logo URI for ${token.symbol} is correct`); + } + } + + const sheet = XLSX.utils.json_to_sheet(json); + + XLSX.utils.book_append_sheet(book, sheet, NAME[key]); + } + + XLSX.writeFile(book, resolve(__dirname, `../generated/missing-icons.xlsx`)); + } catch (error) { + console.error(error); + } +})(); diff --git a/internal/write.js b/internal/write.js new file mode 100644 index 000000000..fbfed6cd0 --- /dev/null +++ b/internal/write.js @@ -0,0 +1,2 @@ +const buildList = require("./buildList"); +console.log(JSON.stringify(buildList(), null, 2)); diff --git a/package.json b/package.json index 7d230626b..59c0ee8ed 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,9 @@ "main": "build/sushiswap-default.tokenlist.json", "scripts": { "test": "mocha", - "build": "rimraf build && mkdir -p build && node src/write.js > build/sushiswap-default.tokenlist.json", - "prepublishOnly": "npm test && npm run build" + "build": "rimraf build && mkdir -p build && node internal/write.js > build/sushiswap-default.tokenlist.json", + "prepublishOnly": "npm test && npm run build", + "sync": "node internal/sync.js" }, "files": [ "build/sushiswap-default.tokenlist.json" @@ -29,11 +30,15 @@ "homepage": "https://github.com/sushiswap/default-token-list#readme", "devDependencies": { "@ethersproject/address": "^5.0.2", + "@ethersproject/solidity": "^5.3.0", "@octokit/rest": "^18.6.2", + "@sushiswap/sdk": "^5.0.0-canary.22", "@uniswap/token-lists": "^1.0.0-beta.19", "ajv": "^6.12.3", "chai": "^4.2.0", + "lodash": "^4.17.21", "mocha": "^8.0.1", - "rimraf": "^3.0.2" + "rimraf": "^3.0.2", + "xlsx": "^0.17.0" } } diff --git a/src/buildList.js b/src/buildList.js deleted file mode 100644 index 87809c3aa..000000000 --- a/src/buildList.js +++ /dev/null @@ -1,73 +0,0 @@ -const { version } = require("../package.json"); - -const mainnet = require("./tokens/mainnet.json"); -const ropsten = require("./tokens/ropsten.json"); -const rinkeby = require("./tokens/rinkeby.json"); -const goerli = require("./tokens/goerli.json"); -const kovan = require("./tokens/kovan.json"); -const fantom = require("./tokens/fantom.json"); -const fantomTestnet = require("./tokens/fantom-testnet.json"); -const matic = require("./tokens/matic.json"); -const maticTestnet = require("./tokens/matic-testnet.json"); -const xdai = require("./tokens/xdai.json"); -const bsc = require("./tokens/bsc.json"); -const bscTestnet = require("./tokens/bsc-testnet.json"); -const moonbase = require("./tokens/moonbase.json"); -const avalanche = require("./tokens/avalanche.json"); -const fuji = require("./tokens/fuji.json"); -const heco = require("./tokens/heco.json"); -const hecoTestnet = require("./tokens/heco-testnet.json"); -const harmony = require("./tokens/harmony.json"); -const harmonyTestnet = require("./tokens/harmony-testnet.json"); -const okex = require("./tokens/okex.json"); -const okexTestnet = require("./tokens/okex-testnet.json"); -//const arbitrum = require("./tokens/arbitrum.json"); -//const celo = require("./tokens/celo.json"); -module.exports = function buildList() { - const parsed = version.split("."); - return { - name: "SushiSwap Menu", - timestamp: new Date().toISOString(), - version: { - major: +parsed[0], - minor: +parsed[1], - patch: +parsed[2], - }, - tags: {}, - logoURI: - "https://raw.githubusercontent.com/sushiswap/art/master/sushi/logo-256x256.png", - keywords: ["sushiswap", "default"], - tokens: [ - ...mainnet, - ...ropsten, - ...goerli, - ...kovan, - ...rinkeby, - ...fantom, - ...fantomTestnet, - ...matic, - ...maticTestnet, - ...xdai, - ...bsc, - ...bscTestnet, - ...moonbase, - ...avalanche, - ...fuji, - ...heco, - ...hecoTestnet, - ...harmony, - ...harmonyTestnet, - ...okex, - ...okexTestnet, - //...arbitrum, - //...celo, - ] - // sort them by symbol for easy readability - .sort((t1, t2) => { - if (t1.chainId === t2.chainId) { - return t1.symbol.toLowerCase() < t2.symbol.toLowerCase() ? -1 : 1; - } - return t1.chainId < t2.chainId ? -1 : 1; - }), - }; -}; diff --git a/src/write.js b/src/write.js deleted file mode 100644 index bdeffb702..000000000 --- a/src/write.js +++ /dev/null @@ -1,2 +0,0 @@ -const buildList = require('./buildList'); -console.log(JSON.stringify(buildList(), null, 2)); \ No newline at end of file diff --git a/test/sushiswap-default.test.js b/test/sushiswap-default.test.js index deffb7c02..6528b75ad 100644 --- a/test/sushiswap-default.test.js +++ b/test/sushiswap-default.test.js @@ -1,58 +1,60 @@ -const packageJson = require('../package.json'); -const schema = require('@uniswap/token-lists/src/tokenlist.schema.json'); -const { expect } = require('chai'); -const { getAddress } = require('@ethersproject/address'); -const Ajv = require('ajv'); -const buildList = require('../src/buildList'); - -const ajv = new Ajv({ allErrors: true, format: 'full' }); +const packageJson = require("../package.json"); +const schema = require("@uniswap/token-lists/src/tokenlist.schema.json"); +const { expect } = require("chai"); +const { getAddress } = require("@ethersproject/address"); +const Ajv = require("ajv"); +const buildList = require("../internal/buildList"); + +const ajv = new Ajv({ allErrors: true, format: "full" }); const validator = ajv.compile(schema); -describe('buildList', () => { +describe("buildList", () => { const defaultTokenList = buildList(); - it('validates', () => { + it("validates", () => { expect(validator(defaultTokenList)).to.equal(true); }); - it('contains no duplicate addresses', () => { + it("contains no duplicate addresses", () => { const map = {}; for (let token of defaultTokenList.tokens) { const key = `${token.chainId}-${token.address}`; - expect(typeof map[ key ]) - .to.equal('undefined'); - map[ key ] = true; + expect(typeof map[key]).to.equal("undefined"); + map[key] = true; } }); - it('contains no duplicate symbols', () => { + it("contains no duplicate symbols", () => { const map = {}; for (let token of defaultTokenList.tokens) { const key = `${token.chainId}-${token.symbol.toLowerCase()}`; - expect(typeof map[ key ]) - .to.equal('undefined'); - map[ key ] = true; + expect(typeof map[key]).to.equal("undefined"); + map[key] = true; } - }) + }); - it('contains no duplicate names', () => { + it("contains no duplicate names", () => { const map = {}; for (let token of defaultTokenList.tokens) { const key = `${token.chainId}-${token.name.toLowerCase()}`; - expect(typeof map[ key ]) - .to.equal('undefined', `duplicate name: ${token.name}`); - map[ key ] = true; + expect(typeof map[key]).to.equal( + "undefined", + `duplicate name: ${token.name}` + ); + map[key] = true; } - }) + }); - it('all addresses are valid and checksummed', () => { + it("all addresses are valid and checksummed", () => { for (let token of defaultTokenList.tokens) { expect(getAddress(token.address)).to.eq(token.address); } }); - it('version matches package.json', () => { + it("version matches package.json", () => { expect(packageJson.version).to.match(/^\d+\.\d+\.\d+$/); - expect(packageJson.version).to.equal(`${defaultTokenList.version.major}.${defaultTokenList.version.minor}.${defaultTokenList.version.patch}`); + expect(packageJson.version).to.equal( + `${defaultTokenList.version.major}.${defaultTokenList.version.minor}.${defaultTokenList.version.patch}` + ); }); -}); \ No newline at end of file +}); diff --git a/src/tokens/avalanche.json b/tokens/avalanche.json similarity index 100% rename from src/tokens/avalanche.json rename to tokens/avalanche.json diff --git a/src/tokens/bsc-testnet.json b/tokens/bsc-testnet.json similarity index 100% rename from src/tokens/bsc-testnet.json rename to tokens/bsc-testnet.json diff --git a/src/tokens/bsc.json b/tokens/bsc.json similarity index 100% rename from src/tokens/bsc.json rename to tokens/bsc.json diff --git a/src/tokens/celo.json b/tokens/celo.json similarity index 100% rename from src/tokens/celo.json rename to tokens/celo.json diff --git a/src/tokens/fantom-testnet.json b/tokens/fantom-testnet.json similarity index 100% rename from src/tokens/fantom-testnet.json rename to tokens/fantom-testnet.json diff --git a/src/tokens/fantom.json b/tokens/fantom.json similarity index 100% rename from src/tokens/fantom.json rename to tokens/fantom.json diff --git a/src/tokens/fuji.json b/tokens/fuji.json similarity index 100% rename from src/tokens/fuji.json rename to tokens/fuji.json diff --git a/src/tokens/goerli.json b/tokens/goerli.json similarity index 100% rename from src/tokens/goerli.json rename to tokens/goerli.json diff --git a/src/tokens/harmony-testnet.json b/tokens/harmony-testnet.json similarity index 100% rename from src/tokens/harmony-testnet.json rename to tokens/harmony-testnet.json diff --git a/src/tokens/harmony.json b/tokens/harmony.json similarity index 100% rename from src/tokens/harmony.json rename to tokens/harmony.json diff --git a/src/tokens/heco-testnet.json b/tokens/heco-testnet.json similarity index 100% rename from src/tokens/heco-testnet.json rename to tokens/heco-testnet.json diff --git a/src/tokens/heco.json b/tokens/heco.json similarity index 100% rename from src/tokens/heco.json rename to tokens/heco.json diff --git a/src/tokens/kovan.json b/tokens/kovan.json similarity index 100% rename from src/tokens/kovan.json rename to tokens/kovan.json diff --git a/src/tokens/mainnet.json b/tokens/mainnet.json similarity index 100% rename from src/tokens/mainnet.json rename to tokens/mainnet.json diff --git a/src/tokens/matic-testnet.json b/tokens/matic-testnet.json similarity index 100% rename from src/tokens/matic-testnet.json rename to tokens/matic-testnet.json diff --git a/src/tokens/matic.json b/tokens/matic.json similarity index 100% rename from src/tokens/matic.json rename to tokens/matic.json diff --git a/src/tokens/moonbase.json b/tokens/moonbase.json similarity index 100% rename from src/tokens/moonbase.json rename to tokens/moonbase.json diff --git a/src/tokens/okex-testnet.json b/tokens/okex-testnet.json similarity index 100% rename from src/tokens/okex-testnet.json rename to tokens/okex-testnet.json diff --git a/src/tokens/okex.json b/tokens/okex.json similarity index 100% rename from src/tokens/okex.json rename to tokens/okex.json diff --git a/src/tokens/rinkeby.json b/tokens/rinkeby.json similarity index 100% rename from src/tokens/rinkeby.json rename to tokens/rinkeby.json diff --git a/src/tokens/ropsten.json b/tokens/ropsten.json similarity index 100% rename from src/tokens/ropsten.json rename to tokens/ropsten.json diff --git a/src/tokens/xdai.json b/tokens/xdai.json similarity index 100% rename from src/tokens/xdai.json rename to tokens/xdai.json diff --git a/yarn.lock b/yarn.lock index 08afb6dd3..9a4559479 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,15 @@ "@ethersproject/logger" "^5.0.5" bn.js "^4.4.0" +"@ethersproject/bignumber@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db" + integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA== + dependencies: + "@ethersproject/bytes" "^5.3.0" + "@ethersproject/logger" "^5.3.0" + bn.js "^4.11.9" + "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.8": version "5.0.8" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.8.tgz#cf1246a6a386086e590063a4602b1ffb6cc43db1" @@ -29,6 +38,20 @@ dependencies: "@ethersproject/logger" "^5.0.5" +"@ethersproject/bytes@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9" + integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw== + dependencies: + "@ethersproject/logger" "^5.3.0" + +"@ethersproject/constants@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77" + integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw== + dependencies: + "@ethersproject/bignumber" "^5.3.0" + "@ethersproject/keccak256@^5.0.3": version "5.0.6" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.6.tgz#5b5ba715ef1be86efde5c271f896fa0daf0e1efe" @@ -37,11 +60,24 @@ "@ethersproject/bytes" "^5.0.4" js-sha3 "0.5.7" +"@ethersproject/keccak256@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be" + integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ== + dependencies: + "@ethersproject/bytes" "^5.3.0" + js-sha3 "0.5.7" + "@ethersproject/logger@^5.0.5": version "5.0.8" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.8.tgz#135c1903d35c878265f3cbf2b287042c4c20d5d4" integrity sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A== +"@ethersproject/logger@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0" + integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA== + "@ethersproject/rlp@^5.0.3": version "5.0.6" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.6.tgz#29f9097348a3c330811997433b7df89ab51cd644" @@ -50,6 +86,35 @@ "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" +"@ethersproject/sha2@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366" + integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg== + dependencies: + "@ethersproject/bytes" "^5.3.0" + "@ethersproject/logger" "^5.3.0" + hash.js "1.1.7" + +"@ethersproject/solidity@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93" + integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ== + dependencies: + "@ethersproject/bignumber" "^5.3.0" + "@ethersproject/bytes" "^5.3.0" + "@ethersproject/keccak256" "^5.3.0" + "@ethersproject/sha2" "^5.3.0" + "@ethersproject/strings" "^5.3.0" + +"@ethersproject/strings@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0" + integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q== + dependencies: + "@ethersproject/bytes" "^5.3.0" + "@ethersproject/constants" "^5.3.0" + "@ethersproject/logger" "^5.3.0" + "@octokit/auth-token@^2.4.4": version "2.4.5" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" @@ -151,6 +216,24 @@ dependencies: "@octokit/openapi-types" "^7.3.5" +"@sushiswap/core@^2.0.0-canary.0": + version "2.0.0-canary.1" + resolved "https://registry.yarnpkg.com/@sushiswap/core/-/core-2.0.0-canary.1.tgz#91c938668282d463e4fce6e0cf4d320ce5f3768f" + integrity sha512-6YFT4EKgm0XgfwCBsKx5HrDtRI6EvhZHipjBKegdTV0b2zKuXnmdyZ+RwPCr0mCKq2pKB0qIiqCxfbgXYDlLCQ== + +"@sushiswap/sdk@^5.0.0-canary.22": + version "5.0.0-canary.22" + resolved "https://registry.yarnpkg.com/@sushiswap/sdk/-/sdk-5.0.0-canary.22.tgz#6d6ba76d816d606164992086117a814a7d7d8aad" + integrity sha512-75jVt5u3ToxysZxk3ke7dkriqeOUF1B9PbatWxElwQfuZiBfBkUD/tiS/WhkUqdRsnk2Xia5p8XQdAJzPdZv8w== + dependencies: + "@sushiswap/core" "^2.0.0-canary.0" + big.js "^5.2.2" + decimal.js-light "^2.5.0" + jsbi "^3.1.1" + tiny-invariant "^1.1.0" + tiny-warning "^1.0.3" + toformat "^2.0.0" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -161,6 +244,14 @@ resolved "https://registry.yarnpkg.com/@uniswap/token-lists/-/token-lists-1.0.0-beta.19.tgz#5256db144fba721a6233f43b92ffb388cbd58327" integrity sha512-19V3KM7DAe40blWW1ApiaSYwqbq0JTKMO3yChGBrXzQBl+BoQZRTNZ4waCyoZ5QM45Q0Mxd6bCn6jXcH9G1kjg== +adler-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25" + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -230,11 +321,21 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + bn.js@^4.4.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" @@ -270,6 +371,15 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +cfb@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.0.tgz#6a4d0872b525ed60349e1ef51fb4b0bf73eca9a8" + integrity sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ== + dependencies: + adler-32 "~1.2.0" + crc-32 "~1.2.0" + printj "~1.1.2" + chai@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" @@ -319,6 +429,14 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +codepage@~1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99" + integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k= + dependencies: + commander "~2.14.1" + exit-on-epipe "~1.0.1" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -343,11 +461,29 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +commander@~2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw== + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +crc-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + debug@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" @@ -365,6 +501,11 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js-light@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -397,6 +538,11 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -407,6 +553,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fflate@^0.3.8: + version "0.3.11" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.3.11.tgz#2c440d7180fdeb819e64898d8858af327b042a5d" + integrity sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -434,6 +585,11 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -483,6 +639,14 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +hash.js@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -496,7 +660,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -558,6 +722,11 @@ js-yaml@3.14.0: argparse "^1.0.7" esprima "^4.0.0" +jsbi@^3.1.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.1.5.tgz#70c2aaa2f75e1dc7604fed45298061ca23724046" + integrity sha512-w2BY0VOYC1ahe+w6Qhl4SFoPvPsZ9NPHY4bwass+LCgU7RK3PBoVQlQ3G1s7vI8W3CYyJiEXcbKF7FIM/L8q3Q== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -578,6 +747,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" @@ -585,6 +759,11 @@ log-symbols@4.0.0: dependencies: chalk "^4.0.0" +minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -708,6 +887,11 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +printj@~1.1.0, printj@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -766,6 +950,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + "string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -809,6 +1000,16 @@ supports-color@7.2.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tiny-invariant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -816,6 +1017,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" + integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== + type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -852,6 +1058,16 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + workerpool@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" @@ -871,6 +1087,22 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +xlsx@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.17.0.tgz#028176a0140967dcee1817d221678461e47481c8" + integrity sha512-bZ36FSACiAyjoldey1+7it50PMlDp1pcAJrZKcVZHzKd8BC/z6TQ/QAN8onuqcepifqSznR6uKnjPhaGt6ig9A== + dependencies: + adler-32 "~1.2.0" + cfb "^1.1.4" + codepage "~1.14.0" + commander "~2.17.1" + crc-32 "~1.2.0" + exit-on-epipe "~1.0.1" + fflate "^0.3.8" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + y18n@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4"