diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..c04280b4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,150 @@ +name: CI + +on: + # build on PR creation/updates, also when pushing to main/develop, or create a release + pull_request: + types: [opened, synchronize] + push: + branches: [main, develop] + tags: [v*] + +# env: +# REPO_NAME_SLUG: token-lists +# PR_NUMBER: ${{ github.event.number }} +# REACT_APP_PINATA_API_KEY: ${{ secrets.REACT_APP_PINATA_API_KEY }} +# REACT_APP_PINATA_SECRET_API_KEY: ${{ secrets.REACT_APP_PINATA_SECRET_API_KEY }} + +jobs: + setup: + name: Setup + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up node + uses: actions/setup-node@v2 + with: + node-version: lts/* + + - name: Set output of cache + id: yarn-cache + run: echo "::set-output name=dir::$(yarn cache dir)" + + - name: Cache yarn cache + uses: actions/cache@v2 + id: cache-yarn-cache + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v2 + with: + path: node_modules + key: ${{ runner.os }}-${{ matrix.node-version }}-nodemodules1-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-${{ matrix.node-version }}-nodemodules1- + + - name: Install dependencies + run: yarn install --frozen-lockfile + + + build: + name: Build apps + needs: setup + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up node + uses: actions/setup-node@v2 + with: + node-version: lts/* + + - name: Load dependencies + id: cache-node-modules + uses: actions/cache@v2 + with: + path: node_modules + key: ${{ runner.os }}-${{ matrix.node-version }}-nodemodules1-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-${{ matrix.node-version }}-nodemodules1- + + + - name: Build + run: yarn build + + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: token-lists + path: build + + + + deploy: + name: Deploy + needs: build + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Download Artifacts + uses: actions/download-artifact@v2 + + # TODO: Uncomment in future PR + # - name: Configure AWS credentials + # uses: aws-actions/configure-aws-credentials@v1 + # with: + # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + # aws-region: ${{ secrets.AWS_REGION }} + + # - name: 'Deploy to S3: PRaul' + # if: env.PR_NUMBER + # run: aws s3 sync token-list/lists s3://${{ secrets.AWS_REVIEW_BUCKET_NAME }}/${{ env.REPO_NAME_SLUG }}/pr${{ env.PR_NUMBER }} --delete + + # - name: 'PRaul: Comment PR with app URLs' + # uses: mshick/add-pr-comment@v1 + # with: + # message: | + # * **🔭 [GP Swap](${{ env.REVIEW_FEATURE_URL }})**: CoW Protocol v2 Swap UI + # repo-token: ${{ secrets.GITHUB_TOKEN }} + # repo-token-user-login: 'github-actions[bot]' + # if: env.PR_NUMBER + # env: + # REVIEW_FEATURE_URL: https://pr${{ env.PR_NUMBER }}--${{ env.REPO_NAME_SLUG }}.review.gnosisdev.com + + # - name: 'Deploy to S3: Develop' + # if: github.ref == 'refs/heads/develop' + # run: aws s3 sync website s3://${{ secrets.AWS_DEV_BUCKET_NAME }} --delete + + # - name: 'Deploy to S3: Staging' + # if: github.ref == 'refs/heads/main' + # run: aws s3 sync website s3://${{ secrets.AWS_STAGING_BUCKET_NAME }}/current --delete + + # - name: Get the version + # id: get_version + # run: echo ::set-output name=VERSION::$(echo $GITHUB_REF | cut -d / -f 3) + + # - name: 'Production deployment: Upload release build files to be deployed' + # if: startsWith(github.ref, 'refs/tags/v') + # run: aws s3 sync website s3://${{ secrets.AWS_STAGING_BUCKET_NAME }}/releases/${{ steps.get_version.outputs.VERSION }} --delete + + # - name: 'Production deployment: Enable production deployment' + # if: success() && startsWith(github.ref, 'refs/tags/v') + # run: bash ./.github/scripts/prepare_production_deployment.sh + # env: + # PROD_DEPLOYMENT_HOOK_TOKEN: ${{ secrets.PROD_DEPLOYMENT_HOOK_TOKEN }} + # PROD_DEPLOYMENT_HOOK_URL: ${{ secrets.PROD_DEPLOYMENT_HOOK_URL }} + # VERSION_TAG: ${{ steps.get_version.outputs.VERSION }} + diff --git a/src/coingecko.js b/src/coingecko.js index 48e89be9..e3e95594 100644 --- a/src/coingecko.js +++ b/src/coingecko.js @@ -8,10 +8,16 @@ const PAGE_LIMIT = 50 const FILE_PREFIX = 'coingecko' const OUTPUT_FILE = "CoinGecko.json" +// Prevent rate-limit issues https://www.coingecko.com/en/api/documentation +const WAIT_TIME_BETWEEN_REQUEST = 2000 + async function fetchCoingeckoTop(limit, page) { console.log(`Fetch page CoinGecko's Tokens, sorted by Market Cap: Page ${page} (${limit} results)`) const url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=${limit}&page=${page}&sparkline=false&category=ethereum-ecosystem`; const res = await fetch(url); + if (!res.ok) { + throw new Error(`Error fetching page ${page}. Error: ${res.status}, Message: ${await res.text()}`) + } const json = await res.json(); return json; } @@ -29,6 +35,10 @@ async function writeJson(filePath, data) { fs.writeFileSync(filePath, data) } +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + function createSortMap(tokens) { return tokens.reduce((r, e, i) => { r[e.symbol.toLowerCase()] = i; @@ -80,7 +90,7 @@ async function writeCoingeckoListFile(version) { } async function fetchTokens(page, limit, allTokens) { - const tokens = await fetchCoingeckoTop(limit, page); + const tokens = await fetchCoingeckoTop(limit, page); // TODO: We need to map this tokens to an enhanced version const filteredTokens = allTokens.tokens.filter((c) => tokens.some((t) => t.symbol.toLowerCase() === c.symbol.toLowerCase()) @@ -110,6 +120,7 @@ async function main() { for (let page=1; page<=5; page++) { await fetchTokens(page, PAGE_LIMIT, allTokens) + await sleep(WAIT_TIME_BETWEEN_REQUEST) } await writeCoingeckoListFile({ patch: 1 }); // TODO: Improve versioning of the file } diff --git a/src/public/CowProtocol-Buffers.json b/src/public/CowProtocol-Buffers.json new file mode 100644 index 00000000..cb0a9751 --- /dev/null +++ b/src/public/CowProtocol-Buffers.json @@ -0,0 +1,443 @@ +{ + "name": "Market Makable Tokens for Cowswap", + "timestamp": "2022-03-01T14:54:18+00:00", + "version": { + "major": 0, + "minor": 1, + "patch": 0 + }, + "keywords": [ + "default", + "list", + "cowswap" + ], + "tokens": [ + { + "symbol": "USDC", + "name": "USD Coin", + "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "decimals": 6, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.png" + }, + { + "symbol": "WETH", + "name": "Wrapped Ether", + "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "decimals": 18, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.png" + }, + { + "symbol": "USDT", + "name": "Tether USD", + "address": "0xdac17f958d2ee523a2206206994597c13d831ec7", + "decimals": 6, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0xdac17f958d2ee523a2206206994597c13d831ec7.png" + }, + { + "symbol": "DAI", + "name": "Dai Stablecoin", + "decimals": 18, + "chainId": 1, + "address": "0x6b175474e89094c44da98b954eedeac495271d0f", + "logoURI": "https://tokens.1inch.io/0x6b175474e89094c44da98b954eedeac495271d0f.png", + "eip2612": true + }, + { + "symbol": "GNO", + "name": "Gnosis", + "address": "0x6810e776880c02933d47db1b9fc05908e5386b96", + "decimals": 18, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0x6810e776880c02933d47db1b9fc05908e5386b96.png" + }, + { + "symbol": "OHM", + "name": "Olympus", + "decimals": 9, + "chainId": 1, + "address": "0x383518188c0c6d7730d91b2c03a03c837814a899", + "logoURI": "https://tokens.1inch.io/0x383518188c0c6d7730d91b2c03a03c837814a899.png", + "eip2612": true + }, + { + "symbol": "WBTC", + "name": "Wrapped BTC", + "address": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + "decimals": 8, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0x2260fac5e5542a773aa44fbcfedf7c193bc2c599.png" + }, + { + "symbol": "STRONG", + "name": "Strong", + "address": "0x990f341946a3fdb507ae7e52d17851b87168017c", + "decimals": 18, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0x990f341946a3fdb507ae7e52d17851b87168017c.png" + }, + { + "symbol": "FRAX", + "name": "Frax", + "decimals": 18, + "chainId": 1, + "address": "0x853d955acef822db058eb8505911ed77f175b99e", + "logoURI": "https://tokens.1inch.io/0x853d955acef822db058eb8505911ed77f175b99e.png" + }, + { + "symbol": "CRV", + "name": "Curve DAO Token", + "decimals": 18, + "chainId": 1, + "address": "0xd533a949740bb3306d119cc777fa900ba034cd52", + "logoURI": "https://tokens.1inch.io/0xd533a949740bb3306d119cc777fa900ba034cd52.png" + }, + { + "symbol": "CVX", + "name": "Convex Token", + "decimals": 18, + "chainId": 1, + "address": "0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b", + "logoURI": "https://tokens.1inch.io/0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b.png" + }, + { + "symbol": "UNI", + "name": "Uniswap", + "decimals": 18, + "chainId": 1, + "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", + "logoURI": "https://tokens.1inch.io/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984.png", + "eip2612": true + }, + { + "symbol": "FXS", + "name": "Frax Share", + "decimals": 18, + "chainId": 1, + "address": "0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0", + "logoURI": "https://tokens.1inch.io/0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0.png" + }, + { + "symbol": "AAVE", + "name": "Aave Token", + "decimals": 18, + "chainId": 1, + "address": "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", + "logoURI": "https://tokens.1inch.io/0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.png", + "eip2612": true + }, + { + "symbol": "LUSD", + "name": "LUSD Stablecoin", + "decimals": 18, + "chainId": 1, + "address": "0x5f98805a4e8be255a32880fdec7f6728c6568ba0", + "logoURI": "https://tokens.1inch.io/0x5f98805a4e8be255a32880fdec7f6728c6568ba0.png", + "eip2612": true + }, + { + "symbol": "MIM", + "name": "Magic Internet Money", + "decimals": 18, + "chainId": 1, + "address": "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", + "logoURI": "https://tokens.1inch.io/0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3.png" + }, + { + "symbol": "1INCH", + "name": "1INCH Token", + "decimals": 18, + "chainId": 1, + "address": "0x111111111117dc0aa78b770fa6a738034120c302", + "logoURI": "https://tokens.1inch.io/0x111111111117dc0aa78b770fa6a738034120c302.png", + "eip2612": true + }, + { + "symbol": "SPELL", + "name": "Spell Token", + "decimals": 18, + "chainId": 1, + "address": "0x090185f2135308bad17527004364ebcc2d37e5f6", + "logoURI": "https://tokens.1inch.io/0x090185f2135308bad17527004364ebcc2d37e5f6.png" + }, + { + "symbol": "LDO", + "name": "Lido DAO Token", + "decimals": 18, + "chainId": 1, + "address": "0x5a98fcbea516cf06857215779fd812ca3bef1b32", + "logoURI": "https://tokens.1inch.io/0x5a98fcbea516cf06857215779fd812ca3bef1b32.png" + }, + { + "symbol": "MIST", + "name": "Alchemist", + "decimals": 18, + "chainId": 1, + "address": "0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab", + "logoURI": "https://tokens.1inch.io/0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab.png", + "eip2612": true + }, + { + "symbol": "MATIC", + "name": "Matic Token", + "decimals": 18, + "chainId": 1, + "address": "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", + "logoURI": "https://tokens.1inch.io/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0.png" + }, + { + "symbol": "wNXM", + "name": "Wrapped NXM", + "decimals": 18, + "chainId": 1, + "address": "0x0d438f3b5175bebc262bf23753c1e53d03432bde", + "logoURI": "https://tokens.1inch.io/0x0d438f3b5175bebc262bf23753c1e53d03432bde.png", + "eip2612": true + }, + { + "symbol": "LINK", + "name": "Chain Link", + "address": "0x514910771af9ca656af840dff83e8264ecf986ca", + "decimals": 18, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0x514910771af9ca656af840dff83e8264ecf986ca.png" + }, + { + "symbol": "FTM", + "name": "Fantom Token", + "decimals": 18, + "chainId": 1, + "address": "0x4e15361fd6b4bb609fa63c81a2be19d873717870", + "logoURI": "https://tokens.1inch.io/0x4e15361fd6b4bb609fa63c81a2be19d873717870.png" + }, + { + "symbol": "SUSHI", + "name": "SushiToken", + "decimals": 18, + "chainId": 1, + "address": "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2", + "logoURI": "https://tokens.1inch.io/0x6b3595068778dd592e39a122f4f5a5cf09c90fe2.png" + }, + { + "symbol": "ICE", + "name": "IceToken", + "decimals": 18, + "chainId": 1, + "address": "0xf16e81dce15b08f326220742020379b855b87df9", + "logoURI": "https://tokens.1inch.io/0xf16e81dce15b08f326220742020379b855b87df9.png", + "eip2612": true + }, + { + "symbol": "BAL", + "name": "Balancer", + "decimals": 18, + "chainId": 1, + "address": "0xba100000625a3754423978a60c9317c58a424e3d", + "logoURI": "https://tokens.1inch.io/0xba100000625a3754423978a60c9317c58a424e3d.png", + "eip2612": true + }, + { + "symbol": "YFI", + "name": "yearn.finance", + "decimals": 18, + "chainId": 1, + "address": "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e", + "logoURI": "https://tokens.1inch.io/0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e.png" + }, + { + "symbol": "HEX", + "name": "HEX", + "address": "0x2b591e99afe9f32eaa6214f7b7629768c40eeb39", + "decimals": 8, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0x2b591e99afe9f32eaa6214f7b7629768c40eeb39.png" + }, + { + "symbol": "TRIBE", + "name": "Tribe", + "decimals": 18, + "chainId": 1, + "address": "0xc7283b66eb1eb5fb86327f08e1b5816b0720212b", + "logoURI": "https://tokens.1inch.io/0xc7283b66eb1eb5fb86327f08e1b5816b0720212b.png", + "eip2612": true + }, + { + "symbol": "SAND", + "name": "SAND", + "decimals": 18, + "chainId": 1, + "address": "0x3845badade8e6dff049820680d1f14bd3903a5d0", + "logoURI": "https://tokens.1inch.io/0x3845badade8e6dff049820680d1f14bd3903a5d0.png" + }, + { + "symbol": "EDEN", + "name": "Eden", + "decimals": 18, + "chainId": 1, + "address": "0x1559fa1b8f28238fd5d76d9f434ad86fd20d1559", + "logoURI": "https://tokens.1inch.io/0x1559fa1b8f28238fd5d76d9f434ad86fd20d1559.png", + "eip2612": true + }, + { + "symbol": "AMPL", + "name": "Ampleforth", + "address": "0xd46ba6d942050d489dbd938a2c909a5d5039a161", + "decimals": 9, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0xd46ba6d942050d489dbd938a2c909a5d5039a161.png", + "eip2612": true + }, + { + "symbol": "STAKE", + "name": "STAKE", + "address": "0x0ae055097c6d159879521c384f1d2123d1f195e6", + "decimals": 18, + "chainId": 1, + "logoURI": "https://tokens.1inch.io/0x0ae055097c6d159879521c384f1d2123d1f195e6.png", + "eip2612": true + }, + { + "symbol": "SHIB", + "name": "SHIBA INU", + "decimals": 18, + "chainId": 1, + "address": "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", + "logoURI": "https://tokens.1inch.io/0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce.png" + }, + { + "symbol": "LQTY", + "name": "LQTY", + "decimals": 18, + "chainId": 1, + "address": "0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d", + "logoURI": "https://tokens.1inch.io/0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d.png", + "eip2612": true + }, + { + "symbol": "FEI", + "name": "Fei USD", + "decimals": 18, + "chainId": 1, + "address": "0x956f47f50a910163d8bf957cf5846d573e7f87ca", + "logoURI": "https://tokens.1inch.io/0x956f47f50a910163d8bf957cf5846d573e7f87ca.png", + "eip2612": true + }, + { + "symbol": "KP3R", + "name": "Keep3rV1", + "decimals": 18, + "chainId": 1, + "address": "0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44", + "logoURI": "https://tokens.1inch.io/0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44.png" + }, + { + "symbol": "WARP", + "name": "Warp Token", + "decimals": 18, + "chainId": 1, + "address": "0xed40834a13129509a89be39a9be9c0e96a0ddd71", + "logoURI": "https://tokens.1inch.io/0xed40834a13129509a89be39a9be9c0e96a0ddd71.png" + }, + { + "symbol": "BADGER", + "name": "Badger", + "decimals": 18, + "chainId": 1, + "address": "0x3472a5a71965499acd81997a54bba8d852c6e53d", + "logoURI": "https://tokens.1inch.io/0x3472a5a71965499acd81997a54bba8d852c6e53d.png" + }, + { + "symbol": "SNX", + "name": "Synthetix Network Token", + "decimals": 18, + "chainId": 1, + "address": "0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", + "logoURI": "https://tokens.1inch.io/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.png" + }, + { + "symbol": "ALCX", + "name": "Alchemix", + "decimals": 18, + "chainId": 1, + "address": "0xdbdb4d16eda451d0503b854cf79d55697f90c8df", + "logoURI": "https://tokens.1inch.io/0xdbdb4d16eda451d0503b854cf79d55697f90c8df.png" + }, + { + "symbol": "GTC", + "name": "Gitcoin", + "decimals": 18, + "chainId": 1, + "address": "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", + "logoURI": "https://tokens.1inch.io/0xde30da39c46104798bb5aa3fe8b9e0e1f348163f.png", + "eip2612": true + }, + { + "symbol": "USDN", + "name": "Neutrino", + "decimals": 18, + "chainId": 1, + "address": "0x674c6ad92fd080e4004b2312b45f796a192d27a0", + "logoURI": "https://tokens.1inch.io/0x674c6ad92fd080e4004b2312b45f796a192d27a0.png" + }, + { + "symbol": "FLX", + "name": "Flex Ungovernance Token", + "decimals": 18, + "chainId": 1, + "address": "0x6243d8cea23066d098a15582d81a598b4e8391f4", + "logoURI": "https://tokens.1inch.io/0x6243d8cea23066d098a15582d81a598b4e8391f4.png" + }, + { + "symbol": "TOKE", + "name": "Tokemak", + "decimals": 18, + "chainId": 1, + "address": "0x2e9d63788249371f1dfc918a52f8d799f4a38c94" + }, + { + "symbol": "RBN", + "name": "Ribbon", + "decimals": 18, + "chainId": 1, + "address": "0x6123b0049f904d730db3c36a31167d9d4121fa6b" + }, + { + "symbol": "SYN", + "name": "Synapse", + "decimals": 18, + "chainId": 1, + "address": "0x0f2d719407fdbeff09d87557abb7232601fd9f29" + }, + { + "symbol": "FOLD", + "name": "Manifold Finance", + "decimals": 18, + "chainId": 1, + "address": "0xd084944d3c05cd115c09d072b9f44ba3e0e45921" + }, + { + "symbol": "VISR", + "name": "VISOR", + "decimals": 18, + "chainId": 1, + "address": "0xf938424f7210f31df2aee3011291b658f872e91e" + }, + { + "symbol": "COW", + "name": "CoW Protocol Token", + "decimals": 18, + "chainId": 1, + "address": "0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB" + }, + { + "symbol": "HOP", + "name": "Hop", + "address": "0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc", + "decimals": 18, + "chainId": 1, + "logoURI": "https://gateway.pinata.cloud/ipfs/QmSxuQpx3UadQY4B2i5AQAaU97JZqkhcm9dCZXXNsNziYR" + } + ] +} \ No newline at end of file