From 83d25ae3a5b5f64d18bc8d546c4239376ddac34a Mon Sep 17 00:00:00 2001 From: "Jason R. Sadler" Date: Thu, 8 Jul 2021 15:33:27 -0400 Subject: [PATCH 1/4] build: Update profile-sdks build subject --- packages/dsentr-profile-sdk/babel.config.js | 10 +- packages/dsentr-profile-sdk/jest.config.js | 14 +- packages/dsentr-profile-sdk/jest.setup.js | 12 +- packages/dsentr-profile-sdk/package.json | 8 +- packages/dsentr-profile-sdk/rollup.config.js | 24 +- .../src/constants/__mocks__/nfts.ts | 72 ++-- .../src/constants/campaigns.ts | 206 ++++++------ .../src/constants/common.ts | 10 +- .../src/constants/contracts.ts | 15 +- .../dsentr-profile-sdk/src/constants/nfts.ts | 318 +++++++++--------- .../dsentr-profile-sdk/src/constants/teams.ts | 64 ++-- .../dsentr-profile-sdk/src/images/images.d.ts | 4 +- .../dsentr-profile-sdk/src/images/index.ts | 30 +- packages/dsentr-profile-sdk/src/index.ts | 8 +- .../dsentr-profile-sdk/src/mocks/handlers.ts | 66 ++-- .../src/mocks/mockAddresses.ts | 6 +- .../dsentr-profile-sdk/src/mocks/server.ts | 10 +- .../src/profile-sdk.test.ts | 264 +++++++-------- .../dsentr-profile-sdk/src/profile-sdk.ts | 192 ++++++----- packages/dsentr-profile-sdk/src/types.ts | 185 +++++----- .../src/utils/__mocks__/contractHelpers.ts | 58 ++-- .../src/utils/addressHelpers.test.ts | 26 +- .../src/utils/addressHelpers.ts | 14 +- .../src/utils/collectibles.test.ts | 134 ++++---- .../src/utils/collectibles.ts | 75 +++-- .../src/utils/contractHelpers.test.ts | 46 +-- .../src/utils/contractHelpers.ts | 31 +- .../src/utils/getRpcUrl.test.ts | 20 +- .../dsentr-profile-sdk/src/utils/getRpcUrl.ts | 26 +- .../src/utils/transformHelpers.test.ts | 122 +++---- .../src/utils/transformHelpers.ts | 58 ++-- .../dsentr-profile-sdk/src/utils/web3.test.ts | 14 +- packages/dsentr-profile-sdk/src/utils/web3.ts | 14 +- packages/dsentr-profile-sdk/tsconfig.json | 9 +- 34 files changed, 1112 insertions(+), 1053 deletions(-) diff --git a/packages/dsentr-profile-sdk/babel.config.js b/packages/dsentr-profile-sdk/babel.config.js index 675d51c..b90969c 100644 --- a/packages/dsentr-profile-sdk/babel.config.js +++ b/packages/dsentr-profile-sdk/babel.config.js @@ -1,11 +1,11 @@ module.exports = { presets: [ - ["@babel/preset-env", { targets: { node: "current" } }], - "@babel/preset-typescript", + ['@babel/preset-env', { targets: { node: 'current' } }], + '@babel/preset-typescript' ], plugins: [ - "@babel/plugin-proposal-private-property-in-object", { - "loose": true + '@babel/plugin-proposal-private-property-in-object', { + loose: true } ] -}; +} diff --git a/packages/dsentr-profile-sdk/jest.config.js b/packages/dsentr-profile-sdk/jest.config.js index 6b49436..2431a65 100644 --- a/packages/dsentr-profile-sdk/jest.config.js +++ b/packages/dsentr-profile-sdk/jest.config.js @@ -1,10 +1,10 @@ module.exports = { - preset: "ts-jest", - testEnvironment: "node", + preset: 'ts-jest', + testEnvironment: 'node', transform: { - "^.+\\.(ts|tsx)?$": "ts-jest", - "^.+\\.(js|jsx)$": "babel-jest", + '^.+\\.(ts|tsx)?$': 'ts-jest', + '^.+\\.(js|jsx)$': 'babel-jest' }, - setupFilesAfterEnv: ["./jest.setup.js"], - collectCoverageFrom: ["**/*.ts", "!./src/index.ts", "!**/node_modules/**", "!**/dist/**"], -}; + setupFilesAfterEnv: ['./jest.setup.js'], + collectCoverageFrom: ['**/*.ts', '!./src/index.ts', '!**/node_modules/**', '!**/dist/**'] +} diff --git a/packages/dsentr-profile-sdk/jest.setup.js b/packages/dsentr-profile-sdk/jest.setup.js index 25ceccb..7f53c90 100644 --- a/packages/dsentr-profile-sdk/jest.setup.js +++ b/packages/dsentr-profile-sdk/jest.setup.js @@ -1,12 +1,12 @@ // This ensures you can use `window.fetch()` in Jest tests. -import fetch from "node-fetch"; -import { server } from "./src/mocks/server"; +import fetch from 'node-fetch' +import { server } from './src/mocks/server' -global.fetch = fetch; +global.fetch = fetch // Establish API mocking before all tests. -beforeAll(() => server.listen()); +beforeAll(() => server.listen()) // Reset any request handlers that we may add during the tests, // so they don't affect other tests. -afterEach(() => server.resetHandlers()); +afterEach(() => server.resetHandlers()) // Clean up after the tests are finished. -afterAll(() => server.close()); +afterAll(() => server.close()) diff --git a/packages/dsentr-profile-sdk/package.json b/packages/dsentr-profile-sdk/package.json index 868ee86..9568372 100644 --- a/packages/dsentr-profile-sdk/package.json +++ b/packages/dsentr-profile-sdk/package.json @@ -11,7 +11,7 @@ "start": "yarn build && node ./dist", "test": "jest -t", "test:coverage": "jest -t --collectCoverage", - "lint": "ts-standard | snazzy" + "lint": "ts-standard --fix | snazzy" }, "devDependencies": { "@babel/preset-env": "^7.13.15", @@ -27,6 +27,7 @@ "jest": "^26.6.3", "msw": "^0.28.1", "node-fetch": "^2.6.1", + "ts-jest": "^26.5.6", "web3": "^1.3.5", "web3-eth-contract": "^1.3.5", "web3-utils": "^1.3.5" @@ -41,5 +42,10 @@ "dependencies": { "@types/js-cookie": "^2.2.6", "js-cookie": "^2.2.1" + }, + "ts-standard": { + "ignore": [ + "dist" + ] } } diff --git a/packages/dsentr-profile-sdk/rollup.config.js b/packages/dsentr-profile-sdk/rollup.config.js index 9500721..6e4527b 100644 --- a/packages/dsentr-profile-sdk/rollup.config.js +++ b/packages/dsentr-profile-sdk/rollup.config.js @@ -1,16 +1,16 @@ -import typescript from "@rollup/plugin-typescript"; -import json from "@rollup/plugin-json"; -import { nodeResolve } from "@rollup/plugin-node-resolve"; -import commonjs from "@rollup/plugin-commonjs"; -import image from "@rollup/plugin-image"; -import pkg from "./package.json"; +import typescript from '@rollup/plugin-typescript' +import json from '@rollup/plugin-json' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import image from '@rollup/plugin-image' +import pkg from './package.json' export default { - input: "src/index.ts", + input: 'src/index.ts', output: [ - { file: pkg.main, format: "cjs" }, - { file: pkg.module, format: "es" }, + { file: pkg.main, format: 'cjs' }, + { file: pkg.module, format: 'es' } ], - plugins: [json(), commonjs(), nodeResolve(), typescript(), image()], - external: ["web3", "web3-eth-contract", "web3-utils", "graphql", "graphql-request"], -}; + plugins: [nodeResolve({ preferBuiltins: true }), json(), commonjs(), typescript(), image()], + external: ['web3', 'web3-eth-contract', 'web3-utils', 'graphql', 'graphql-request'] +} diff --git a/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts b/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts index 63a4a09..d98e65d 100644 --- a/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts +++ b/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts @@ -1,5 +1,5 @@ -import { Nft, NftSource, NftType } from "../../types"; -import { IPFS_GATEWAY } from "../common"; +import { Nft, NftSource, NftType } from '../../types' +import { IPFS_GATEWAY } from '../common' // This mock file is needed to properly test different NFT types // and also not rely in tests on any value changes in the future @@ -7,65 +7,65 @@ import { IPFS_GATEWAY } from "../common"; export const nftSources: NftSource = { [NftType.GLASS]: { address: { - 56: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", - 97: "0x60935F36e4631F73f0f407e68642144e07aC7f5E", + 56: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', + 97: '0x60935F36e4631F73f0f407e68642144e07aC7f5E' }, - identifierKey: "image", + identifierKey: 'image' }, [NftType.MIRROR]: { address: { - 56: "0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566", - 97: "", + 56: '0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566', + 97: '' }, - identifierKey: "otherIdentifier", - }, -}; + identifierKey: 'otherIdentifier' + } +} const Nfts: Nft[] = [ { - name: "Mirror v1", - description: "Looking back at you looking back at me...", + name: 'Mirror v1', + description: 'Looking back at you looking back at me...', images: { - lg: "mirror-1-lg.png", - md: "mirror-1-md.png", - sm: "mirror-1-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Mirror.png`, + lg: 'mirror-1-lg.png', + md: 'mirror-1-md.png', + sm: 'mirror-1-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Mirror.png` }, sortOrder: 999, - identifier: "001-Mirror", + identifier: '001-Mirror', type: NftType.MIRROR, - variationId: 1, + variationId: 1 }, { - name: "Prism", - description: "Glass works colors", + name: 'Prism', + description: 'Glass works colors', images: { - lg: "prism-lg.png", - md: "prism-md.png", - sm: "prism-sm.png", + lg: 'prism-lg.png', + md: 'prism-md.png', + sm: 'prism-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png`, - blur: "prism-blur.png", + blur: 'prism-blur.png' }, sortOrder: 999, - identifier: "prism", + identifier: 'prism', type: NftType.GLASS, - variationId: 5, + variationId: 5 }, { - name: "Streak", + name: 'Streak', description: "You'll know us when you see...", images: { - lg: "streak-lg.png", - md: "streak-md.png", - sm: "streak-sm.png", + lg: 'streak-lg.png', + md: 'streak-md.png', + sm: 'streak-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/streak.png`, - blur: "streak-blur.png", + blur: 'streak-blur.png' }, sortOrder: 999, - identifier: "streak", + identifier: 'streak', type: NftType.GLASS, - variationId: 0, - }, -]; + variationId: 0 + } +] -export default Nfts; +export default Nfts diff --git a/packages/dsentr-profile-sdk/src/constants/campaigns.ts b/packages/dsentr-profile-sdk/src/constants/campaigns.ts index 6ee45b1..fb68b2d 100644 --- a/packages/dsentr-profile-sdk/src/constants/campaigns.ts +++ b/packages/dsentr-profile-sdk/src/constants/campaigns.ts @@ -1,4 +1,4 @@ -import { Campaign } from "../types"; +import { Campaign } from '../types' /** * id: The campaign id (required) @@ -11,159 +11,159 @@ import { Campaign } from "../types"; const campaigns: Campaign[] = [ { - id: "511090000", - type: "ifo", - title: "Horizon Protocol", - badge: "ifo-hzn.svg", + id: '511090000', + type: 'ifo', + title: 'Horizon Protocol', + badge: 'ifo-hzn.svg' }, { - id: "511080000", - type: "ifo", - title: "Belt", - badge: "ifo-belt.svg", + id: '511080000', + type: 'ifo', + title: 'Belt', + badge: 'ifo-belt.svg' }, { - id: "511070000", - type: "ifo", - title: "Yieldwatch", - badge: "ifo-watch.svg", + id: '511070000', + type: 'ifo', + title: 'Yieldwatch', + badge: 'ifo-watch.svg' }, { - id: "511060000", - type: "ifo", - title: "Berry", - badge: "ifo-bry.svg", + id: '511060000', + type: 'ifo', + title: 'Berry', + badge: 'ifo-bry.svg' }, { - id: "511050000", - type: "ifo", - title: "Soteria", - badge: "ifo-wsote.svg", + id: '511050000', + type: 'ifo', + title: 'Soteria', + badge: 'ifo-wsote.svg' }, { - id: "511040000", - type: "ifo", - title: "Helmet", - badge: "ifo-helmet.svg", + id: '511040000', + type: 'ifo', + title: 'Helmet', + badge: 'ifo-helmet.svg' }, { - id: "511030000", - type: "ifo", - title: "Tenet", - badge: "ifo-ten.svg", + id: '511030000', + type: 'ifo', + title: 'Tenet', + badge: 'ifo-ten.svg' }, { - id: "511020000", - type: "ifo", - title: "Ditto", - badge: "ifo-ditto.svg", + id: '511020000', + type: 'ifo', + title: 'Ditto', + badge: 'ifo-ditto.svg' }, { - id: "511010000", - type: "ifo", - title: "Blink", - badge: "ifo-blk.svg", + id: '511010000', + type: 'ifo', + title: 'Blink', + badge: 'ifo-blk.svg' }, { - id: "512010001", - type: "teambattle", - title: "Easter Champion: Gold", - badge: "easter-champion-gold.svg", + id: '512010001', + type: 'teambattle', + title: 'Easter Champion: Gold', + badge: 'easter-champion-gold.svg' }, { - id: "512010002", - type: "teambattle", - title: "Easter Top 500: Gold", - badge: "easter-top-500-gold.svg", + id: '512010002', + type: 'teambattle', + title: 'Easter Top 500: Gold', + badge: 'easter-top-500-gold.svg' }, { - id: "512010003", - type: "teambattle", - title: "Easter Top 500: Gold", - badge: "easter-top-500-gold.svg", + id: '512010003', + type: 'teambattle', + title: 'Easter Top 500: Gold', + badge: 'easter-top-500-gold.svg' }, { - id: "512010004", - type: "teambattle", - title: "Easter Top 500: Gold", - badge: "easter-top-500-gold.svg", + id: '512010004', + type: 'teambattle', + title: 'Easter Top 500: Gold', + badge: 'easter-top-500-gold.svg' }, { - id: "512010005", - type: "teambattle", - title: "Easter Participant: Gold", - badge: "easter-participant-gold.svg", + id: '512010005', + type: 'teambattle', + title: 'Easter Participant: Gold', + badge: 'easter-participant-gold.svg' }, { - id: "512010006", - type: "teambattle", - title: "Easter Champion: Silver", - badge: "easter-champion-silver.svg", + id: '512010006', + type: 'teambattle', + title: 'Easter Champion: Silver', + badge: 'easter-champion-silver.svg' }, { - id: "512010007", - type: "teambattle", - title: "Easter Top 500: Silver", - badge: "easter-top-500-silver.svg", + id: '512010007', + type: 'teambattle', + title: 'Easter Top 500: Silver', + badge: 'easter-top-500-silver.svg' }, { - id: "512010008", - type: "teambattle", - title: "Easter Top 500: Silver", - badge: "easter-top-500-silver.svg", + id: '512010008', + type: 'teambattle', + title: 'Easter Top 500: Silver', + badge: 'easter-top-500-silver.svg' }, { - id: "512010009", - type: "teambattle", - title: "Easter Top 500: Silver", - badge: "easter-top-500-silver.svg", + id: '512010009', + type: 'teambattle', + title: 'Easter Top 500: Silver', + badge: 'easter-top-500-silver.svg' }, { - id: "512010010", - type: "teambattle", - title: "Easter Participant: Silver", - badge: "easter-participant-silver.svg", + id: '512010010', + type: 'teambattle', + title: 'Easter Participant: Silver', + badge: 'easter-participant-silver.svg' }, { - id: "512010011", - type: "teambattle", - title: "Easter Champion: Bronze", - badge: "easter-champion-bronze.svg", + id: '512010011', + type: 'teambattle', + title: 'Easter Champion: Bronze', + badge: 'easter-champion-bronze.svg' }, { - id: "512010012", - type: "teambattle", - title: "Easter Top 500: Bronze", - badge: "easter-top-500-bronze.svg", + id: '512010012', + type: 'teambattle', + title: 'Easter Top 500: Bronze', + badge: 'easter-top-500-bronze.svg' }, { - id: "512010013", - type: "teambattle", - title: "Easter Top 500: Bronze", - badge: "easter-top-500-bronze.svg", + id: '512010013', + type: 'teambattle', + title: 'Easter Top 500: Bronze', + badge: 'easter-top-500-bronze.svg' }, { - id: "512010014", - type: "teambattle", - title: "Easter Top 500: Bronze", - badge: "easter-top-500-bronze.svg", + id: '512010014', + type: 'teambattle', + title: 'Easter Top 500: Bronze', + badge: 'easter-top-500-bronze.svg' }, { - id: "512010015", - type: "teambattle", - title: "Easter Participant: Bronze", - badge: "easter-participant-bronze.svg", - }, -]; + id: '512010015', + type: 'teambattle', + title: 'Easter Participant: Bronze', + badge: 'easter-participant-bronze.svg' + } +] /** * Transform the campaign config into a map. Keeps the config the same * as the others and allows easy access to a campaign by id */ -export const campaignMap = new Map(); +export const campaignMap = new Map() campaigns.forEach((campaign) => { - campaignMap.set(campaign.id, campaign); -}); + campaignMap.set(campaign.id, campaign) +}) -export default campaigns; +export default campaigns diff --git a/packages/dsentr-profile-sdk/src/constants/common.ts b/packages/dsentr-profile-sdk/src/constants/common.ts index 384bb93..8082022 100644 --- a/packages/dsentr-profile-sdk/src/constants/common.ts +++ b/packages/dsentr-profile-sdk/src/constants/common.ts @@ -1,7 +1,7 @@ -export const profileApi = "https://profile.dsentr.com"; -export const profileSubgraphApi = "https://api.thegraph.com/subgraphs/name/dsentr/profile"; +export const profileApi = 'https://profile.dsentr.com' +export const profileSubgraphApi = 'https://api.thegraph.com/subgraphs/name/dsentr/profile' -export const IPFS_GATEWAY = "https://gateway.pinata.cloud"; +export const IPFS_GATEWAY = 'https://gateway.pinata.cloud' -export const MAINNET_CHAIN_ID = 56; -export const TESTNET_CHAIN_ID = 97; +export const MAINNET_CHAIN_ID = 56 +export const TESTNET_CHAIN_ID = 97 diff --git a/packages/dsentr-profile-sdk/src/constants/contracts.ts b/packages/dsentr-profile-sdk/src/constants/contracts.ts index 6415c48..91cffb3 100644 --- a/packages/dsentr-profile-sdk/src/constants/contracts.ts +++ b/packages/dsentr-profile-sdk/src/constants/contracts.ts @@ -1,6 +1,9 @@ -export default { - dsentrProfile: { - 56: "0xDf4dBf6536201370F95e06A0F8a7a70fE40E388a", - 97: "0x4B683C7E13B6d5D7fd1FeA9530F451954c1A7c8A", - }, -}; +export type ProfileNumber = 56 | 97 +type ProfileMap = { [num in ProfileNumber]: string } + +const addresses: ProfileMap = { + 56: '0xDf4dBf6536201370F95e06A0F8a7a70fE40E388a', + 97: '0x4B683C7E13B6d5D7fd1FeA9530F451954c1A7c8A' +} + +export default addresses diff --git a/packages/dsentr-profile-sdk/src/constants/nfts.ts b/packages/dsentr-profile-sdk/src/constants/nfts.ts index f4c3b24..0e80ffb 100644 --- a/packages/dsentr-profile-sdk/src/constants/nfts.ts +++ b/packages/dsentr-profile-sdk/src/constants/nfts.ts @@ -1,308 +1,308 @@ -import { Nft, NftType, NftSource } from "../types"; -import { IPFS_GATEWAY } from "./common"; +import { Nft, NftType, NftSource } from '../types' +import { IPFS_GATEWAY } from './common' export const nftSources: NftSource = { [NftType.GLASS]: { address: { - 56: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", - 97: "0x60935F36e4631F73f0f407e68642144e07aC7f5E", + 56: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', + 97: '0x60935F36e4631F73f0f407e68642144e07aC7f5E' }, - identifierKey: "image", + identifierKey: 'image' }, [NftType.MIRROR]: { address: { - 56: "0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566", - 97: "", + 56: '0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566', + 97: '' }, - identifierKey: "image", - }, -}; + identifierKey: 'image' + } +} const Nfts: Nft[] = [ { - name: "Mirror v1", - description: "Looking back at you looking back at me...", + name: 'Mirror v1', + description: 'Looking back at you looking back at me...', images: { - lg: "mirror-1-lg.png", - md: "mirror-1-md.png", - sm: "mirror-1-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Mirror.png`, + lg: 'mirror-1-lg.png', + md: 'mirror-1-md.png', + sm: 'mirror-1-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Mirror.png` }, sortOrder: 999, - identifier: "001-Mirror", + identifier: '001-Mirror', type: NftType.MIRROR, - variationId: 1, + variationId: 1 }, { - name: "Mirror v2", - description: "Looking back at you looking back at me...", + name: 'Mirror v2', + description: 'Looking back at you looking back at me...', images: { - lg: "mirror-2-lg.png", - md: "mirror-2-md.png", - sm: "mirror-2-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/002--Mirror.png`, + lg: 'mirror-2-lg.png', + md: 'mirror-2-md.png', + sm: 'mirror-2-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/002--Mirror.png` }, sortOrder: 999, - identifier: "002--Mirror", + identifier: '002--Mirror', type: NftType.MIRROR, - variationId: 2, + variationId: 2 }, { - name: "Mirror v3", - description: "Looking back at you looking back at me...", + name: 'Mirror v3', + description: 'Looking back at you looking back at me...', images: { - lg: "mirror-3-lg.png", - md: "mirror-3-md.png", - sm: "mirror-3-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/003--Mirror.png`, + lg: 'mirror-3-lg.png', + md: 'mirror-3-md.png', + sm: 'mirror-3-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/003--Mirror.png` }, sortOrder: 999, - identifier: "003--Mirror", + identifier: '003--Mirror', type: NftType.MIRROR, - variationId: 3, + variationId: 3 }, { - name: "TBD Champions", - description: "TBD Battle!", + name: 'TBD Champions', + description: 'TBD Battle!', images: { - lg: "tbd-lg.png", - md: "tbd-md.png", - sm: "tbd-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.png`, + lg: 'tbd-lg.png', + md: 'tbd-md.png', + sm: 'tbd-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.png` }, video: { webm: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.webm`, - mp4: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.mp4`, + mp4: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.mp4` }, sortOrder: 999, - identifier: "easter-champion-storm", + identifier: 'easter-champion-storm', type: NftType.GLASS, - variationId: 15, + variationId: 15 }, { name: "Cakeston Easter '21", - description: "Melting Easter eggs and melting hearts!", + description: 'Melting Easter eggs and melting hearts!', images: { - lg: "cakeston-easter-21-lg.png", - md: "cakeston-easter-21-md.png", - sm: "cakeston-easter-21-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-caker.png`, + lg: 'cakeston-easter-21-lg.png', + md: 'cakeston-easter-21-md.png', + sm: 'cakeston-easter-21-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-caker.png` }, sortOrder: 999, - identifier: "easter-caker", + identifier: 'easter-caker', type: NftType.GLASS, - variationId: 15, + variationId: 15 }, { name: "Flipsie Easter '21", - description: "Watch out for Flipsie’s spatula smash!", + description: 'Watch out for Flipsie’s spatula smash!', images: { - lg: "flipsie-easter-21-lg.png", - md: "flipsie-easter-21-md.png", - sm: "flipsie-easter-21-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-flipper.png`, + lg: 'flipsie-easter-21-lg.png', + md: 'flipsie-easter-21-md.png', + sm: 'flipsie-easter-21-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-flipper.png` }, sortOrder: 999, - identifier: "easter-flipper", + identifier: 'easter-flipper', type: NftType.GLASS, - variationId: 14, + variationId: 14 }, { name: "Stormy Easter '21", - description: "Do you like chocolate with your syrup? Go long!", + description: 'Do you like chocolate with your syrup? Go long!', images: { - lg: "stormy-easter-21-lg.png", - md: "stormy-easter-21-md.png", - sm: "stormy-easter-21-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-storm.png`, + lg: 'stormy-easter-21-lg.png', + md: 'stormy-easter-21-md.png', + sm: 'stormy-easter-21-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-storm.png` }, sortOrder: 999, - identifier: "easter-storm", + identifier: 'easter-storm', type: NftType.GLASS, - variationId: 12, + variationId: 12 }, { - name: "Bullish", - description: "Happy Niu Year! This bunny’s excited for the year of the bull (market!)", + name: 'Bullish', + description: 'Happy Niu Year! This bunny’s excited for the year of the bull (market!)', images: { - lg: "bullish-lg.png", - md: "bullish-md.png", - sm: "bullish-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.png`, + lg: 'bullish-lg.png', + md: 'bullish-md.png', + sm: 'bullish-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.png` }, video: { webm: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.webm`, - mp4: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.mp4`, + mp4: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.mp4` }, sortOrder: 999, - identifier: "bullish", + identifier: 'bullish', type: NftType.GLASS, - variationId: 11, + variationId: 11 }, { - name: "Glass", + name: 'Glass', description: "Oopsie daisy! Glass's had a bit of an accident. Poor little fella.", images: { - lg: "glass-lg.png", - md: "glass-md.png", - sm: "glass-sm.png", - ipfs: `${IPFS_GATEWAY}/ipfs/QmQ6EE6gkVzAQUdQLLM7CyrnME6LZHCoy92ZERW8HXmyjw/glass.png`, + lg: 'glass-lg.png', + md: 'glass-md.png', + sm: 'glass-sm.png', + ipfs: `${IPFS_GATEWAY}/ipfs/QmQ6EE6gkVzAQUdQLLM7CyrnME6LZHCoy92ZERW8HXmyjw/glass.png` }, sortOrder: 999, - identifier: "glass", + identifier: 'glass', type: NftType.GLASS, - variationId: 10, + variationId: 10 }, { - name: "Prism", - description: "Glass works colors...", + name: 'Prism', + description: 'Glass works colors...', images: { - lg: "prism-lg.png", - md: "prism-md.png", - sm: "prism-sm.png", + lg: 'prism-lg.png', + md: 'prism-md.png', + sm: 'prism-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png`, - blur: "prism-blur.png", + blur: 'prism-blur.png' }, sortOrder: 999, - identifier: "prism", + identifier: 'prism', type: NftType.GLASS, - variationId: 5, + variationId: 5 }, { - name: "Reflect", - description: "Either brightness from the sun or darkness from below", + name: 'Reflect', + description: 'Either brightness from the sun or darkness from below', images: { - lg: "reflect-lg.png", - md: "reflect-md.png", - sm: "reflect-sm.png", + lg: 'reflect-lg.png', + md: 'reflect-md.png', + sm: 'reflect-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/reflect.png`, - blur: "reflect-blur.png", + blur: 'reflect-blur.png' }, sortOrder: 999, - identifier: "reflect", + identifier: 'reflect', type: NftType.GLASS, - variationId: 9, + variationId: 9 }, { - name: "Chandelier", + name: 'Chandelier', description: "Don't be mesmerized by the light... Chandelier's a GLASS master!", images: { - lg: "chandelier-lg.png", - md: "chandelier-md.png", - sm: "chandelier-sm.png", + lg: 'chandelier-lg.png', + md: 'chandelier-md.png', + sm: 'chandelier-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/chandelier.png`, - blur: "chandelier-blur.png", + blur: 'chandelier-blur.png' }, sortOrder: 999, - identifier: "chandelier", + identifier: 'chandelier', type: NftType.GLASS, - variationId: 8, + variationId: 8 }, { - name: "Dollop", + name: 'Dollop', description: "Nommm... Oh hi, I'm just meditating on the meaning of CAKE.", images: { - lg: "dollop-lg.png", - md: "dollop-md.png", - sm: "dollop-sm.png", + lg: 'dollop-lg.png', + md: 'dollop-md.png', + sm: 'dollop-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/dollop.png`, - blur: "dollop-blur.png", + blur: 'dollop-blur.png' }, sortOrder: 999, - identifier: "dollop", + identifier: 'dollop', type: NftType.GLASS, - variationId: 6, + variationId: 6 }, { - name: "Twinkle", + name: 'Twinkle', description: "Three guesses what's put that twinkle in those eyes! (Hint: it's CAKE)", images: { - lg: "twinkle-lg.png", - md: "twinkle-md.png", - sm: "twinkle-sm.png", + lg: 'twinkle-lg.png', + md: 'twinkle-md.png', + sm: 'twinkle-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/twinkle.png`, - blur: "twinkle-blur.png", + blur: 'twinkle-blur.png' }, sortOrder: 999, - identifier: "twinkle", + identifier: 'twinkle', type: NftType.GLASS, - variationId: 7, + variationId: 7 }, { - name: "Streak", + name: 'Streak', description: "You'll know us when you see", images: { - lg: "streak-lg.png", - md: "streak-md.png", - sm: "streak-sm.png", + lg: 'streak-lg.png', + md: 'streak-md.png', + sm: 'streak-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/streak.png`, - blur: "streak-blur.png", + blur: 'streak-blur.png' }, sortOrder: 999, - identifier: "streak", + identifier: 'streak', type: NftType.GLASS, - variationId: 0, + variationId: 0 }, { - name: "Sparkle", - description: "As it rains down, is it shards or water?", + name: 'Sparkle', + description: 'As it rains down, is it shards or water?', images: { - lg: "sparkle-lg.png", - md: "sparkle-md.png", - sm: "sparkle-sm.png", + lg: 'sparkle-lg.png', + md: 'sparkle-md.png', + sm: 'sparkle-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/sparkle.png`, - blur: "sparkle-blur.png", + blur: 'sparkle-blur.png' }, sortOrder: 999, - identifier: "sparkle", + identifier: 'sparkle', type: NftType.GLASS, - variationId: 1, + variationId: 1 }, { - name: "Diamond", - description: "A scratch to mark the journey", + name: 'Diamond', + description: 'A scratch to mark the journey', images: { - lg: "diamond-lg.png", - md: "diamond-md.png", - sm: "diamond-sm.png", + lg: 'diamond-lg.png', + md: 'diamond-md.png', + sm: 'diamond-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/diamond.png`, - blur: "diamond-blur.png", + blur: 'diamond-blur.png' }, sortOrder: 999, - identifier: "diamond", + identifier: 'diamond', type: NftType.GLASS, - variationId: 2, + variationId: 2 }, { - name: "Cleaner", - description: "Never aging", + name: 'Cleaner', + description: 'Never aging', images: { - lg: "cleaner-lg.png", - md: "cleaner-md.png", - sm: "cleaner-sm.png", + lg: 'cleaner-lg.png', + md: 'cleaner-md.png', + sm: 'cleaner-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/cleaner.png`, - blur: "cleaner-blur.png", + blur: 'cleaner-blur.png' }, sortOrder: 999, - identifier: "cleaner", + identifier: 'cleaner', type: NftType.GLASS, - variationId: 3, + variationId: 3 }, { - name: "Blur", - description: "The eyesight would be the first", + name: 'Blur', + description: 'The eyesight would be the first', images: { - lg: "blur-lg.png", - md: "blur-md.png", - sm: "blur-sm.png", + lg: 'blur-lg.png', + md: 'blur-md.png', + sm: 'blur-sm.png', ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/blur.png`, - blur: "blur-blur.png", + blur: 'blur-blur.png' }, sortOrder: 999, - identifier: "blur", + identifier: 'blur', type: NftType.GLASS, - variationId: 4, - }, -]; + variationId: 4 + } +] -export default Nfts; +export default Nfts diff --git a/packages/dsentr-profile-sdk/src/constants/teams.ts b/packages/dsentr-profile-sdk/src/constants/teams.ts index e5057b5..78f27da 100644 --- a/packages/dsentr-profile-sdk/src/constants/teams.ts +++ b/packages/dsentr-profile-sdk/src/constants/teams.ts @@ -1,54 +1,54 @@ -import { Team } from "../types"; +import { Team } from '../types' const teams: Team[] = [ { id: 1, - name: "Syrup Storm", + name: 'Syrup Storm', description: "The storm's a-comin! Watch out! These bulls are stampeding in a syrupy surge!", images: { - lg: "syrup-storm-lg.png", - md: "syrup-storm-md.png", - sm: "syrup-storm-sm.png", - alt: "syrup-storm-alt.png", - ipfs: "https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/syrup-storm.png", + lg: 'syrup-storm-lg.png', + md: 'syrup-storm-md.png', + sm: 'syrup-storm-sm.png', + alt: 'syrup-storm-alt.png', + ipfs: 'https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/syrup-storm.png' }, - background: "syrup-storm-bg.svg", - textColor: "#191326", + background: 'syrup-storm-bg.svg', + textColor: '#191326', users: 0, - points: 0, + points: 0 }, { id: 2, - name: "Fearsome Flippers", + name: 'Fearsome Flippers', description: "The flippening is coming. Don't get in these bunnies' way, or you'll get flipped too!", images: { - lg: "fearsome-flippers-lg.png", - md: "fearsome-flippers-md.png", - sm: "fearsome-flippers-sm.png", - alt: "fearsome-flippers-alt.png", - ipfs: "https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/fearsome-flippers.png", + lg: 'fearsome-flippers-lg.png', + md: 'fearsome-flippers-md.png', + sm: 'fearsome-flippers-sm.png', + alt: 'fearsome-flippers-alt.png', + ipfs: 'https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/fearsome-flippers.png' }, - background: "fearsome-flippers-bg.svg", - textColor: "#FFFFFF", + background: 'fearsome-flippers-bg.svg', + textColor: '#FFFFFF', users: 0, - points: 0, + points: 0 }, { id: 3, - name: "Chaotic Cakers", - description: "Can you stand the heat? Stay out of the kitchen or you might get burned to a crisp!", + name: 'Chaotic Cakers', + description: 'Can you stand the heat? Stay out of the kitchen or you might get burned to a crisp!', images: { - lg: "chaotic-cakers-lg.png", - md: "chaotic-cakers-md.png", - sm: "chaotic-cakers-sm.png", - alt: "chaotic-cakers-alt.png", - ipfs: "https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/chaotic-cakers.png", + lg: 'chaotic-cakers-lg.png', + md: 'chaotic-cakers-md.png', + sm: 'chaotic-cakers-sm.png', + alt: 'chaotic-cakers-alt.png', + ipfs: 'https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/chaotic-cakers.png' }, - background: "chaotic-cakers-bg.svg", - textColor: "#191326", + background: 'chaotic-cakers-bg.svg', + textColor: '#191326', users: 0, - points: 0, - }, -]; + points: 0 + } +] -export default teams; +export default teams diff --git a/packages/dsentr-profile-sdk/src/images/images.d.ts b/packages/dsentr-profile-sdk/src/images/images.d.ts index 08f5f4f..e238d01 100644 --- a/packages/dsentr-profile-sdk/src/images/images.d.ts +++ b/packages/dsentr-profile-sdk/src/images/images.d.ts @@ -1,2 +1,2 @@ -declare module "*.png"; -declare module "*.svg"; +declare module '*.png'; +declare module '*.svg'; diff --git a/packages/dsentr-profile-sdk/src/images/index.ts b/packages/dsentr-profile-sdk/src/images/index.ts index b01f1fc..73e4a91 100644 --- a/packages/dsentr-profile-sdk/src/images/index.ts +++ b/packages/dsentr-profile-sdk/src/images/index.ts @@ -1,17 +1,17 @@ -export { default as chaoticCakersAlt } from "./chaotic-cakers-alt.png"; -export { default as chaoticCakersSm } from "./chaotic-cakers-sm.png"; -export { default as chaoticCakersMd } from "./chaotic-cakers-md.png"; -export { default as chaoticCakersLg } from "./chaotic-cakers-lg.png"; -export { default as chaoticCakersBg } from "./chaotic-cakers-bg.svg"; +export { default as chaoticCakersAlt } from './chaotic-cakers-alt.png' +export { default as chaoticCakersSm } from './chaotic-cakers-sm.png' +export { default as chaoticCakersMd } from './chaotic-cakers-md.png' +export { default as chaoticCakersLg } from './chaotic-cakers-lg.png' +export { default as chaoticCakersBg } from './chaotic-cakers-bg.svg' -export { default as fearsomeFlippersAlt } from "./fearsome-flippers-alt.png"; -export { default as fearsomeFlippersSm } from "./fearsome-flippers-sm.png"; -export { default as fearsomeFlippersMd } from "./fearsome-flippers-md.png"; -export { default as fearsomeFlippersLg } from "./fearsome-flippers-lg.png"; -export { default as fearsomeFlippersBg } from "./fearsome-flippers-bg.svg"; +export { default as fearsomeFlippersAlt } from './fearsome-flippers-alt.png' +export { default as fearsomeFlippersSm } from './fearsome-flippers-sm.png' +export { default as fearsomeFlippersMd } from './fearsome-flippers-md.png' +export { default as fearsomeFlippersLg } from './fearsome-flippers-lg.png' +export { default as fearsomeFlippersBg } from './fearsome-flippers-bg.svg' -export { default as syrupStormAlt } from "./syrup-storm-alt.png"; -export { default as syrupStormSm } from "./syrup-storm-sm.png"; -export { default as syrupStormMd } from "./syrup-storm-md.png"; -export { default as syrupStormLg } from "./syrup-storm-lg.png"; -export { default as syrupStormBg } from "./syrup-storm-bg.svg"; +export { default as syrupStormAlt } from './syrup-storm-alt.png' +export { default as syrupStormSm } from './syrup-storm-sm.png' +export { default as syrupStormMd } from './syrup-storm-md.png' +export { default as syrupStormLg } from './syrup-storm-lg.png' +export { default as syrupStormBg } from './syrup-storm-bg.svg' diff --git a/packages/dsentr-profile-sdk/src/index.ts b/packages/dsentr-profile-sdk/src/index.ts index 8485ebc..385384f 100644 --- a/packages/dsentr-profile-sdk/src/index.ts +++ b/packages/dsentr-profile-sdk/src/index.ts @@ -1,5 +1,5 @@ -import DSentrProfileSdk from "./profile-sdk"; +import DSentrProfileSdk from './profile-sdk' -export * from "./images"; -export * from "./types"; -export default DSentrProfileSdk; +export * from './images' +export * from './types' +export default DSentrProfileSdk diff --git a/packages/dsentr-profile-sdk/src/mocks/handlers.ts b/packages/dsentr-profile-sdk/src/mocks/handlers.ts index b588a83..f04cab5 100644 --- a/packages/dsentr-profile-sdk/src/mocks/handlers.ts +++ b/packages/dsentr-profile-sdk/src/mocks/handlers.ts @@ -1,36 +1,36 @@ -import { rest, graphql } from "msw"; -import { existingAddress1, existingAddress2, nonexistentAddress } from "./mockAddresses"; -import { profileApi, profileSubgraphApi, IPFS_GATEWAY } from "../constants/common"; +import { rest, graphql } from 'msw' +import { existingAddress1, existingAddress2, nonexistentAddress } from './mockAddresses' +import { profileApi, profileSubgraphApi, IPFS_GATEWAY } from '../constants/common' -const subgraph = graphql.link(profileSubgraphApi); +const subgraph = graphql.link(profileSubgraphApi) const handlers = [ rest.get(`${profileApi}/api/users/${existingAddress1}`, (req, res, ctx) => { return res( ctx.status(200), ctx.json({ - username: "Cheems", + username: 'Cheems' }) - ); + ) }), rest.get(`${profileApi}/api/users/${nonexistentAddress}`, (req, res, ctx) => { - return res(ctx.status(404), ctx.json({ error: { message: "Entity not found." } })); + return res(ctx.status(404), ctx.json({ error: { message: 'Entity not found.' } })) }), rest.get(`${IPFS_GATEWAY}/ipfs/QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/prism.json`, (req, res, ctx) => { return res( ctx.status(200), ctx.json({ - name: "Prism", - description: "Glass works colors", - image: "ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png", + name: 'Prism', + description: 'Glass works colors', + image: 'ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png', attributes: { - shardId: "5", - }, + shardId: '5' + } }) - ); + ) }), - subgraph.query("getUser", (req, res, ctx) => { - const address = req.variables.id; + subgraph.query('getUser', (req, res, ctx) => { + const address = req.variables.id if (address === existingAddress1) { return res( ctx.data({ @@ -38,40 +38,40 @@ const handlers = [ points: [ { id: existingAddress1, - campaignId: "511080000", - points: 200, + campaignId: '511080000', + points: 200 }, { id: existingAddress1, - campaignId: "512010010", - points: 500, + campaignId: '512010010', + points: 500 }, { id: existingAddress1, - campaignId: "511090000", - points: 100, - }, - ], - }, + campaignId: '511090000', + points: 100 + } + ] + } }) - ); + ) } if (address === existingAddress2) { return res( ctx.data({ user: { - points: [], - }, + points: [] + } }) - ); + ) } // Address does not exists return res( ctx.data({ - user: null, + user: null }) - ); - }), -]; + ) + }) +] -export default handlers; +export default handlers diff --git a/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts b/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts index f74f75a..a939308 100644 --- a/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts +++ b/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts @@ -1,3 +1,3 @@ -export const existingAddress1 = "0x1111111111111111111111111111111111111111"; -export const existingAddress2 = "0x2222222222222222222222222222222222222222"; -export const nonexistentAddress = "0x9999999999999999999999999999999999999999"; +export const existingAddress1 = '0x1111111111111111111111111111111111111111' +export const existingAddress2 = '0x2222222222222222222222222222222222222222' +export const nonexistentAddress = '0x9999999999999999999999999999999999999999' diff --git a/packages/dsentr-profile-sdk/src/mocks/server.ts b/packages/dsentr-profile-sdk/src/mocks/server.ts index eb97252..c66c0d4 100644 --- a/packages/dsentr-profile-sdk/src/mocks/server.ts +++ b/packages/dsentr-profile-sdk/src/mocks/server.ts @@ -1,9 +1,9 @@ -import { rest } from "msw"; -import { setupServer } from "msw/node"; -import handlers from "./handlers"; +import { rest } from 'msw' +import { setupServer } from 'msw/node' +import handlers from './handlers' // This configures a request mocking server with the given request handlers. -const server = setupServer(...handlers); +const server = setupServer(...handlers) // Use these to set up special cases during tests // No need for manual teardown, all runtime modifications are cleaned up in jest.setup.js afterEach -export { server, rest }; +export { server, rest } diff --git a/packages/dsentr-profile-sdk/src/profile-sdk.test.ts b/packages/dsentr-profile-sdk/src/profile-sdk.test.ts index e6dca99..f63c4e3 100644 --- a/packages/dsentr-profile-sdk/src/profile-sdk.test.ts +++ b/packages/dsentr-profile-sdk/src/profile-sdk.test.ts @@ -1,187 +1,187 @@ -import Web3 from "web3"; -import Cookies from "js-cookie"; -import DSentrProfileSdk from "./profile-sdk"; -import web3NoAccount from "./utils/web3"; -import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID, profileApi } from "./constants/common"; -import nfts from "./constants/nfts"; -import teamsList from "./constants/teams"; -import { existingAddress1, existingAddress2, nonexistentAddress } from "./mocks/mockAddresses"; -import { server, rest } from "./mocks/server"; +import Web3 from 'web3' +import Cookies from 'js-cookie' +import DSentrProfileSdk from './profile-sdk' +import web3NoAccount from './utils/web3' +import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID, profileApi } from './constants/common' +import nfts from './constants/nfts' +import teamsList from './constants/teams' +import { existingAddress1, existingAddress2, nonexistentAddress } from './mocks/mockAddresses' +import { server, rest } from './mocks/server' -jest.mock("./utils/contractHelpers"); -jest.mock("js-cookie", () => ({ - set: jest.fn(() => null), -})); +jest.mock('./utils/contractHelpers') +jest.mock('js-cookie', () => ({ + set: jest.fn(() => null) +})) -describe("DSentrProfileSdk", () => { - describe("constructor", () => { - it("uses default web3 instance if no web3 is provided", () => { - const sdk = new DSentrProfileSdk(); - expect(sdk.web3).toBe(web3NoAccount); - }); - it("uses mainnet chainId if no chainId is provided", () => { - const sdk = new DSentrProfileSdk(); - expect(sdk.chainId).toBe(MAINNET_CHAIN_ID); - }); - it("uses custom web3 instance if provided", () => { - const httpProvider = new Web3.providers.HttpProvider("http://customrpc.com", { - timeout: 10000, - }); - const customWeb3 = new Web3(httpProvider); - const sdk = new DSentrProfileSdk({ web3: customWeb3 }); - expect(sdk.web3).toBe(customWeb3); - }); - it("uses specific chainId if chainId is provided", () => { - const sdk = new DSentrProfileSdk({ chainId: TESTNET_CHAIN_ID }); - expect(sdk.chainId).toBe(TESTNET_CHAIN_ID); - }); - }); +describe('DSentrProfileSdk', () => { + describe('constructor', () => { + it('uses default web3 instance if no web3 is provided', () => { + const sdk = new DSentrProfileSdk() + expect(sdk.web3).toBe(web3NoAccount) + }) + it('uses mainnet chainId if no chainId is provided', () => { + const sdk = new DSentrProfileSdk() + expect(sdk.chainId).toBe(MAINNET_CHAIN_ID) + }) + it('uses custom web3 instance if provided', () => { + const httpProvider = new Web3.providers.HttpProvider('http://customrpc.com', { + timeout: 10000 + }) + const customWeb3 = new Web3(httpProvider) + const sdk = new DSentrProfileSdk({ web3: customWeb3 }) + expect(sdk.web3).toBe(customWeb3) + }) + it('uses specific chainId if chainId is provided', () => { + const sdk = new DSentrProfileSdk({ chainId: TESTNET_CHAIN_ID }) + expect(sdk.chainId).toBe(TESTNET_CHAIN_ID) + }) + }) - describe("methods", () => { - const sdk = new DSentrProfileSdk(); + describe('methods', () => { + const sdk = new DSentrProfileSdk() beforeEach(() => { - jest.clearAllMocks(); - }); + jest.clearAllMocks() + }) - describe("getUsername", () => { - it("returns username for valid address", async () => { - await expect(sdk.getUsername(existingAddress1)).resolves.toEqual("Cheems"); - }); - it("returns empty string for invalid address", async () => { - await expect(sdk.getUsername(nonexistentAddress)).resolves.toEqual(""); - }); - it("returns empty string when there is internal server error", async () => { + describe('getUsername', () => { + it('returns username for valid address', async () => { + await expect(sdk.getUsername(existingAddress1)).resolves.toEqual('Cheems') + }) + it('returns empty string for invalid address', async () => { + await expect(sdk.getUsername(nonexistentAddress)).resolves.toEqual('') + }) + it('returns empty string when there is internal server error', async () => { server.use( rest.get(`${profileApi}/api/users/${existingAddress1}`, async (req, res, ctx) => { - return res(ctx.status(500), ctx.json({ message: "500 Internal Server Error" })); + return await res(ctx.status(500), ctx.json({ message: '500 Internal Server Error' })) }) - ); - await expect(sdk.getUsername(nonexistentAddress)).resolves.toEqual(""); - }); - }); + ) + await expect(sdk.getUsername(nonexistentAddress)).resolves.toEqual('') + }) + }) - describe("getAchievements", () => { - it("returns achievements for existing address", async () => { + describe('getAchievements', () => { + it('returns achievements for existing address', async () => { const expectedAchievements = [ { - id: "511080000", - type: "ifo", + id: '511080000', + type: 'ifo', address: existingAddress1, title: { id: 999, - fallback: `IFO Shopper: Belt`, + fallback: 'IFO Shopper: Belt', data: { - name: "Belt", - }, + name: 'Belt' + } }, description: { id: 999, - fallback: `Committed more than $5 worth of LP in the Belt IFO`, + fallback: 'Committed more than $5 worth of LP in the Belt IFO', data: { - name: "Belt", - }, + name: 'Belt' + } }, - badge: "ifo-belt.svg", - points: 200, + badge: 'ifo-belt.svg', + points: 200 }, { - id: "512010010", - type: "teambattle", + id: '512010010', + type: 'teambattle', address: existingAddress1, - title: "Easter Participant: Silver", - badge: "easter-participant-silver.svg", - points: 500, + title: 'Easter Participant: Silver', + badge: 'easter-participant-silver.svg', + points: 500 }, { - id: "511090000", - type: "ifo", + id: '511090000', + type: 'ifo', address: existingAddress1, title: { id: 999, - fallback: `IFO Shopper: Horizon Protocol`, + fallback: 'IFO Shopper: Horizon Protocol', data: { - name: "Horizon Protocol", - }, + name: 'Horizon Protocol' + } }, description: { id: 999, - fallback: `Committed more than $5 worth of LP in the Horizon Protocol IFO`, + fallback: 'Committed more than $5 worth of LP in the Horizon Protocol IFO', data: { - name: "Horizon Protocol", - }, + name: 'Horizon Protocol' + } }, - badge: "ifo-hzn.svg", - points: 100, - }, - ]; - const achievements = await sdk.getAchievements(existingAddress1); - expect(achievements).toEqual(expectedAchievements); - }); - it("returns empty array for address with no achievements", async () => { - const achievements = await sdk.getAchievements(existingAddress2); - expect(achievements).toEqual([]); - }); - it("returns empty array for non-existent address", async () => { - const achievements = await sdk.getAchievements(nonexistentAddress); - expect(achievements).toEqual([]); - }); - }); + badge: 'ifo-hzn.svg', + points: 100 + } + ] + const achievements = await sdk.getAchievements(existingAddress1) + expect(achievements).toEqual(expectedAchievements) + }) + it('returns empty array for address with no achievements', async () => { + const achievements = await sdk.getAchievements(existingAddress2) + expect(achievements).toEqual([]) + }) + it('returns empty array for non-existent address', async () => { + const achievements = await sdk.getAchievements(nonexistentAddress) + expect(achievements).toEqual([]) + }) + }) - describe("getTeam", () => { + describe('getTeam', () => { beforeEach(() => { - jest.clearAllMocks(); - }); - it("returns team data for valid team", async () => { + jest.clearAllMocks() + }) + it('returns team data for valid team', async () => { await expect(sdk.getTeam(2)).resolves.toEqual({ ...teamsList[1], users: 77000, points: 341500, - isJoinable: true, - }); - }); - it("returns null for non-existent team id", async () => { - await expect(sdk.getTeam(69)).resolves.toEqual(null); - }); - }); + isJoinable: true + }) + }) + it('returns null for non-existent team id', async () => { + await expect(sdk.getTeam(69)).resolves.toEqual(null) + }) + }) - describe("getProfile", () => { - const sleepyNft = nfts.find((nft) => nft.identifier === "sleepy"); + describe('getProfile', () => { + const sleepyNft = nfts.find((nft) => nft.identifier === 'sleepy') beforeEach(() => { - jest.clearAllMocks(); - }); - it("returns proper response for unregistered user", async () => { - const profile = await sdk.getProfile(nonexistentAddress); - expect(profile).toEqual({ hasRegistered: false, profile: null }); - }); - it("returns proper response for registered user", async () => { - const profile = await sdk.getProfile(existingAddress1); + jest.clearAllMocks() + }) + it('returns proper response for unregistered user', async () => { + const profile = await sdk.getProfile(nonexistentAddress) + expect(profile).toEqual({ hasRegistered: false, profile: null }) + }) + it('returns proper response for registered user', async () => { + const profile = await sdk.getProfile(existingAddress1) expect(profile).toEqual({ hasRegistered: true, profile: { isActive: true, userId: 123, - username: "Cheems", + username: 'Cheems', teamId: 2, points: 3000, tokenId: 555, - nftAddress: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", + nftAddress: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', nft: sleepyNft, - team: { ...teamsList[1], users: 77000, points: 341500, isJoinable: true }, - }, - }); - }); - it("sets cookies", async () => { - await sdk.getProfile(existingAddress1); + team: { ...teamsList[1], users: 77000, points: 341500, isJoinable: true } + } + }) + }) + it('sets cookies', async () => { + await sdk.getProfile(existingAddress1) expect(Cookies.set).toBeCalledWith( `profile_${existingAddress1}`, { - username: "Cheems", - avatar: `https://dsentr.com/images/nfts/${sleepyNft.images.sm}`, + username: 'Cheems', + avatar: `https://dsentr.com/images/nfts/${(sleepyNft != null) ? sleepyNft.images.sm : ''}` }, - { domain: "dsentr.com", secure: true, expires: 30 } - ); - expect(Cookies.set).toBeCalledTimes(1); - }); - }); - }); -}); + { domain: 'dsentr.com', secure: true, expires: 30 } + ) + expect(Cookies.set).toBeCalledTimes(1) + }) + }) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/profile-sdk.ts b/packages/dsentr-profile-sdk/src/profile-sdk.ts index 1e13e85..9df3f7a 100644 --- a/packages/dsentr-profile-sdk/src/profile-sdk.ts +++ b/packages/dsentr-profile-sdk/src/profile-sdk.ts @@ -1,32 +1,32 @@ -import Web3 from "web3"; -import { Contract } from "web3-eth-contract"; -import { request, gql } from "graphql-request"; -import Cookies from "js-cookie"; -import web3NoAccount from "./utils/web3"; -import { getProfileContract } from "./utils/contractHelpers"; -import { profileApi, profileSubgraphApi, MAINNET_CHAIN_ID } from "./constants/common"; -import { campaignMap } from "./constants/campaigns"; -import teamsList from "./constants/teams"; -import { Achievement, Team, GetProfileResponse, Profile, Nft, UserPointIncreaseEvent } from "./types"; -import { getAchievementDescription, getAchievementTitle, transformProfileResponse } from "./utils/transformHelpers"; -import { getNftByTokenId } from "./utils/collectibles"; - -type SdkConstructorArguments = { - web3?: Web3; - chainId?: number; -}; +import Web3 from 'web3' +import { Contract } from 'web3-eth-contract' +import { request, gql } from 'graphql-request' +import Cookies from 'js-cookie' +import web3NoAccount from './utils/web3' +import { getProfileContract } from './utils/contractHelpers' +import { profileApi, profileSubgraphApi, MAINNET_CHAIN_ID } from './constants/common' +import { campaignMap } from './constants/campaigns' +import teamsList from './constants/teams' +import { Achievement, Team, GetProfileResponse, Profile, Nft, UserPointIncreaseEvent } from './types' +import { getAchievementDescription, getAchievementTitle, transformProfileResponse } from './utils/transformHelpers' +import { getNftByTokenId } from './utils/collectibles' + +interface SdkConstructorArguments { + web3?: Web3 + chainId?: number +} class DSentrProfileSdk { - web3 = web3NoAccount; + web3 = web3NoAccount - chainId = MAINNET_CHAIN_ID; + chainId = MAINNET_CHAIN_ID - profileContract: Contract; + profileContract: Contract - constructor(args?: SdkConstructorArguments) { - if (args?.web3) this.web3 = args.web3; - if (args?.chainId) this.chainId = args.chainId; - this.profileContract = getProfileContract(this.web3, this.chainId); + constructor (args?: SdkConstructorArguments) { + if ((args?.web3) != null) this.web3 = args.web3 + if (args?.chainId != null) this.chainId = args.chainId + this.profileContract = getProfileContract(this.web3, this.chainId) } /** @@ -36,17 +36,17 @@ class DSentrProfileSdk { */ getUsername = async (address: string): Promise => { try { - const response = await fetch(`${profileApi}/api/users/${address}`); + const response = await fetch(`${profileApi}/api/users/${address}`) if (!response.ok) { - return ""; + return '' } - const { username = "" } = await response.json(); - return username; + const { username = '' } = await response.json() + return username } catch (error) { - return ""; + return '' } - }; + } getAchievements = async (account: string): Promise => { try { @@ -64,30 +64,33 @@ class DSentrProfileSdk { } `, { id: account.toLowerCase() } - ); + ) if (data.user === null || data.user.points.length === 0) { - return []; + return [] } return data.user.points.reduce((accum: Achievement[], userPoint: UserPointIncreaseEvent) => { - const campaignMeta = campaignMap.get(userPoint.campaignId); - - return [ - ...accum, - { - id: userPoint.campaignId, - type: campaignMeta.type, - address: userPoint.id, - title: getAchievementTitle(campaignMeta), - description: getAchievementDescription(campaignMeta), - badge: campaignMeta.badge, - points: Number(userPoint.points), - }, - ]; - }, []); + const campaignMeta = campaignMap.get(userPoint.campaignId) + if (campaignMeta == null) { + return [] + } else { + return [ + ...accum, + { + id: userPoint.campaignId, + type: campaignMeta.type, + address: userPoint.id, + title: getAchievementTitle(campaignMeta), + description: getAchievementDescription(campaignMeta), + badge: campaignMeta.badge, + points: Number(userPoint.points) + } + ] + } + }, []) } catch (error) { - return []; + return [] } - }; + } /** * Fetches team information from @@ -95,21 +98,49 @@ class DSentrProfileSdk { * This data is combined with static team data (images, description, etc) that is stored in constant in this repo. * Contract repo - https://github.com/dsentr-glass/dsentr-contracts/tree/master/projects/profile-nft-gamification */ - getTeam = async (teamId: number): Promise => { + getTeam = async (teamId: number | undefined): Promise => { + const fallback = { + id: -1, + name: '', + description: '', + images: { + lg: 'na-lg.png', + md: 'na-md.png', + sm: 'na-sm.png', + alt: 'na-alt.png', + ipfs: '' + }, + background: 'na-bg.svg', + textColor: '#191326', + users: 0, + points: 0 + } + if (teamId == null) { + return fallback + } try { const { 0: teamName, 2: numberUsers, 3: numberPoints, - 4: isJoinable, - } = await this.profileContract.methods.getTeamProfile(teamId).call(); - const staticTeamInfo = teamsList.find((staticTeam) => staticTeam.id === teamId); - - return { ...staticTeamInfo, isJoinable, name: teamName, users: numberUsers, points: numberPoints }; + 4: isJoinable + } = await this.profileContract.methods.getTeamProfile(teamId).call() + const staticTeamInfo: Team = (teamsList.find(staticTeam => staticTeam.id === teamId)) || fallback + return { ...staticTeamInfo, isJoinable, name: teamName, users: numberUsers, points: numberPoints } } catch (error) { - return null; + return fallback } - }; + } + + // id: number + // name: string + // description: string + // isJoinable?: boolean + // users: number + // points: number + // images: TeamImages + // background: string + // textColor: string /** * Fetches profile information for specified address. @@ -120,36 +151,38 @@ class DSentrProfileSdk { */ getProfile = async (address: string): Promise => { try { - const hasRegistered = (await this.profileContract.methods.hasRegistered(address).call()) as boolean; + const hasRegistered = (await this.profileContract.methods.hasRegistered(address).call()) as boolean if (!hasRegistered) { - return { hasRegistered, profile: null }; + return { hasRegistered, profile: undefined } } - const profileResponse = await this.profileContract.methods.getUserProfile(address).call(); - const { userId, points, teamId, tokenId, nftAddress, isActive } = transformProfileResponse(profileResponse); - const team = await this.getTeam(teamId); - const username = await this.getUsername(address); + const profileResponse = await this.profileContract.methods.getUserProfile(address).call() + const { userId, points, teamId, tokenId, nftAddress, isActive } = transformProfileResponse(profileResponse) + const team = await this.getTeam(teamId) + const username = await this.getUsername(address) // If the profile is not active the tokenId returns 0, which is still a valid token id // so only fetch the nft data if active - let nft: Nft; - if (isActive) { - nft = await getNftByTokenId(nftAddress, tokenId, this.web3, this.chainId); - const avatar = nft ? `https://dsentr.com/images/nfts/${nft.images.sm}` : undefined; + let nft: Nft | null | undefined + if (isActive != null && isActive && nftAddress != null && tokenId != null) { + nft = await getNftByTokenId(nftAddress, tokenId, this.web3, this.chainId) + const avatar = (nft != null) ? `https://dsentr.com/images/nfts/${nft.images.sm}` : undefined // Save the preview image in a cookie so it can be used on the exchange // TODO v2: optional (and configurable) Cookies.set Cookies.set( `profile_${address}`, { username, - avatar, + avatar }, - { domain: "dsentr.com", secure: true, expires: 30 } - ); + { domain: 'dsentr.com', secure: true, expires: 30 } + ) } - - const profile = { + if (userId == null || points == null || teamId == null || tokenId == null || nftAddress == null || isActive == null || nft == null) { + throw new Error('Some items were undefined') + } + const profile: Profile = { userId, points, teamId, @@ -159,14 +192,17 @@ class DSentrProfileSdk { isActive, nft, team, - } as Profile; + hasRegistered + } - return { hasRegistered, profile }; + return { hasRegistered, profile } } catch (error) { - console.error("getProfile error: ", error); - return null; + console.error('getProfile error: ', error) + const hasRegistered = false + const profile = undefined + return { hasRegistered, profile } } - }; + } } -export default DSentrProfileSdk; +export default DSentrProfileSdk diff --git a/packages/dsentr-profile-sdk/src/types.ts b/packages/dsentr-profile-sdk/src/types.ts index 5113d41..a866caa 100644 --- a/packages/dsentr-profile-sdk/src/types.ts +++ b/packages/dsentr-profile-sdk/src/types.ts @@ -1,126 +1,129 @@ export interface Address { - 97?: string; - 56: string; + [key: number]: string + 97: string + 56: string } -export type Images = { - lg: string; - md: string; - sm: string; - ipfs?: string; -}; +export interface Images { + lg: string + md: string + sm: string + ipfs?: string +} export type NftImages = { - blur?: string; -} & Images; - -export type NftVideo = { - webm: string; - mp4: string; -}; - -export type Nft = { - name: string; - description: string; - images: NftImages; - sortOrder: number; - type: NftType; - video?: NftVideo; + blur?: string +} & Images + +export interface NftVideo { + webm: string + mp4: string +} + +export interface Nft { + name: string + description: string + images: NftImages + sortOrder: number + type: NftType + video?: NftVideo // Uniquely identifies the nft. // Used for matching an NFT from the config with the data from the NFT's tokenURI - identifier: string; + identifier: string - variationId?: number | string; -}; + variationId?: number | string +} export enum NftType { - GLASS = "glass", - MIRROR = "mirror", + GLASS = 'glass', + MIRROR = 'mirror', } -export type NftUriData = { - name: string; - description: string; - image: string; - attributes: { - shardId: string; - }; -}; +export interface NftUriData { + [key: string]: { + name: string + description: string + image: string + attributes: { + shardId: string + } + } +} export type NftSource = { [key in NftType]: { - address: Address; - identifierKey: string; + address: Address + identifierKey: string }; -}; +} export type TeamImages = { - alt: string; -} & Images; - -export type Team = { - id: number; - name: string; - description: string; - isJoinable?: boolean; - users: number; - points: number; - images: TeamImages; - background: string; - textColor: string; -}; + alt: string +} & Images + +export interface Team { + id: number + name: string + description: string + isJoinable?: boolean + users: number + points: number + images: TeamImages + background: string + textColor: string +} export interface GetProfileResponse { - hasRegistered: boolean; - profile?: Profile; + hasRegistered: boolean + profile?: Profile } export interface Profile { - userId: number; - points: number; - teamId: number; - nftAddress: string; - tokenId: number; - isActive: boolean; - username: string; - nft?: Nft; - team: Team; - hasRegistered: boolean; + userId: number + points: number + teamId: number + nftAddress: string + tokenId: number + isActive: boolean + username: string + nft?: Nft + team: Team + hasRegistered: boolean } export type TranslatableText = | string | { - id: number; - fallback: string; - data?: { - [key: string]: string | number; - }; - }; - -export type CampaignType = "ifo" | "teambattle"; - -export type Campaign = { - id: string; - type: CampaignType; - title?: TranslatableText; - description?: TranslatableText; - badge?: string; -}; + id: number + fallback: string + data?: { + [key: string]: string | number + } + } + +export type CampaignType = 'ifo' | 'teambattle' + +export interface Campaign { + id: string + type: CampaignType + title?: TranslatableText + description?: TranslatableText + badge?: string +} export interface Achievement { - id: string; - type: CampaignType; - address: string; - title: TranslatableText; - description?: TranslatableText; - badge: string; - points: number; + id: string + type: CampaignType + address: string + title: TranslatableText + description?: TranslatableText + badge: string + points: number } export interface UserPointIncreaseEvent { - campaignId: string; - id: string; // wallet address - points: string; + campaignId: string + id: string // wallet address + points: string } diff --git a/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts b/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts index e4947f8..6667285 100644 --- a/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts +++ b/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts @@ -1,62 +1,62 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import Web3 from "web3"; -import { existingAddress1 } from "../../mocks/mockAddresses"; +import Web3 from 'web3' +import { existingAddress1 } from '../../mocks/mockAddresses' const getProfileContract = jest.fn((web3?: Web3) => { return { methods: { hasRegistered: jest.fn((callAddress: string) => { if (callAddress === existingAddress1) { - return { call: jest.fn(() => Promise.resolve(true)) }; + return { call: jest.fn(async () => await Promise.resolve(true)) } } - return { call: jest.fn(() => Promise.resolve(false)) }; + return { call: jest.fn(async () => await Promise.resolve(false)) } }), getUserProfile: jest.fn((callAddress: string) => { if (callAddress === existingAddress1) { return { - call: jest.fn(() => - Promise.resolve({ + call: jest.fn(async () => + await Promise.resolve({ 0: 123, 1: 3000, 2: 2, - 3: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", + 3: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', 4: 555, - 5: true, + 5: true }) - ), - }; + ) + } } - return { call: jest.fn(() => Promise.resolve(null)) }; + return { call: jest.fn(async () => await Promise.resolve(null)) } }), getTeamProfile: jest.fn((teamId: number) => { if (teamId === 2) { return { - call: jest.fn(() => - Promise.resolve({ - 0: "Fearsome Flippers", + call: jest.fn(async () => + await Promise.resolve({ + 0: 'Fearsome Flippers', 2: 77000, 3: 341500, - 4: true, + 4: true }) - ), - }; + ) + } } - return { call: jest.fn(() => Promise.resolve(null)) }; - }), - }, - }; -}); + return { call: jest.fn(async () => await Promise.resolve(null)) } + }) + } + } +}) const getErc721Contract = jest.fn((web3?: Web3) => { return { methods: { tokenURI: jest.fn((tokenId: string) => { return { - call: jest.fn(() => Promise.resolve("ipfs://QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json")), - }; - }), - }, - }; -}); + call: jest.fn(async () => await Promise.resolve('ipfs://QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json')) + } + }) + } + } +}) -module.exports = { getProfileContract, getErc721Contract }; +module.exports = { getProfileContract, getErc721Contract } diff --git a/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts b/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts index 5d3bed7..a90047d 100644 --- a/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts +++ b/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts @@ -1,14 +1,14 @@ -import addresses from "../constants/contracts"; -import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID } from "../constants/common"; -import { getGlassProfileAddress } from "./addressHelpers"; +import addresses from '../constants/contracts' +import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID } from '../constants/common' +import { getGlassProfileAddress } from './addressHelpers' -describe("addressHelpers", () => { - it("getAddress returns correct mainnet address", () => { - const profileAddress = getGlassProfileAddress(MAINNET_CHAIN_ID); - expect(profileAddress).toBe(addresses.dsentrProfile[MAINNET_CHAIN_ID]); - }); - it("getAddress returns correct testnet address", () => { - const profileAddress = getGlassProfileAddress(TESTNET_CHAIN_ID); - expect(profileAddress).toBe(addresses.dsentrProfile[TESTNET_CHAIN_ID]); - }); -}); +describe('addressHelpers', () => { + it('getAddress returns correct mainnet address', () => { + const profileAddress = getGlassProfileAddress(MAINNET_CHAIN_ID) + expect(profileAddress).toBe(addresses[MAINNET_CHAIN_ID]) + }) + it('getAddress returns correct testnet address', () => { + const profileAddress = getGlassProfileAddress(TESTNET_CHAIN_ID) + expect(profileAddress).toBe(addresses[TESTNET_CHAIN_ID]) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts b/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts index bab1265..f27e17e 100644 --- a/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts +++ b/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts @@ -1,10 +1,10 @@ -import addresses from "../constants/contracts"; -import { Address } from "../types"; +import addresses, { ProfileNumber } from '../constants/contracts' +import { Address } from '../types' export const getNftAddress = (nftAddresses: Address, chainId: number): string => { - return nftAddresses[chainId]; -}; + return nftAddresses[chainId].toString() +} -export const getGlassProfileAddress = (chainId: number): string => { - return addresses.dsentrProfile[chainId]; -}; +export const getGlassProfileAddress = (chainId: ProfileNumber): string => { + return addresses[chainId] +} diff --git a/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts b/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts index 70b3ee8..5f5eea3 100644 --- a/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts +++ b/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts @@ -1,94 +1,94 @@ -import { MAINNET_CHAIN_ID, IPFS_GATEWAY } from "../constants/common"; -import web3NoAccount from "./web3"; -import { getIdentifierKeyFromAddress, getTokenUrl, getTokenUriData, getNftByTokenId } from "./collectibles"; -import nfts from "../constants/nfts"; -import { server, rest } from "../mocks/server"; +import { MAINNET_CHAIN_ID, IPFS_GATEWAY } from '../constants/common' +import web3NoAccount from './web3' +import { getIdentifierKeyFromAddress, getTokenUrl, getTokenUriData, getNftByTokenId } from './collectibles' +import nfts from '../constants/nfts' +import { server, rest } from '../mocks/server' -jest.mock("../constants/nfts"); -jest.mock("./contractHelpers"); +jest.mock('../constants/nfts') +jest.mock('./contractHelpers') -const GLASS_NFT_ADDRESS = "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07"; -const MIRROR_NFT_ADDRESS = "0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566"; -const UNKNOWN_NFT_ADDRESS = "0xa111122229E67F2Bc8b33F33e20E915522221111"; -const MOCK_TOKEN_ID = 5; +const GLASS_NFT_ADDRESS = '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07' +const MIRROR_NFT_ADDRESS = '0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566' +const UNKNOWN_NFT_ADDRESS = '0xa111122229E67F2Bc8b33F33e20E915522221111' +const MOCK_TOKEN_ID = 5 -describe("collectibles", () => { - it("getIdentifierKeyFromAddress returns proper identifier key", () => { - const glassIdentifierKey = getIdentifierKeyFromAddress(GLASS_NFT_ADDRESS, MAINNET_CHAIN_ID); - const mirrorIdentifierKey = getIdentifierKeyFromAddress(MIRROR_NFT_ADDRESS, MAINNET_CHAIN_ID); - expect(glassIdentifierKey).toBe("image"); - expect(mirrorIdentifierKey).toBe("otherIdentifier"); - }); +describe('collectibles', () => { + it('getIdentifierKeyFromAddress returns proper identifier key', () => { + const glassIdentifierKey = getIdentifierKeyFromAddress(GLASS_NFT_ADDRESS, MAINNET_CHAIN_ID) + const mirrorIdentifierKey = getIdentifierKeyFromAddress(MIRROR_NFT_ADDRESS, MAINNET_CHAIN_ID) + expect(glassIdentifierKey).toBe('image') + expect(mirrorIdentifierKey).toBe('otherIdentifier') + }) - it("getIdentifierKeyFromAddress returns null for unknown nft", () => { - const identifierKey = getIdentifierKeyFromAddress(UNKNOWN_NFT_ADDRESS, MAINNET_CHAIN_ID); - expect(identifierKey).toBeNull(); - }); + it('getIdentifierKeyFromAddress returns null for unknown nft', () => { + const identifierKey = getIdentifierKeyFromAddress(UNKNOWN_NFT_ADDRESS, MAINNET_CHAIN_ID) + expect(identifierKey).toBeNull() + }) - it("getTokenUrl returns ipfs link if tokenUri is ipfs uri", () => { - const originalUri = "ipfs://example/something.json"; - const tokenUri = getTokenUrl(originalUri); - expect(tokenUri).toBe(`${IPFS_GATEWAY}/ipfs/${originalUri.slice(7)}`); - }); + it('getTokenUrl returns ipfs link if tokenUri is ipfs uri', () => { + const originalUri = 'ipfs://example/something.json' + const tokenUri = getTokenUrl(originalUri) + expect(tokenUri).toBe(`${IPFS_GATEWAY}/ipfs/${originalUri.slice(7)}`) + }) - it("getTokenUrl returns https link if tokenUri is https uri", () => { - const originalUri = "https://example.com/something.json"; - const tokenUri = getTokenUrl(originalUri); - expect(tokenUri).toBe(originalUri); - }); + it('getTokenUrl returns https link if tokenUri is https uri', () => { + const originalUri = 'https://example.com/something.json' + const tokenUri = getTokenUrl(originalUri) + expect(tokenUri).toBe(originalUri) + }) - it("getTokenUriData returns proper response", async () => { - const uriData = await getTokenUriData(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount); + it('getTokenUriData returns proper response', async () => { + const uriData = await getTokenUriData(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount) expect(uriData).toEqual({ - name: "Prism", - description: "Glass works colors", - image: "ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png", + name: 'Prism', + description: 'Glass works colors', + image: 'ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png', attributes: { - shardId: "5", - }, - }); - }); + shardId: '5' + } + }) + }) - it("getTokenUriData returns null if request failed", async () => { + it('getTokenUriData returns null if request failed', async () => { server.use( rest.get( `${IPFS_GATEWAY}/ipfs/QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json`, async (req, res, ctx) => { - return res(ctx.status(500), ctx.json({ message: "500 Internal Server Error" })); + return await res(ctx.status(500), ctx.json({ message: '500 Internal Server Error' })) } ) - ); - const uriData = await getTokenUriData(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount); - expect(uriData).toBeNull(); - }); + ) + const uriData = await getTokenUriData(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount) + expect(uriData).toBeNull() + }) - it("getNftByTokenId returns proper nft", async () => { - const sleepyNft = nfts.find((nft) => nft.identifier === "sleepy"); - const nft = await getNftByTokenId(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID); - expect(nft).toBe(sleepyNft); - }); + it('getNftByTokenId returns proper nft', async () => { + const sleepyNft = nfts.find((nft) => nft.identifier === 'sleepy') + const nft = await getNftByTokenId(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) + expect(nft).toBe(sleepyNft) + }) - it("getNftByTokenId returns null if uriData is null", async () => { + it('getNftByTokenId returns null if uriData is null', async () => { server.use( rest.get( `${IPFS_GATEWAY}/ipfs/QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json`, async (req, res, ctx) => { - return res(ctx.status(500), ctx.json({ message: "500 Internal Server Error" })); + return await res(ctx.status(500), ctx.json({ message: '500 Internal Server Error' })) } ) - ); - const nft = await getNftByTokenId(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID); - expect(nft).toBe(null); - }); + ) + const nft = await getNftByTokenId(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) + expect(nft).toBe(null) + }) - it("getNftByTokenId returns null if identifierKey is null", async () => { - const nft = await getNftByTokenId(UNKNOWN_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID); - expect(nft).toBe(null); - }); + it('getNftByTokenId returns null if identifierKey is null', async () => { + const nft = await getNftByTokenId(UNKNOWN_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) + expect(nft).toBe(null) + }) - it("getNftByTokenId returns null if uriData does not contain indentifierKey", async () => { + it('getNftByTokenId returns null if uriData does not contain indentifierKey', async () => { // In the NFT constant mocks MIXIE NFT type is intentionally given wrong identifier - const nft = await getNftByTokenId(MIRROR_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID); - expect(nft).toBe(null); - }); -}); + const nft = await getNftByTokenId(MIRROR_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) + expect(nft).toBe(null) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/utils/collectibles.ts b/packages/dsentr-profile-sdk/src/utils/collectibles.ts index 24af048..9c27bf1 100644 --- a/packages/dsentr-profile-sdk/src/utils/collectibles.ts +++ b/packages/dsentr-profile-sdk/src/utils/collectibles.ts @@ -1,9 +1,9 @@ -import Web3 from "web3"; -import Nfts, { nftSources } from "../constants/nfts"; -import { IPFS_GATEWAY } from "../constants/common"; -import { Nft, NftUriData } from "../types"; -import { getNftAddress } from "./addressHelpers"; -import { getErc721Contract } from "./contractHelpers"; +import Web3 from 'web3' +import Nfts, { nftSources } from '../constants/nfts' +import { IPFS_GATEWAY } from '../constants/common' +import { Nft, NftUriData } from '../types' +import { getNftAddress } from './addressHelpers' +import { getErc721Contract } from './contractHelpers' /** * Gets the identifier key based on the nft address @@ -11,66 +11,69 @@ import { getErc721Contract } from "./contractHelpers"; */ export const getIdentifierKeyFromAddress = (nftAddress: string, chainId: number): string | null => { const nftSource = Object.values(nftSources).find((nftSourceEntry) => { - const address = getNftAddress(nftSourceEntry.address, chainId); - return address === nftAddress; - }); + const address = getNftAddress(nftSourceEntry.address, chainId) + return address === nftAddress + }) - return nftSource ? nftSource.identifierKey : null; -}; + return (nftSource != null) ? nftSource.identifierKey : null +} /** * Some sources like Pancake do not return HTTP tokenURI's. Same with DSentr/Glass??? */ export const getTokenUrl = (tokenUri: string): string => { - if (tokenUri.startsWith("ipfs://")) { - return `${IPFS_GATEWAY}/ipfs/${tokenUri.slice(7)}`; + if (tokenUri.startsWith('ipfs://')) { + return `${IPFS_GATEWAY}/ipfs/${tokenUri.slice(7)}` } - return tokenUri; -}; + return tokenUri +} export const getTokenUriData = async (nftAddress: string, tokenId: number, web3: Web3): Promise => { try { - const contract = getErc721Contract(nftAddress, web3); - const tokenUri = await contract.methods.tokenURI(tokenId).call(); - const uriDataResponse = await fetch(getTokenUrl(tokenUri)); + const contract = getErc721Contract(nftAddress, web3) + if (contract == null) { + throw new Error('contract is undefined') + } + const tokenUri = await contract.methods.tokenURI(tokenId).call() + const uriDataResponse = await fetch(getTokenUrl(tokenUri)) if (!uriDataResponse.ok) { - return null; + return null } - const uriData: NftUriData = await uriDataResponse.json(); - return uriData; + const uriData: NftUriData = await uriDataResponse.json() + return uriData } catch (error) { - console.error("getTokenUriData", error); - return null; + console.error('getTokenUriData', error) + return null } -}; +} export const getNftByTokenId = async ( nftAddress: string, tokenId: number, web3: Web3, chainId: number -): Promise => { - const uriData = await getTokenUriData(nftAddress, tokenId, web3); - const identifierKey = getIdentifierKeyFromAddress(nftAddress, chainId); +): Promise => { + const uriData: NftUriData | null = await getTokenUriData(nftAddress, tokenId, web3) + const identifierKey = getIdentifierKeyFromAddress(nftAddress, chainId) // Bail out early if we have no uriData, identifierKey, or the value does not // exist in the object - if (!uriData) { - return null; + if (uriData == null) { + return null } - if (!identifierKey) { - return null; + if (identifierKey == null) { + return null } - if (!uriData[identifierKey]) { - return null; + if (uriData[identifierKey] == null) { + return null } return Nfts.find((nft) => { - return uriData[identifierKey].includes(nft.identifier); - }); -}; + return identifierKey === nft.identifier && uriData[identifierKey] + }) +} diff --git a/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts b/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts index 99bb062..b93cbb3 100644 --- a/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts +++ b/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts @@ -1,26 +1,26 @@ -import Web3 from "web3"; -import { MAINNET_CHAIN_ID } from "../constants/common"; -import web3NoAccount from "./web3"; -import { getProfileContract, getErc721Contract } from "./contractHelpers"; +import Web3 from 'web3' +import { MAINNET_CHAIN_ID } from '../constants/common' +import web3NoAccount from './web3' +import { getProfileContract, getErc721Contract } from './contractHelpers' -describe("contractHelpers", () => { - it("getProfileContract returns an instance of Contract", () => { - const profileContract = getProfileContract(web3NoAccount, MAINNET_CHAIN_ID); +describe('contractHelpers', () => { + it('getProfileContract returns an instance of Contract', () => { + const profileContract = getProfileContract(web3NoAccount, MAINNET_CHAIN_ID) // toBeInstanceOf doesn't work very well with third-party libs, read more - https://stackoverflow.com/a/58032069/4614082 - expect(profileContract.constructor.name).toBe("Contract"); - }); - it("getErc721Contract returns an instance of Contract", () => { - const erc721Contract = getErc721Contract("0x7777777777777777777777777777777777777777", web3NoAccount); - expect(erc721Contract.constructor.name).toBe("Contract"); - }); - it("uses provided Web3 instnace", () => { - const httpProvider = new Web3.providers.HttpProvider("https://example.com", { - timeout: 10000, - }); - const customWeb3 = new Web3(httpProvider); - const glassShardContract = getProfileContract(customWeb3, MAINNET_CHAIN_ID); + expect(profileContract.constructor.name).toBe('Contract') + }) + it('getErc721Contract returns an instance of Contract', () => { + const erc721Contract = getErc721Contract('0x7777777777777777777777777777777777777777', web3NoAccount) + expect((erc721Contract != null) ? erc721Contract.constructor.name : '').toBe('Contract') + }) + it('uses provided Web3 instnace', () => { + const httpProvider = new Web3.providers.HttpProvider('https://example.com', { + timeout: 10000 + }) + const customWeb3 = new Web3(httpProvider) + const glassShardContract = getProfileContract(customWeb3, MAINNET_CHAIN_ID) // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - expect(glassShardContract.currentProvider).toBe(httpProvider); - }); -}); + // @ts-expect-error + expect(glassShardContract.currentProvider).toBe(httpProvider) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts b/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts index 2d6f0a5..de704a7 100644 --- a/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts +++ b/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts @@ -1,18 +1,23 @@ -import Web3 from "web3"; -import { AbiItem } from "web3-utils"; -import { Contract } from "web3-eth-contract"; -import erc721Abi from "../abi/erc721.json"; -import profileABI from "../abi/dsentrProfile.json"; -import { getGlassProfileAddress } from "./addressHelpers"; +import Web3 from 'web3' +import { AbiItem } from 'web3-utils' +import { Contract } from 'web3-eth-contract' +import erc721Abi from '../abi/erc721.json' +import profileABI from '../abi/dsentrProfile.json' +import { getGlassProfileAddress } from './addressHelpers' +import { ProfileNumber } from '../constants/contracts' const getContract = (abi: AbiItem, address: string, web3: Web3): Contract => { - return new web3.eth.Contract(abi, address); -}; + return new web3.eth.Contract(abi, address) +} -export const getErc721Contract = (address: string, web3?: Web3): Contract => { - return getContract(erc721Abi as unknown as AbiItem, address, web3); -}; +export const getErc721Contract = (address: string, web3?: Web3): Contract | undefined => { + if (web3 != null) { + return getContract(erc721Abi as unknown as AbiItem, address, web3) + } else { + throw new Error('web3 is undefined') + } +} export const getProfileContract = (web3: Web3, chainId: number): Contract => { - return getContract(profileABI as unknown as AbiItem, getGlassProfileAddress(chainId), web3); -}; + return getContract(profileABI as unknown as AbiItem, getGlassProfileAddress(chainId as ProfileNumber), web3) +} diff --git a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts b/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts index 9f899dd..45b1d2d 100644 --- a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts +++ b/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts @@ -1,16 +1,16 @@ -import getRpcUrl, { nodes } from "./getRpcUrl"; +import getRpcUrl, { nodes } from './getRpcUrl' -describe("getRpcUrl", () => { +describe('getRpcUrl', () => { describe.each` randomRoll | expectedNode ${0.15} | ${nodes[0]} ${0.35} | ${nodes[1]} ${0.75} | ${nodes[2]} - `("$a + $b", ({ randomRoll, expectedNode }) => { - it("returns random node", () => { - jest.spyOn(global.Math, "random").mockReturnValue(randomRoll); - const nodeUrl = getRpcUrl(); - expect(nodeUrl).toEqual(expectedNode); - }); - }); -}); + `('$a + $b', ({ randomRoll, expectedNode }) => { + it('returns random node', () => { + jest.spyOn(global.Math, 'random').mockReturnValue(randomRoll) + const nodeUrl = getRpcUrl() + expect(nodeUrl).toEqual(expectedNode) + }) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts b/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts index f98479d..bf11d1d 100644 --- a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts +++ b/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts @@ -1,19 +1,19 @@ // Array of available nodes to connect to export const nodes = [ - "https://bsc-dataseed1.ninicoin.io", - "https://bsc-dataseed1.defibit.io", - "https://bsc-dataseed.binance.org", -]; + 'https://bsc-dataseed1.ninicoin.io', + 'https://bsc-dataseed1.defibit.io', + 'https://bsc-dataseed.binance.org' +] -const getRandomIndex = () => { - const lower = 0; - const upper = nodes.length - 1; - return Math.floor(lower + Math.random() * (upper - lower + 1)); -}; +const getRandomIndex = (): number => { + const lower = 0 + const upper = nodes.length - 1 + return Math.floor(lower + Math.random() * (upper - lower + 1)) +} const getNodeUrl = (): string => { - const randomIndex = getRandomIndex(); - return nodes[randomIndex]; -}; + const randomIndex = getRandomIndex() + return nodes[randomIndex] +} -export default getNodeUrl; +export default getNodeUrl diff --git a/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts b/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts index 00c77e6..433e765 100644 --- a/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts +++ b/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts @@ -2,83 +2,83 @@ import { transformProfileResponse, getAchievementTitle, getAchievementDescription, - ProfileResponse, -} from "./transformHelpers"; -import { Campaign } from "../types"; + ProfileResponse +} from './transformHelpers' +import { Campaign } from '../types' -describe("transformHelpers", () => { - it("transformProfileResponse returns correct profile data", () => { +describe('transformHelpers', () => { + it('transformProfileResponse returns correct profile data', () => { const rawProfileResponse: ProfileResponse = { - 0: "123", - 1: "500", - 2: "2", - 3: "0x12345", - 4: "15", - 5: true, - }; - const profile = transformProfileResponse(rawProfileResponse); + 0: '123', + 1: '500', + 2: '2', + 3: '0x12345', + 4: '15', + 5: true + } + const profile = transformProfileResponse(rawProfileResponse) expect(profile).toEqual({ userId: 123, points: 500, teamId: 2, tokenId: 15, - nftAddress: "0x12345", - isActive: true, - }); - }); + nftAddress: '0x12345', + isActive: true + }) + }) - describe("getAchievementTitle", () => { - it("returns correct title for IFO", () => { + describe('getAchievementTitle', () => { + it('returns correct title for IFO', () => { const campaign: Campaign = { - id: "55666", - type: "ifo", - title: "Belt", - }; - const title = getAchievementTitle(campaign); + id: '55666', + type: 'ifo', + title: 'Belt' + } + const title = getAchievementTitle(campaign) expect(title).toEqual({ id: 999, - fallback: "IFO Shopper: Belt", + fallback: 'IFO Shopper: Belt', data: { - name: "Belt", - }, - }); - }); - it("returns default title for other campaign types", () => { + name: 'Belt' + } + }) + }) + it('returns default title for other campaign types', () => { const campaign: Campaign = { - id: "55666", - type: "teambattle", - title: "Easter Gold", - }; - const title = getAchievementTitle(campaign); - expect(title).toBe("Easter Gold"); - }); - }); + id: '55666', + type: 'teambattle', + title: 'Easter Gold' + } + const title = getAchievementTitle(campaign) + expect(title).toBe('Easter Gold') + }) + }) - describe("getAchievementDescription", () => { - it("returns correct description for IFO", () => { + describe('getAchievementDescription', () => { + it('returns correct description for IFO', () => { const campaign: Campaign = { - id: "55666", - type: "ifo", - title: "Belt", - }; - const description = getAchievementDescription(campaign); + id: '55666', + type: 'ifo', + title: 'Belt' + } + const description = getAchievementDescription(campaign) expect(description).toEqual({ id: 999, - fallback: "Committed more than $5 worth of LP in the Belt IFO", + fallback: 'Committed more than $5 worth of LP in the Belt IFO', data: { - name: "Belt", - }, - }); - }); - it("returns default description for other campaign types", () => { + name: 'Belt' + } + }) + }) + it('returns default description for other campaign types', () => { const campaign: Campaign = { - id: "55666", - type: "teambattle", - title: "Easter Gold", - description: "Random description", - }; - const description = getAchievementDescription(campaign); - expect(description).toBe("Random description"); - }); - }); -}); + id: '55666', + type: 'teambattle', + title: 'Easter Gold', + description: 'Random description' + } + const description = getAchievementDescription(campaign) + expect(description).toBe('Random description') + }) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts b/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts index 60894af..d83e107 100644 --- a/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts +++ b/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts @@ -1,16 +1,16 @@ -import { Campaign, TranslatableText, Profile } from "../types"; +import { Campaign, TranslatableText, Profile } from '../types' -export type ProfileResponse = { - 0: string; - 1: string; - 2: string; - 3: string; - 4: string; - 5: boolean; -}; +export interface ProfileResponse { + 0: string + 1: string + 2: string + 3: string + 4: string + 5: boolean +} export const transformProfileResponse = (profileResponse: ProfileResponse): Partial => { - const { 0: userId, 1: numberPoints, 2: teamId, 3: nftAddress, 4: tokenId, 5: isActive } = profileResponse; + const { 0: userId, 1: numberPoints, 2: teamId, 3: nftAddress, 4: tokenId, 5: isActive } = profileResponse return { userId: Number(userId), @@ -18,36 +18,36 @@ export const transformProfileResponse = (profileResponse: ProfileResponse): Part teamId: Number(teamId), tokenId: Number(tokenId), nftAddress, - isActive, - }; -}; + isActive + } +} -export const getAchievementTitle = (campaign: Campaign): TranslatableText => { +export const getAchievementTitle = (campaign: Campaign): TranslatableText | undefined => { switch (campaign.type) { - case "ifo": + case 'ifo': return { id: 999, - fallback: `IFO Shopper: ${campaign.title}`, + fallback: `IFO Shopper: ${campaign.title?.toString() ?? ''}`, data: { - name: campaign.title as string, - }, - }; + name: campaign.title as string + } + } default: - return campaign.title; + return campaign.title ?? '' } -}; +} -export const getAchievementDescription = (campaign: Campaign): TranslatableText => { +export const getAchievementDescription = (campaign: Campaign): TranslatableText | undefined => { switch (campaign.type) { - case "ifo": + case 'ifo': return { id: 999, - fallback: `Committed more than $5 worth of LP in the ${campaign.title} IFO`, + fallback: `Committed more than $5 worth of LP in the ${campaign.title?.toString() ?? ''} IFO`, data: { - name: campaign.title as string, - }, - }; + name: campaign.title as string + } + } default: - return campaign.description; + return campaign.description ?? '' } -}; +} diff --git a/packages/dsentr-profile-sdk/src/utils/web3.test.ts b/packages/dsentr-profile-sdk/src/utils/web3.test.ts index 8374ca3..9dcfb90 100644 --- a/packages/dsentr-profile-sdk/src/utils/web3.test.ts +++ b/packages/dsentr-profile-sdk/src/utils/web3.test.ts @@ -1,8 +1,8 @@ -import Web3 from "web3"; -import web3NoAccount from "./web3"; +import Web3 from 'web3' +import web3NoAccount from './web3' -describe("web3", () => { - it("returns an instance of Web3", () => { - expect(web3NoAccount).toBeInstanceOf(Web3); - }); -}); +describe('web3', () => { + it('returns an instance of Web3', () => { + expect(web3NoAccount).toBeInstanceOf(Web3) + }) +}) diff --git a/packages/dsentr-profile-sdk/src/utils/web3.ts b/packages/dsentr-profile-sdk/src/utils/web3.ts index 3282ce2..872179f 100644 --- a/packages/dsentr-profile-sdk/src/utils/web3.ts +++ b/packages/dsentr-profile-sdk/src/utils/web3.ts @@ -1,10 +1,10 @@ -import Web3 from "web3"; -import getRpcUrl from "./getRpcUrl"; +import Web3 from 'web3' +import getRpcUrl from './getRpcUrl' -const RPC_URL = getRpcUrl(); +const RPC_URL = getRpcUrl() const httpProvider = new Web3.providers.HttpProvider(RPC_URL, { - timeout: 10000, -}); -const web3NoAccount = new Web3(httpProvider); + timeout: 10000 +}) +const web3NoAccount = new Web3(httpProvider) -export default web3NoAccount; +export default web3NoAccount diff --git a/packages/dsentr-profile-sdk/tsconfig.json b/packages/dsentr-profile-sdk/tsconfig.json index 878d0b6..8e19a59 100644 --- a/packages/dsentr-profile-sdk/tsconfig.json +++ b/packages/dsentr-profile-sdk/tsconfig.json @@ -5,8 +5,11 @@ "lib": ["ES2020", "DOM"], "target": "ES5", "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "strict": true, + "types": ["jest"], + "typeRoots": ["../../node_modules/@types", "node_modules/@types"] }, - "include": ["src/**/*.ts"], - "exclude": ["src/**/*.test.ts", "**/__mocks__/*", "src/mocks/**", "jest.setup.js"] + "include": ["src", "."], + "exclude": ["node_modules", "../../node_modules", "dist"] } From 823c334385f95c70a3ea31f237773da0df4362d4 Mon Sep 17 00:00:00 2001 From: "Jason R. Sadler" Date: Fri, 9 Jul 2021 10:18:40 -0400 Subject: [PATCH 2/4] build: Remove profile-sdks --- packages/dsentr-profile-sdk/README.md | 223 ------ packages/dsentr-profile-sdk/babel.config.js | 11 - packages/dsentr-profile-sdk/jest.config.js | 10 - packages/dsentr-profile-sdk/jest.setup.js | 12 - packages/dsentr-profile-sdk/package.json | 51 -- packages/dsentr-profile-sdk/rollup.config.js | 16 - .../src/abi/dsentrProfile.json | 717 ------------------ .../dsentr-profile-sdk/src/abi/erc721.json | 191 ----- .../src/constants/__mocks__/nfts.ts | 71 -- .../src/constants/campaigns.ts | 169 ----- .../src/constants/common.ts | 7 - .../src/constants/contracts.ts | 9 - .../dsentr-profile-sdk/src/constants/nfts.ts | 308 -------- .../dsentr-profile-sdk/src/constants/teams.ts | 54 -- .../src/images/chaotic-cakers-alt.png | Bin 1942 -> 0 bytes .../src/images/chaotic-cakers-bg.svg | 1 - .../src/images/chaotic-cakers-lg.png | Bin 24506 -> 0 bytes .../src/images/chaotic-cakers-md.png | Bin 7042 -> 0 bytes .../src/images/chaotic-cakers-sm.png | Bin 1687 -> 0 bytes .../src/images/fearsome-flippers-alt.png | Bin 2095 -> 0 bytes .../src/images/fearsome-flippers-bg.svg | 1 - .../src/images/fearsome-flippers-lg.png | Bin 72285 -> 0 bytes .../src/images/fearsome-flippers-md.png | Bin 7000 -> 0 bytes .../src/images/fearsome-flippers-sm.png | Bin 1757 -> 0 bytes .../dsentr-profile-sdk/src/images/images.d.ts | 2 - .../dsentr-profile-sdk/src/images/index.ts | 17 - .../src/images/syrup-storm-alt.png | Bin 2034 -> 0 bytes .../src/images/syrup-storm-bg.svg | 1 - .../src/images/syrup-storm-lg.png | Bin 80266 -> 0 bytes .../src/images/syrup-storm-md.png | Bin 7294 -> 0 bytes .../src/images/syrup-storm-sm.png | Bin 1641 -> 0 bytes packages/dsentr-profile-sdk/src/index.ts | 5 - .../dsentr-profile-sdk/src/mocks/handlers.ts | 77 -- .../src/mocks/mockAddresses.ts | 3 - .../dsentr-profile-sdk/src/mocks/server.ts | 9 - .../src/profile-sdk.test.ts | 187 ----- .../dsentr-profile-sdk/src/profile-sdk.ts | 208 ----- packages/dsentr-profile-sdk/src/types.ts | 129 ---- .../src/utils/__mocks__/contractHelpers.ts | 62 -- .../src/utils/addressHelpers.test.ts | 14 - .../src/utils/addressHelpers.ts | 10 - .../src/utils/collectibles.test.ts | 94 --- .../src/utils/collectibles.ts | 79 -- .../src/utils/contractHelpers.test.ts | 26 - .../src/utils/contractHelpers.ts | 23 - .../src/utils/getRpcUrl.test.ts | 16 - .../dsentr-profile-sdk/src/utils/getRpcUrl.ts | 19 - .../src/utils/transformHelpers.test.ts | 84 -- .../src/utils/transformHelpers.ts | 53 -- .../dsentr-profile-sdk/src/utils/web3.test.ts | 8 - packages/dsentr-profile-sdk/src/utils/web3.ts | 10 - packages/dsentr-profile-sdk/tsconfig.json | 15 - 52 files changed, 3002 deletions(-) delete mode 100644 packages/dsentr-profile-sdk/README.md delete mode 100644 packages/dsentr-profile-sdk/babel.config.js delete mode 100644 packages/dsentr-profile-sdk/jest.config.js delete mode 100644 packages/dsentr-profile-sdk/jest.setup.js delete mode 100644 packages/dsentr-profile-sdk/package.json delete mode 100644 packages/dsentr-profile-sdk/rollup.config.js delete mode 100644 packages/dsentr-profile-sdk/src/abi/dsentrProfile.json delete mode 100644 packages/dsentr-profile-sdk/src/abi/erc721.json delete mode 100644 packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts delete mode 100644 packages/dsentr-profile-sdk/src/constants/campaigns.ts delete mode 100644 packages/dsentr-profile-sdk/src/constants/common.ts delete mode 100644 packages/dsentr-profile-sdk/src/constants/contracts.ts delete mode 100644 packages/dsentr-profile-sdk/src/constants/nfts.ts delete mode 100644 packages/dsentr-profile-sdk/src/constants/teams.ts delete mode 100644 packages/dsentr-profile-sdk/src/images/chaotic-cakers-alt.png delete mode 100644 packages/dsentr-profile-sdk/src/images/chaotic-cakers-bg.svg delete mode 100644 packages/dsentr-profile-sdk/src/images/chaotic-cakers-lg.png delete mode 100644 packages/dsentr-profile-sdk/src/images/chaotic-cakers-md.png delete mode 100644 packages/dsentr-profile-sdk/src/images/chaotic-cakers-sm.png delete mode 100644 packages/dsentr-profile-sdk/src/images/fearsome-flippers-alt.png delete mode 100644 packages/dsentr-profile-sdk/src/images/fearsome-flippers-bg.svg delete mode 100644 packages/dsentr-profile-sdk/src/images/fearsome-flippers-lg.png delete mode 100644 packages/dsentr-profile-sdk/src/images/fearsome-flippers-md.png delete mode 100644 packages/dsentr-profile-sdk/src/images/fearsome-flippers-sm.png delete mode 100644 packages/dsentr-profile-sdk/src/images/images.d.ts delete mode 100644 packages/dsentr-profile-sdk/src/images/index.ts delete mode 100644 packages/dsentr-profile-sdk/src/images/syrup-storm-alt.png delete mode 100644 packages/dsentr-profile-sdk/src/images/syrup-storm-bg.svg delete mode 100644 packages/dsentr-profile-sdk/src/images/syrup-storm-lg.png delete mode 100644 packages/dsentr-profile-sdk/src/images/syrup-storm-md.png delete mode 100644 packages/dsentr-profile-sdk/src/images/syrup-storm-sm.png delete mode 100644 packages/dsentr-profile-sdk/src/index.ts delete mode 100644 packages/dsentr-profile-sdk/src/mocks/handlers.ts delete mode 100644 packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts delete mode 100644 packages/dsentr-profile-sdk/src/mocks/server.ts delete mode 100644 packages/dsentr-profile-sdk/src/profile-sdk.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/profile-sdk.ts delete mode 100644 packages/dsentr-profile-sdk/src/types.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/addressHelpers.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/collectibles.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/collectibles.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/contractHelpers.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/transformHelpers.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/web3.test.ts delete mode 100644 packages/dsentr-profile-sdk/src/utils/web3.ts delete mode 100644 packages/dsentr-profile-sdk/tsconfig.json diff --git a/packages/dsentr-profile-sdk/README.md b/packages/dsentr-profile-sdk/README.md deleted file mode 100644 index 10be18c..0000000 --- a/packages/dsentr-profile-sdk/README.md +++ /dev/null @@ -1,223 +0,0 @@ -# DSentr Profile SDK - -This package provides some handy functions to retrieve data for DSentr Profile system. - -If you're looking for React-ready solution - take a look at the [profile-hook](https://github.com/dsentr-glass/dsentr-toolkit/tree/master/packages/dsentr-profile-hook). - -##### Table of Contents - -- [Installation](#installation) -- [Usage](#usage) - - [Initialization](#initialization) - - [getUsername](#getUsername) - - [getTeam](#getTeam) - - [getProfile](#getProfile) - - [getAchievements](#getAchievements) -- [Roadmap](#roadmap) - -## Installation - -Install `@dsentr/profile-sdk` into your project with npm: - -```bash -npm install @dsentr/profile-sdk --save -``` - -or yarn: - -```bash -yarn add @dsentr/profile-sdk -``` - -This package requires `web3` to be installed in your project. If you're using TypeScript you also should install `web3-eth-contract` and `web3-utils` to avoid type errors, although depending on your TypeScript and ESlint configuration you might skip installing those (since they are sub-packages of web3). - -```bash -# npm -npm install web3 --save -# yarn -yarn add web3 -``` - -## Usage - -### Initialization - -First set is to initialize the SDK with the following: - -```js -import DSentrProfileSdk from "@dsentr/profile-sdk"; - -const dsentrSdk = new DSentrProfileSdk(); -``` - -You can pass optional arguments to the constructor: - -- `web3` - custom web3 instance if you want to use web3 instance with custom configuration, if not provided defaults to the following configuration: - - HTTP provider with timeout of 10 seconds - - a random node is chosen on initialization from the [list of RPC nodes](src/utils/getRpcUrl.ts) - - the rest of the configuration is default Web3 -- `chainId` - what chain ID to use, if not provided defaults to `56` - -```js -import DSentrProfileSdk from "@dsentr/profile-sdk"; -import Web3 from "web3"; - -const httpProvider = new Web3.providers.HttpProvider("https://mycustomnode.com", { - timeout: 5000, -}); -const myWeb3 = new Web3(httpProvider); - -const dsentrSdk = new DSentrProfileSdk(myWeb3, 97); -``` - -### getUsername - -Returns username for a given address. If the address does not have a profile or there is an error - returns empty string `""`. - -```js -import DSentrProfileSdk from "@dsentr/profile-sdk"; - -const dsentrSdk = new DSentrProfileSdk(); -const username = dsentrSdk.getUsername("0x123456789"); -console.log(username); // "Matatabi" -``` - -### getTeam - -Returns team information for the team ID. In case of network error returns null. Note that at the moment `points` will return `0` for all teams (total team points will be calculated soon). - -```js -import DSentrProfileSdk from "@dsentr/profile-sdk"; - -const dsentrSdk = new DSentrProfileSdk(); -const team = dsentrSdk.getTeam(1); -console.log(team); -// { -// id: 1, -// name: "Syrup Storm", -// description: "The storm's a-comin! Watch out! These bulls are stampeding in a syrupy surge!", -// isJoinable: true, -// users: 55123; -// points: 182500; -// images: images: { -// lg: "syrup-storm-lg.png", -// md: "syrup-storm-md.png", -// sm: "syrup-storm-sm.png", -// alt: "syrup-storm-alt.png", -// ipfs: "https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/syrup-storm.png", -// }, -// background: syrup-storm-bg.svg; -// textColor: "#191326"; -// } -``` - -### getProfile - -Returns full profile data for a given address. Under the hood retrieves username and team data using `getUsername` and `getTeam` and combines it with data from the profile contract. If address does not have a profile - returns `{ hasRegistered: false, profile: null }`. At the moment does not retrieve achievements (see [getAchievements](#getAchievements)). - -It also sets `profile_${address}` cookie containing username and avatar (now only for dsentr.com domain, maybe configurable in future versions) - -```js -import DSentrProfileSdk from "@dsentr/profile-sdk"; - -const dsentrSdk = new DSentrProfileSdk(); -const profile = dsentrSdk.getProfile("0x123456789"); -console.log(profile); -// { -// hasRegistered: true -// profile: { -// userId: 6173, -// points: 2500, -// teamId: 1, -// nftAddress: "0x11111111", -// tokenId: 15, -// isActive: true, -// username: "Matatabi", -// nft: { -// name: "Glass", -// description: "Oopsie daisy! Glass's had a bit of an accident. Poor little fella.", -// images: { -// lg: "glass-lg.png", -// md: "glass-md.png", -// sm: "glass-sm.png", -// ipfs: "https://gateway.pinata.cloud/ipfs/QmQ6EE6gkVzAQUdQLLM7CyrnME6LZHCoy92ZERW8HXmyjw/glass.png", -// }, -// sortOrder: 999, -// identifier: 'glass' -// type: 'dsentr', -// variationId: 10 -// }, -// team: { -// id: 1, -// name: "Syrup Storm", -// description: "The storm's a-comin! Watch out! These bulls are stampeding in a syrupy surge!", -// isJoinable: true, -// users: 55123, -// points: 182500, -// images: images: { -// lg: "syrup-storm-lg.png", -// md: "syrup-storm-md.png", -// sm: "syrup-storm-sm.png", -// alt: "syrup-storm-alt.png", -// ipfs: "https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG sy rup-storm.png", -// }, -// background: syrup-storm-bg.svg, -// textColor: "#191326" -// }, -// hasRegistered: true -// } -// } -``` - -### getAchievements - -Returns array of achievements for a given address. If address has no achievements or no profile at all - returns empty array `[]`. - -```js -import DSentrProfileSdk from "@dsentr/profile-sdk"; - -const dsentrSdk = new DSentrProfileSdk(); - -const achievements = dsentrSdk.getAchievements("0x123456789"); -console.log(achievements); -// [ -// { -// id: "511080000", -// type: "ifo", -// address: "0x123456789", -// title: { -// id: 999, -// fallback: `IFO Shopper: Belt`, -// data: { -// name: "Belt", -// }, -// }, -// description: { -// id: 999, -// fallback: `Committed more than $5 worth of LP in the Belt IFO`, -// data: { -// name: "Belt", -// }, -// }, -// badge: "ifo-belt.svg", -// points: 200, -// }, -// { -// id: "512010010", -// type: "teambattle", -// address: "0x123456789", -// title: "Easter Participant: Silver", -// badge: "easter-participant-silver.svg", -// points: 500, -// }, -// ]; -``` - -## Roadmap - -Current version of this SDK is 90% copy of existing from [pancake-frontend](https://github.com/pancakeswap/pancake-frontend [soon to be here at dsentr-frontend]) repo. There are several improvements to be made in the future versions of this SDK: - -- [ ] Better error handling (common bad status codes or broken internet connection) -- [ ] Allow username & avatar cookie to be configurable or optional -- [ ] Validate addresses with regex and don't attempt to fetch data if address is not valid -- [ ] NodeJS support. Currently it works out of the box only in browser. Need to research different options for cross-fetch and choose the one that provides less friction and increases bundle size the least. diff --git a/packages/dsentr-profile-sdk/babel.config.js b/packages/dsentr-profile-sdk/babel.config.js deleted file mode 100644 index b90969c..0000000 --- a/packages/dsentr-profile-sdk/babel.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - presets: [ - ['@babel/preset-env', { targets: { node: 'current' } }], - '@babel/preset-typescript' - ], - plugins: [ - '@babel/plugin-proposal-private-property-in-object', { - loose: true - } - ] -} diff --git a/packages/dsentr-profile-sdk/jest.config.js b/packages/dsentr-profile-sdk/jest.config.js deleted file mode 100644 index 2431a65..0000000 --- a/packages/dsentr-profile-sdk/jest.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - transform: { - '^.+\\.(ts|tsx)?$': 'ts-jest', - '^.+\\.(js|jsx)$': 'babel-jest' - }, - setupFilesAfterEnv: ['./jest.setup.js'], - collectCoverageFrom: ['**/*.ts', '!./src/index.ts', '!**/node_modules/**', '!**/dist/**'] -} diff --git a/packages/dsentr-profile-sdk/jest.setup.js b/packages/dsentr-profile-sdk/jest.setup.js deleted file mode 100644 index 7f53c90..0000000 --- a/packages/dsentr-profile-sdk/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -// This ensures you can use `window.fetch()` in Jest tests. -import fetch from 'node-fetch' -import { server } from './src/mocks/server' - -global.fetch = fetch -// Establish API mocking before all tests. -beforeAll(() => server.listen()) -// Reset any request handlers that we may add during the tests, -// so they don't affect other tests. -afterEach(() => server.resetHandlers()) -// Clean up after the tests are finished. -afterAll(() => server.close()) diff --git a/packages/dsentr-profile-sdk/package.json b/packages/dsentr-profile-sdk/package.json deleted file mode 100644 index 9568372..0000000 --- a/packages/dsentr-profile-sdk/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@dsentr/profile-sdk", - "version": "0.0.1", - "main": "dist/index.cjs.js", - "module": "dist/index.esm.js", - "types": "dist/index.d.ts", - "license": "MIT", - "repository": "https://github.com/dsentr-glass/dsentr-toolkit/tree/master/packages/dsentr-profile-sdk", - "scripts": { - "build": "rm -rf ./dist && rollup -c && tsc -d --emitDeclarationOnly --declarationDir dist", - "start": "yarn build && node ./dist", - "test": "jest -t", - "test:coverage": "jest -t --collectCoverage", - "lint": "ts-standard --fix | snazzy" - }, - "devDependencies": { - "@babel/preset-env": "^7.13.15", - "@babel/preset-typescript": "^7.13.0", - "@rollup/plugin-commonjs": "^18.0.0", - "@rollup/plugin-image": "^2.0.6", - "@rollup/plugin-node-resolve": "^11.2.1", - "@types/jest": "^26.0.22", - "@types/node": "^14.14.39", - "babel-jest": "^26.6.3", - "graphql": "^15.5.0", - "graphql-request": "^3.4.0", - "jest": "^26.6.3", - "msw": "^0.28.1", - "node-fetch": "^2.6.1", - "ts-jest": "^26.5.6", - "web3": "^1.3.5", - "web3-eth-contract": "^1.3.5", - "web3-utils": "^1.3.5" - }, - "peerDependencies": { - "graphql": "^15.5.0", - "graphql-request": "^3.4.0", - "web3": ">=1.3.5", - "web3-eth-contract": "=>1.3.5", - "web3-utils": ">=1.3.5" - }, - "dependencies": { - "@types/js-cookie": "^2.2.6", - "js-cookie": "^2.2.1" - }, - "ts-standard": { - "ignore": [ - "dist" - ] - } -} diff --git a/packages/dsentr-profile-sdk/rollup.config.js b/packages/dsentr-profile-sdk/rollup.config.js deleted file mode 100644 index 6e4527b..0000000 --- a/packages/dsentr-profile-sdk/rollup.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import typescript from '@rollup/plugin-typescript' -import json from '@rollup/plugin-json' -import { nodeResolve } from '@rollup/plugin-node-resolve' -import commonjs from '@rollup/plugin-commonjs' -import image from '@rollup/plugin-image' -import pkg from './package.json' - -export default { - input: 'src/index.ts', - output: [ - { file: pkg.main, format: 'cjs' }, - { file: pkg.module, format: 'es' } - ], - plugins: [nodeResolve({ preferBuiltins: true }), json(), commonjs(), typescript(), image()], - external: ['web3', 'web3-eth-contract', 'web3-utils', 'graphql', 'graphql-request'] -} diff --git a/packages/dsentr-profile-sdk/src/abi/dsentrProfile.json b/packages/dsentr-profile-sdk/src/abi/dsentrProfile.json deleted file mode 100644 index 8863a27..0000000 --- a/packages/dsentr-profile-sdk/src/abi/dsentrProfile.json +++ /dev/null @@ -1,717 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract IBEP20", - "name": "_cakeToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_numberCakeToReactivate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_numberCakeToRegister", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_numberCakeToUpdate", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "teamId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "teamName", - "type": "string" - } - ], - "name": "TeamAdd", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "teamId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "numberPoints", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "campaignId", - "type": "uint256" - } - ], - "name": "TeamPointIncrease", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "oldTeamId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newTeamId", - "type": "uint256" - } - ], - "name": "UserChangeTeam", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "teamId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "nftAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "UserNew", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "teamId", - "type": "uint256" - } - ], - "name": "UserPause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "numberPoints", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "campaignId", - "type": "uint256" - } - ], - "name": "UserPointIncrease", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "userAddresses", - "type": "address[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "numberPoints", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "campaignId", - "type": "uint256" - } - ], - "name": "UserPointIncreaseMultiple", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "teamId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "nftAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "UserReactivate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "nftAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "UserUpdate", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "NFT_ROLE", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "POINT_ROLE", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SPECIAL_ROLE", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_nftAddress", "type": "address" } - ], - "name": "addNftAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "_teamName", "type": "string" }, - { "internalType": "string", "name": "_teamDescription", "type": "string" } - ], - "name": "addTeam", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cakeToken", - "outputs": [ - { "internalType": "contract IBEP20", "name": "", "type": "address" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_userAddress", "type": "address" }, - { "internalType": "uint256", "name": "_newTeamId", "type": "uint256" } - ], - "name": "changeTeam", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "name": "claimFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" }, - { "internalType": "address", "name": "_nftAddress", "type": "address" }, - { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } - ], - "name": "createProfile", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" } - ], - "name": "getRoleAdmin", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "name": "getRoleMember", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" } - ], - "name": "getRoleMemberCount", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" } - ], - "name": "getTeamProfile", - "outputs": [ - { "internalType": "string", "name": "", "type": "string" }, - { "internalType": "string", "name": "", "type": "string" }, - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "bool", "name": "", "type": "bool" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_userAddress", "type": "address" } - ], - "name": "getUserProfile", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "bool", "name": "", "type": "bool" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "hasRegistered", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "hasRole", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" }, - { "internalType": "uint256", "name": "_numberPoints", "type": "uint256" }, - { "internalType": "uint256", "name": "_campaignId", "type": "uint256" } - ], - "name": "increaseTeamPoints", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_userAddress", "type": "address" }, - { "internalType": "uint256", "name": "_numberPoints", "type": "uint256" }, - { "internalType": "uint256", "name": "_campaignId", "type": "uint256" } - ], - "name": "increaseUserPoints", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_userAddresses", - "type": "address[]" - }, - { "internalType": "uint256", "name": "_numberPoints", "type": "uint256" }, - { "internalType": "uint256", "name": "_campaignId", "type": "uint256" } - ], - "name": "increaseUserPointsMultiple", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" } - ], - "name": "makeTeamJoinable", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" } - ], - "name": "makeTeamNotJoinable", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "numberActiveProfiles", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "numberCakeToReactivate", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "numberCakeToRegister", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "numberCakeToUpdate", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "numberTeams", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "bytes", "name": "", "type": "bytes" } - ], - "name": "onERC721Received", - "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "pauseProfile", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_nftAddress", "type": "address" }, - { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } - ], - "name": "reactivateProfile", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" }, - { "internalType": "uint256", "name": "_numberPoints", "type": "uint256" } - ], - "name": "removeTeamPoints", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_userAddress", "type": "address" }, - { "internalType": "uint256", "name": "_numberPoints", "type": "uint256" } - ], - "name": "removeUserPoints", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_userAddresses", - "type": "address[]" - }, - { "internalType": "uint256", "name": "_numberPoints", "type": "uint256" } - ], - "name": "removeUserPointsMultiple", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_teamId", "type": "uint256" }, - { "internalType": "string", "name": "_teamName", "type": "string" }, - { "internalType": "string", "name": "_teamDescription", "type": "string" } - ], - "name": "renameTeam", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_newNumberCakeToReactivate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_newNumberCakeToRegister", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_newNumberCakeToUpdate", - "type": "uint256" - } - ], - "name": "updateNumberCake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_nftAddress", "type": "address" }, - { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } - ], - "name": "updateProfile", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/dsentr-profile-sdk/src/abi/erc721.json b/packages/dsentr-profile-sdk/src/abi/erc721.json deleted file mode 100644 index 7880dcb..0000000 --- a/packages/dsentr-profile-sdk/src/abi/erc721.json +++ /dev/null @@ -1,191 +0,0 @@ -[ - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [{ "name": "_name", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_tokenId", "type": "uint256" }], - "name": "getApproved", - "outputs": [{ "name": "_approved", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_to", "type": "address" }, - { "name": "_tokenId", "type": "uint256" } - ], - "name": "approve", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "implementsERC721", - "outputs": [{ "name": "_implementsERC721", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [{ "name": "_totalSupply", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_from", "type": "address" }, - { "name": "_to", "type": "address" }, - { "name": "_tokenId", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "_owner", "type": "address" }, - { "name": "_index", "type": "uint256" } - ], - "name": "tokenOfOwnerByIndex", - "outputs": [{ "name": "_tokenId", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_tokenId", "type": "uint256" }], - "name": "ownerOf", - "outputs": [{ "name": "_owner", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_tokenId", "type": "uint256" }], - "name": "tokenMetadata", - "outputs": [{ "name": "_infoUrl", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_owner", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "name": "_balance", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_owner", "type": "address" }, - { "name": "_tokenId", "type": "uint256" }, - { "name": "_approvedAddress", "type": "address" }, - { "name": "_metadata", "type": "string" } - ], - "name": "mint", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [{ "name": "_symbol", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_to", "type": "address" }, - { "name": "_tokenId", "type": "uint256" } - ], - "name": "transfer", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "numTokensTotal", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "_owner", "type": "address" }], - "name": "getOwnerTokens", - "outputs": [{ "name": "_tokenIds", "type": "uint256[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "_to", "type": "address" }, - { "indexed": true, "name": "_tokenId", "type": "uint256" } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "_from", "type": "address" }, - { "indexed": true, "name": "_to", "type": "address" }, - { "indexed": false, "name": "_tokenId", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "_owner", "type": "address" }, - { "indexed": true, "name": "_approved", "type": "address" }, - { "indexed": false, "name": "_tokenId", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "inputs": [{ "internalType": "uint256", "name": "tokenId", "type": "uint256" }], - "name": "tokenURI", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts b/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts deleted file mode 100644 index d98e65d..0000000 --- a/packages/dsentr-profile-sdk/src/constants/__mocks__/nfts.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Nft, NftSource, NftType } from '../../types' -import { IPFS_GATEWAY } from '../common' - -// This mock file is needed to properly test different NFT types -// and also not rely in tests on any value changes in the future - -export const nftSources: NftSource = { - [NftType.GLASS]: { - address: { - 56: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', - 97: '0x60935F36e4631F73f0f407e68642144e07aC7f5E' - }, - identifierKey: 'image' - }, - [NftType.MIRROR]: { - address: { - 56: '0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566', - 97: '' - }, - identifierKey: 'otherIdentifier' - } -} - -const Nfts: Nft[] = [ - { - name: 'Mirror v1', - description: 'Looking back at you looking back at me...', - images: { - lg: 'mirror-1-lg.png', - md: 'mirror-1-md.png', - sm: 'mirror-1-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Mirror.png` - }, - sortOrder: 999, - identifier: '001-Mirror', - type: NftType.MIRROR, - variationId: 1 - }, - { - name: 'Prism', - description: 'Glass works colors', - images: { - lg: 'prism-lg.png', - md: 'prism-md.png', - sm: 'prism-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png`, - blur: 'prism-blur.png' - }, - sortOrder: 999, - identifier: 'prism', - type: NftType.GLASS, - variationId: 5 - }, - { - name: 'Streak', - description: "You'll know us when you see...", - images: { - lg: 'streak-lg.png', - md: 'streak-md.png', - sm: 'streak-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/streak.png`, - blur: 'streak-blur.png' - }, - sortOrder: 999, - identifier: 'streak', - type: NftType.GLASS, - variationId: 0 - } -] - -export default Nfts diff --git a/packages/dsentr-profile-sdk/src/constants/campaigns.ts b/packages/dsentr-profile-sdk/src/constants/campaigns.ts deleted file mode 100644 index fb68b2d..0000000 --- a/packages/dsentr-profile-sdk/src/constants/campaigns.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { Campaign } from '../types' - -/** - * id: The campaign id (required) - * type: The type of the achievement - * title: A string or an object to be translated. - * Note: If the value is a string it is likely used as data in a translation object - * - * badge: Achievement avatar - */ - -const campaigns: Campaign[] = [ - { - id: '511090000', - type: 'ifo', - title: 'Horizon Protocol', - badge: 'ifo-hzn.svg' - }, - { - id: '511080000', - type: 'ifo', - title: 'Belt', - badge: 'ifo-belt.svg' - }, - { - id: '511070000', - type: 'ifo', - title: 'Yieldwatch', - badge: 'ifo-watch.svg' - }, - { - id: '511060000', - type: 'ifo', - title: 'Berry', - badge: 'ifo-bry.svg' - }, - { - id: '511050000', - type: 'ifo', - title: 'Soteria', - badge: 'ifo-wsote.svg' - }, - { - id: '511040000', - type: 'ifo', - title: 'Helmet', - badge: 'ifo-helmet.svg' - }, - { - id: '511030000', - type: 'ifo', - title: 'Tenet', - badge: 'ifo-ten.svg' - }, - { - id: '511020000', - type: 'ifo', - title: 'Ditto', - badge: 'ifo-ditto.svg' - }, - { - id: '511010000', - type: 'ifo', - title: 'Blink', - badge: 'ifo-blk.svg' - }, - { - id: '512010001', - type: 'teambattle', - title: 'Easter Champion: Gold', - badge: 'easter-champion-gold.svg' - }, - { - id: '512010002', - type: 'teambattle', - title: 'Easter Top 500: Gold', - badge: 'easter-top-500-gold.svg' - }, - { - id: '512010003', - type: 'teambattle', - title: 'Easter Top 500: Gold', - badge: 'easter-top-500-gold.svg' - }, - { - id: '512010004', - type: 'teambattle', - title: 'Easter Top 500: Gold', - badge: 'easter-top-500-gold.svg' - }, - { - id: '512010005', - type: 'teambattle', - title: 'Easter Participant: Gold', - badge: 'easter-participant-gold.svg' - }, - { - id: '512010006', - type: 'teambattle', - title: 'Easter Champion: Silver', - badge: 'easter-champion-silver.svg' - }, - { - id: '512010007', - type: 'teambattle', - title: 'Easter Top 500: Silver', - badge: 'easter-top-500-silver.svg' - }, - { - id: '512010008', - type: 'teambattle', - title: 'Easter Top 500: Silver', - badge: 'easter-top-500-silver.svg' - }, - { - id: '512010009', - type: 'teambattle', - title: 'Easter Top 500: Silver', - badge: 'easter-top-500-silver.svg' - }, - { - id: '512010010', - type: 'teambattle', - title: 'Easter Participant: Silver', - badge: 'easter-participant-silver.svg' - }, - { - id: '512010011', - type: 'teambattle', - title: 'Easter Champion: Bronze', - badge: 'easter-champion-bronze.svg' - }, - { - id: '512010012', - type: 'teambattle', - title: 'Easter Top 500: Bronze', - badge: 'easter-top-500-bronze.svg' - }, - { - id: '512010013', - type: 'teambattle', - title: 'Easter Top 500: Bronze', - badge: 'easter-top-500-bronze.svg' - }, - { - id: '512010014', - type: 'teambattle', - title: 'Easter Top 500: Bronze', - badge: 'easter-top-500-bronze.svg' - }, - { - id: '512010015', - type: 'teambattle', - title: 'Easter Participant: Bronze', - badge: 'easter-participant-bronze.svg' - } -] - -/** - * Transform the campaign config into a map. Keeps the config the same - * as the others and allows easy access to a campaign by id - */ -export const campaignMap = new Map() - -campaigns.forEach((campaign) => { - campaignMap.set(campaign.id, campaign) -}) - -export default campaigns diff --git a/packages/dsentr-profile-sdk/src/constants/common.ts b/packages/dsentr-profile-sdk/src/constants/common.ts deleted file mode 100644 index 8082022..0000000 --- a/packages/dsentr-profile-sdk/src/constants/common.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const profileApi = 'https://profile.dsentr.com' -export const profileSubgraphApi = 'https://api.thegraph.com/subgraphs/name/dsentr/profile' - -export const IPFS_GATEWAY = 'https://gateway.pinata.cloud' - -export const MAINNET_CHAIN_ID = 56 -export const TESTNET_CHAIN_ID = 97 diff --git a/packages/dsentr-profile-sdk/src/constants/contracts.ts b/packages/dsentr-profile-sdk/src/constants/contracts.ts deleted file mode 100644 index 91cffb3..0000000 --- a/packages/dsentr-profile-sdk/src/constants/contracts.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type ProfileNumber = 56 | 97 -type ProfileMap = { [num in ProfileNumber]: string } - -const addresses: ProfileMap = { - 56: '0xDf4dBf6536201370F95e06A0F8a7a70fE40E388a', - 97: '0x4B683C7E13B6d5D7fd1FeA9530F451954c1A7c8A' -} - -export default addresses diff --git a/packages/dsentr-profile-sdk/src/constants/nfts.ts b/packages/dsentr-profile-sdk/src/constants/nfts.ts deleted file mode 100644 index 0e80ffb..0000000 --- a/packages/dsentr-profile-sdk/src/constants/nfts.ts +++ /dev/null @@ -1,308 +0,0 @@ -import { Nft, NftType, NftSource } from '../types' -import { IPFS_GATEWAY } from './common' - -export const nftSources: NftSource = { - [NftType.GLASS]: { - address: { - 56: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', - 97: '0x60935F36e4631F73f0f407e68642144e07aC7f5E' - }, - identifierKey: 'image' - }, - [NftType.MIRROR]: { - address: { - 56: '0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566', - 97: '' - }, - identifierKey: 'image' - } -} - -const Nfts: Nft[] = [ - { - name: 'Mirror v1', - description: 'Looking back at you looking back at me...', - images: { - lg: 'mirror-1-lg.png', - md: 'mirror-1-md.png', - sm: 'mirror-1-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Mirror.png` - }, - sortOrder: 999, - identifier: '001-Mirror', - type: NftType.MIRROR, - variationId: 1 - }, - { - name: 'Mirror v2', - description: 'Looking back at you looking back at me...', - images: { - lg: 'mirror-2-lg.png', - md: 'mirror-2-md.png', - sm: 'mirror-2-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/002--Mirror.png` - }, - sortOrder: 999, - identifier: '002--Mirror', - type: NftType.MIRROR, - variationId: 2 - }, - { - name: 'Mirror v3', - description: 'Looking back at you looking back at me...', - images: { - lg: 'mirror-3-lg.png', - md: 'mirror-3-md.png', - sm: 'mirror-3-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/003--Mirror.png` - }, - sortOrder: 999, - identifier: '003--Mirror', - type: NftType.MIRROR, - variationId: 3 - }, - { - name: 'TBD Champions', - description: 'TBD Battle!', - images: { - lg: 'tbd-lg.png', - md: 'tbd-md.png', - sm: 'tbd-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.png` - }, - video: { - webm: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.webm`, - mp4: `${IPFS_GATEWAY}/ipfs/QmWFQdggxnAkgFNBWixT6v7nrgEnYfYDxG5A9u42aHhU6U/easter-champion-storm.mp4` - }, - sortOrder: 999, - identifier: 'easter-champion-storm', - type: NftType.GLASS, - variationId: 15 - }, - { - name: "Cakeston Easter '21", - description: 'Melting Easter eggs and melting hearts!', - images: { - lg: 'cakeston-easter-21-lg.png', - md: 'cakeston-easter-21-md.png', - sm: 'cakeston-easter-21-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-caker.png` - }, - sortOrder: 999, - identifier: 'easter-caker', - type: NftType.GLASS, - variationId: 15 - }, - { - name: "Flipsie Easter '21", - description: 'Watch out for Flipsie’s spatula smash!', - images: { - lg: 'flipsie-easter-21-lg.png', - md: 'flipsie-easter-21-md.png', - sm: 'flipsie-easter-21-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-flipper.png` - }, - sortOrder: 999, - identifier: 'easter-flipper', - type: NftType.GLASS, - variationId: 14 - }, - { - name: "Stormy Easter '21", - description: 'Do you like chocolate with your syrup? Go long!', - images: { - lg: 'stormy-easter-21-lg.png', - md: 'stormy-easter-21-md.png', - sm: 'stormy-easter-21-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmZGqWaovULNEMKxBCGnGjh27JQkAyadS6AW4J4Lzf3XBp/easter-storm.png` - }, - sortOrder: 999, - identifier: 'easter-storm', - type: NftType.GLASS, - variationId: 12 - }, - { - name: 'Bullish', - description: 'Happy Niu Year! This bunny’s excited for the year of the bull (market!)', - images: { - lg: 'bullish-lg.png', - md: 'bullish-md.png', - sm: 'bullish-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.png` - }, - video: { - webm: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.webm`, - mp4: `${IPFS_GATEWAY}/ipfs/QmNS1A5HsRW1JvFWtGkm4o9TgZVe2P7kA8TB4yxvS6A7ms/bullish.mp4` - }, - sortOrder: 999, - identifier: 'bullish', - type: NftType.GLASS, - variationId: 11 - }, - { - name: 'Glass', - description: "Oopsie daisy! Glass's had a bit of an accident. Poor little fella.", - images: { - lg: 'glass-lg.png', - md: 'glass-md.png', - sm: 'glass-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmQ6EE6gkVzAQUdQLLM7CyrnME6LZHCoy92ZERW8HXmyjw/glass.png` - }, - sortOrder: 999, - identifier: 'glass', - type: NftType.GLASS, - variationId: 10 - }, - { - name: 'Prism', - description: 'Glass works colors...', - images: { - lg: 'prism-lg.png', - md: 'prism-md.png', - sm: 'prism-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png`, - blur: 'prism-blur.png' - }, - sortOrder: 999, - identifier: 'prism', - type: NftType.GLASS, - variationId: 5 - }, - { - name: 'Reflect', - description: 'Either brightness from the sun or darkness from below', - images: { - lg: 'reflect-lg.png', - md: 'reflect-md.png', - sm: 'reflect-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/reflect.png`, - blur: 'reflect-blur.png' - }, - sortOrder: 999, - identifier: 'reflect', - type: NftType.GLASS, - variationId: 9 - }, - { - name: 'Chandelier', - description: "Don't be mesmerized by the light... Chandelier's a GLASS master!", - images: { - lg: 'chandelier-lg.png', - md: 'chandelier-md.png', - sm: 'chandelier-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/chandelier.png`, - blur: 'chandelier-blur.png' - }, - sortOrder: 999, - identifier: 'chandelier', - type: NftType.GLASS, - variationId: 8 - }, - { - name: 'Dollop', - description: "Nommm... Oh hi, I'm just meditating on the meaning of CAKE.", - images: { - lg: 'dollop-lg.png', - md: 'dollop-md.png', - sm: 'dollop-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/dollop.png`, - blur: 'dollop-blur.png' - }, - sortOrder: 999, - identifier: 'dollop', - type: NftType.GLASS, - variationId: 6 - }, - { - name: 'Twinkle', - description: "Three guesses what's put that twinkle in those eyes! (Hint: it's CAKE)", - images: { - lg: 'twinkle-lg.png', - md: 'twinkle-md.png', - sm: 'twinkle-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/twinkle.png`, - blur: 'twinkle-blur.png' - }, - sortOrder: 999, - identifier: 'twinkle', - type: NftType.GLASS, - variationId: 7 - }, - { - name: 'Streak', - description: "You'll know us when you see", - images: { - lg: 'streak-lg.png', - md: 'streak-md.png', - sm: 'streak-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/streak.png`, - blur: 'streak-blur.png' - }, - sortOrder: 999, - identifier: 'streak', - type: NftType.GLASS, - variationId: 0 - }, - { - name: 'Sparkle', - description: 'As it rains down, is it shards or water?', - images: { - lg: 'sparkle-lg.png', - md: 'sparkle-md.png', - sm: 'sparkle-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/sparkle.png`, - blur: 'sparkle-blur.png' - }, - sortOrder: 999, - identifier: 'sparkle', - type: NftType.GLASS, - variationId: 1 - }, - { - name: 'Diamond', - description: 'A scratch to mark the journey', - images: { - lg: 'diamond-lg.png', - md: 'diamond-md.png', - sm: 'diamond-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/diamond.png`, - blur: 'diamond-blur.png' - }, - sortOrder: 999, - identifier: 'diamond', - type: NftType.GLASS, - variationId: 2 - }, - { - name: 'Cleaner', - description: 'Never aging', - images: { - lg: 'cleaner-lg.png', - md: 'cleaner-md.png', - sm: 'cleaner-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/cleaner.png`, - blur: 'cleaner-blur.png' - }, - sortOrder: 999, - identifier: 'cleaner', - type: NftType.GLASS, - variationId: 3 - }, - { - name: 'Blur', - description: 'The eyesight would be the first', - images: { - lg: 'blur-lg.png', - md: 'blur-md.png', - sm: 'blur-sm.png', - ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/blur.png`, - blur: 'blur-blur.png' - }, - sortOrder: 999, - identifier: 'blur', - type: NftType.GLASS, - variationId: 4 - } -] - -export default Nfts diff --git a/packages/dsentr-profile-sdk/src/constants/teams.ts b/packages/dsentr-profile-sdk/src/constants/teams.ts deleted file mode 100644 index 78f27da..0000000 --- a/packages/dsentr-profile-sdk/src/constants/teams.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Team } from '../types' - -const teams: Team[] = [ - { - id: 1, - name: 'Syrup Storm', - description: "The storm's a-comin! Watch out! These bulls are stampeding in a syrupy surge!", - images: { - lg: 'syrup-storm-lg.png', - md: 'syrup-storm-md.png', - sm: 'syrup-storm-sm.png', - alt: 'syrup-storm-alt.png', - ipfs: 'https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/syrup-storm.png' - }, - background: 'syrup-storm-bg.svg', - textColor: '#191326', - users: 0, - points: 0 - }, - { - id: 2, - name: 'Fearsome Flippers', - description: "The flippening is coming. Don't get in these bunnies' way, or you'll get flipped too!", - images: { - lg: 'fearsome-flippers-lg.png', - md: 'fearsome-flippers-md.png', - sm: 'fearsome-flippers-sm.png', - alt: 'fearsome-flippers-alt.png', - ipfs: 'https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/fearsome-flippers.png' - }, - background: 'fearsome-flippers-bg.svg', - textColor: '#FFFFFF', - users: 0, - points: 0 - }, - { - id: 3, - name: 'Chaotic Cakers', - description: 'Can you stand the heat? Stay out of the kitchen or you might get burned to a crisp!', - images: { - lg: 'chaotic-cakers-lg.png', - md: 'chaotic-cakers-md.png', - sm: 'chaotic-cakers-sm.png', - alt: 'chaotic-cakers-alt.png', - ipfs: 'https://gateway.pinata.cloud/ipfs/QmXKzSojwzYjtDCVgR6mVx7w7DbyYpS7zip4ovJB9fQdMG/chaotic-cakers.png' - }, - background: 'chaotic-cakers-bg.svg', - textColor: '#191326', - users: 0, - points: 0 - } -] - -export default teams diff --git a/packages/dsentr-profile-sdk/src/images/chaotic-cakers-alt.png b/packages/dsentr-profile-sdk/src/images/chaotic-cakers-alt.png deleted file mode 100644 index d4ba3113fe0142c4308e1b8594e2f2fd50d2b29b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 zcmV;H2Wj|;P)iDTtRwiO9Q2zO_MI5^oEHDND*v@6 z|FR+fupjP%1OK}%|E?VOm=SYF5AlNoFe5krw<-U$Blw>eVE@%dXjZ=h;na&Zft&OW^Uo4 zCUjLD+>sjZn;2z65^6#ZreO-KVhFTk2gYm$xn>6OhXv4c1+@2vxJaC&fTcvMnd zK{ZG=D?m*}IW;ypAs!<9t0Av{A^N5qEh8L&Ss4AO7xI=CiCY%hixp~06|rv;^pz22 zKo9kk4R|~Zl2Z!tiU_c92%J+0zi9^Ld;^S#o`!>#W@L9^UvXSoTvJM0PE1ZYGDt2V zG*(D4CLS#Kv@7bVC~i|F?4%<2yC0}{AN;8u-IE;3h8g;!7)CG`p=lMweH6QQ6c-m1 zmSGb>EfW5v5rtC_U_KDne-F@n4SY%sj8Y8yoeT7i3;UP~ty~DgZ3owv2E~R3>D0UO z*tC_Bqyx72uB)$$k^La}rfI62*5BZATI7i4fR!~jtpGQMMM?W$|R!cbUn=|pNC-0UfHZLX2lO(^4B!^}sk!>TjgCf?5 zADC+$7#1AosvEz98|jN0m1P*xl^4{A7qoU4q-+;`RTgwm7B?#vBpw#tpcAEO6G$-< z@v;x_nGfxb595dq#B~nEc@6Ne4C0~)=7I(1_dCA;00de|L_t(Y$FjF=*_fQ7Iww=r6}yFri+yIbj$#_sO!?(XjH?ib!WhivT5b9mwB#m?RN|GxL^ zoB^ndfL<4&2gd&hj8Q;hW1Rp7g^OQk2u26AAg`{nrZ!JkV5TjvMOt5NrUSrgYZS>{ zYU;4)&;m1hAVV%{)Dh@w`<5kU1k$nksI-IbyLb6BsE2*O>Ik}b_N7{=fS{tR+U}@8 zPfgi-s_9}X1SzCDvwNZey)EAHdB0CimJ;A(Lk)il`7Hcr$@e5;eqQ8N6=?EG;cJz6ow5t%lc5PEO7|J}Zer zafJUnh!K#IG(FbU9p2kownKvT>`)pqCX>liv6zd~EGdqTJR~@fGH|(vTO6|Q2yAU_ zH?duuku`-v$%K~7en4=PNK%dAf*w2eihJCEX-T#n0Fg*U0(gzQm%4lQtlFs(pY*L5 zi0V>2YQE>n0n_kAH2{ytZ_EheQ5<2Z80h5DMSOgzC|}g9U<8zx$Ip+QK9z`9K^_3| zkP@(OMyf<2;Xw;#E#glaeCX%o_rfqJ>rs6Ch!IZ`@alktg+)T5?CEvvzN*x0{(_r4 zAOE&blb1fv2@Xmg!{nave3)RN4j>=v**i}iznmtZWj6^}0d3(wCO^*238IfE_OB$-GK7Y?|4G#}*&D~oNkj!OruO4%sxUP>n&>OKXrG7t8AP~?* zZAZe7wC2n99xN;#!{IQ`4js0(w+7HdX_B}6SCc@{;4eCq?|&dCr#WZ`XY}aNBj>tC zO|j~sP8C>9+Td51*VM45AopNFL33ze@i-2L6CL5^HrA_CV5QRIeugYi90G+E289Jn zlbJCwG0~CkuIH!VtTX@{6&!9tqBol^ub0z5z8lA7GP%*79kVl^Z)<= diff --git a/packages/dsentr-profile-sdk/src/images/chaotic-cakers-bg.svg b/packages/dsentr-profile-sdk/src/images/chaotic-cakers-bg.svg deleted file mode 100644 index 46eb4de..0000000 --- a/packages/dsentr-profile-sdk/src/images/chaotic-cakers-bg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/dsentr-profile-sdk/src/images/chaotic-cakers-lg.png b/packages/dsentr-profile-sdk/src/images/chaotic-cakers-lg.png deleted file mode 100644 index a016d9b8fec0086b017b2e9b6577b36cc85f43b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24506 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 diff --git a/packages/dsentr-profile-sdk/src/images/chaotic-cakers-md.png b/packages/dsentr-profile-sdk/src/images/chaotic-cakers-md.png deleted file mode 100644 index 4252c74c10e38019d33c8688e47267307659ce71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7042 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 diff --git a/packages/dsentr-profile-sdk/src/images/chaotic-cakers-sm.png b/packages/dsentr-profile-sdk/src/images/chaotic-cakers-sm.png deleted file mode 100644 index b18a7c0c4af7d01ac0e9073c8d100732819eee43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1687 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 Z`~)78sx38IqyYc`002ovPDHLkV1i4b$N~TW diff --git a/packages/dsentr-profile-sdk/src/images/fearsome-flippers-bg.svg b/packages/dsentr-profile-sdk/src/images/fearsome-flippers-bg.svg deleted file mode 100644 index 7d5020f..0000000 --- a/packages/dsentr-profile-sdk/src/images/fearsome-flippers-bg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/dsentr-profile-sdk/src/images/fearsome-flippers-lg.png b/packages/dsentr-profile-sdk/src/images/fearsome-flippers-lg.png deleted file mode 100644 index dd90d98af7ccb1871b4add05f9ddf90b14747edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72285 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

0RS!P848btF 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 Ef=^RwKL7v# diff --git a/packages/dsentr-profile-sdk/src/images/fearsome-flippers-md.png b/packages/dsentr-profile-sdk/src/images/fearsome-flippers-md.png deleted file mode 100644 index 83ee7e60ce9e02db57603e6c2dbd635aaaddf533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7000 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 \ No newline at end of file diff --git a/packages/dsentr-profile-sdk/src/images/syrup-storm-lg.png b/packages/dsentr-profile-sdk/src/images/syrup-storm-lg.png deleted file mode 100644 index d4d01d5f0e2c6773e3323197e0a515ae10c0b225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80266 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 z 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 Jl)W$t`X9~4e#HO) diff --git a/packages/dsentr-profile-sdk/src/images/syrup-storm-md.png b/packages/dsentr-profile-sdk/src/images/syrup-storm-md.png deleted file mode 100644 index 0ea8498a91ceeca417904c0e93b16333d8193b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7294 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 Y1KFnxf&&crQ~&?~07*qoM6N<$g5b>PQUCw| diff --git a/packages/dsentr-profile-sdk/src/images/syrup-storm-sm.png b/packages/dsentr-profile-sdk/src/images/syrup-storm-sm.png deleted file mode 100644 index aefc6c5daa89660611ce31f8a7a9932a132363b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1641 zcmV-v2A27WP){q)88q~*-YH$Oxxx-*Wz2_>{#OKHP+xP(%whh z=0exwFx1~E(%m%C-FPwrJ=NiPGy^=@<1*FYI@I4c)88e~+bYf4LE7az)Zr)5+$Xib zOy21*(A*`w$1=3OF0Hp%P*+-KiA?m(cLZ2+egpZHO<*2%h)Qy&MLmkHMhb* zsJKX+t#vU1RN(4L+vY^u=04fuL(|?r%GE%{(Iv&vQM$%Py2dKG#WSzJIkLVdthK12 zsfUV~duVEAR$WFlL`oh9Y%T>>A_H>*aBo~&Nm^S;I!Zkg)l-Q3?M&Dl@P*DA`^X~f66w!urX zz?{gxwY0t_u)I00xwy)>G_SaynW;dMrHqoJfRUoKv7VZdo_&p;u%nnnkCac9lQV;o zD}IiXiitgXiJg^)LUw~bZ+k+5c}914iFt7}V{k}jY+`n3aA9UzOj}n)P-jn0I7Ufi zM?-N;Lcf_Vn}H~FNhWJZAx9`7TQM7$ZWKlz66duHkVObtC{j6Vd0Is&Xz z0eRo(kl*H0*5Fy#-(Jt!rQ6vt$<|@c(pSpTt=7(T$;^+-#aO<>I=RA3xWSUJyN#{5 zeyO;xtFtktvtOjL#>25;rm-`ru#u#xM6ak$qNuUBrd*Y!UXi0hl%g|?p)Zr4Rg9mm zpPYezlTwe7MT3rZc#Bkfh)0EnmxF~XZhV1(dQyFMgmiXBWp+SUa$t0DR#I%=z+z8q zS!HQiOFdaoU|2LqP-S;dfnHC9Tt{$tL{Lmb;JQD!kTZ~RF;qPS7oJ)acQ_M(JrS&U4A7tmlUWCyNd)n|0seZ3uK)l8CrLy>R5;6Z%4Jkq zVI0TtM?laE!W^4dHXI-b2n>+4yE|vMvvaPyySwd3{E}KR~#IK}ShQfY$Lz#nDK>p21+)G9Ih zG9H)+`o1}*y?NGm{K>hj(2$2|;#X5tqn*(Sn4plL>_}{G_UR$RSLj)xma1WiwIHO2uZ zlW9y9q+ZY!wzRZ2uJH8_X6c*ibK{&{;+&ZXK%p?n4uaT8!*#v#&hxrjJV|JkA>~2Ky@V-V&#LDsqkGG^T+ka~<>ZpWfBL=l zePu~~@pQFNtW46nui7MHJ2^Q43xrjKSSZYXRQbAa;pdsA>d}gIt9ScFCM$a&upr`K zW?FiBQuegcvIlVk4`l7UJ>!0ULZTTK*x1-?77r4}a z{{B&$6TB_Dpa4g%(Rrx{am=y;7yB;p4VXXSXyn$x9vYRh3m!m_O*eB62V(EK9x!=U zs|xw2zK33hQKJ(rw^ecu*04KcwmHa n { - return res( - ctx.status(200), - ctx.json({ - username: 'Cheems' - }) - ) - }), - rest.get(`${profileApi}/api/users/${nonexistentAddress}`, (req, res, ctx) => { - return res(ctx.status(404), ctx.json({ error: { message: 'Entity not found.' } })) - }), - rest.get(`${IPFS_GATEWAY}/ipfs/QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/prism.json`, (req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ - name: 'Prism', - description: 'Glass works colors', - image: 'ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png', - attributes: { - shardId: '5' - } - }) - ) - }), - subgraph.query('getUser', (req, res, ctx) => { - const address = req.variables.id - if (address === existingAddress1) { - return res( - ctx.data({ - user: { - points: [ - { - id: existingAddress1, - campaignId: '511080000', - points: 200 - }, - { - id: existingAddress1, - campaignId: '512010010', - points: 500 - }, - { - id: existingAddress1, - campaignId: '511090000', - points: 100 - } - ] - } - }) - ) - } - if (address === existingAddress2) { - return res( - ctx.data({ - user: { - points: [] - } - }) - ) - } - // Address does not exists - return res( - ctx.data({ - user: null - }) - ) - }) -] - -export default handlers diff --git a/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts b/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts deleted file mode 100644 index a939308..0000000 --- a/packages/dsentr-profile-sdk/src/mocks/mockAddresses.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const existingAddress1 = '0x1111111111111111111111111111111111111111' -export const existingAddress2 = '0x2222222222222222222222222222222222222222' -export const nonexistentAddress = '0x9999999999999999999999999999999999999999' diff --git a/packages/dsentr-profile-sdk/src/mocks/server.ts b/packages/dsentr-profile-sdk/src/mocks/server.ts deleted file mode 100644 index c66c0d4..0000000 --- a/packages/dsentr-profile-sdk/src/mocks/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { rest } from 'msw' -import { setupServer } from 'msw/node' -import handlers from './handlers' -// This configures a request mocking server with the given request handlers. -const server = setupServer(...handlers) - -// Use these to set up special cases during tests -// No need for manual teardown, all runtime modifications are cleaned up in jest.setup.js afterEach -export { server, rest } diff --git a/packages/dsentr-profile-sdk/src/profile-sdk.test.ts b/packages/dsentr-profile-sdk/src/profile-sdk.test.ts deleted file mode 100644 index f63c4e3..0000000 --- a/packages/dsentr-profile-sdk/src/profile-sdk.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -import Web3 from 'web3' -import Cookies from 'js-cookie' -import DSentrProfileSdk from './profile-sdk' -import web3NoAccount from './utils/web3' -import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID, profileApi } from './constants/common' -import nfts from './constants/nfts' -import teamsList from './constants/teams' -import { existingAddress1, existingAddress2, nonexistentAddress } from './mocks/mockAddresses' -import { server, rest } from './mocks/server' - -jest.mock('./utils/contractHelpers') -jest.mock('js-cookie', () => ({ - set: jest.fn(() => null) -})) - -describe('DSentrProfileSdk', () => { - describe('constructor', () => { - it('uses default web3 instance if no web3 is provided', () => { - const sdk = new DSentrProfileSdk() - expect(sdk.web3).toBe(web3NoAccount) - }) - it('uses mainnet chainId if no chainId is provided', () => { - const sdk = new DSentrProfileSdk() - expect(sdk.chainId).toBe(MAINNET_CHAIN_ID) - }) - it('uses custom web3 instance if provided', () => { - const httpProvider = new Web3.providers.HttpProvider('http://customrpc.com', { - timeout: 10000 - }) - const customWeb3 = new Web3(httpProvider) - const sdk = new DSentrProfileSdk({ web3: customWeb3 }) - expect(sdk.web3).toBe(customWeb3) - }) - it('uses specific chainId if chainId is provided', () => { - const sdk = new DSentrProfileSdk({ chainId: TESTNET_CHAIN_ID }) - expect(sdk.chainId).toBe(TESTNET_CHAIN_ID) - }) - }) - - describe('methods', () => { - const sdk = new DSentrProfileSdk() - beforeEach(() => { - jest.clearAllMocks() - }) - - describe('getUsername', () => { - it('returns username for valid address', async () => { - await expect(sdk.getUsername(existingAddress1)).resolves.toEqual('Cheems') - }) - it('returns empty string for invalid address', async () => { - await expect(sdk.getUsername(nonexistentAddress)).resolves.toEqual('') - }) - it('returns empty string when there is internal server error', async () => { - server.use( - rest.get(`${profileApi}/api/users/${existingAddress1}`, async (req, res, ctx) => { - return await res(ctx.status(500), ctx.json({ message: '500 Internal Server Error' })) - }) - ) - await expect(sdk.getUsername(nonexistentAddress)).resolves.toEqual('') - }) - }) - - describe('getAchievements', () => { - it('returns achievements for existing address', async () => { - const expectedAchievements = [ - { - id: '511080000', - type: 'ifo', - address: existingAddress1, - title: { - id: 999, - fallback: 'IFO Shopper: Belt', - data: { - name: 'Belt' - } - }, - description: { - id: 999, - fallback: 'Committed more than $5 worth of LP in the Belt IFO', - data: { - name: 'Belt' - } - }, - badge: 'ifo-belt.svg', - points: 200 - }, - { - id: '512010010', - type: 'teambattle', - address: existingAddress1, - title: 'Easter Participant: Silver', - badge: 'easter-participant-silver.svg', - points: 500 - }, - { - id: '511090000', - type: 'ifo', - address: existingAddress1, - title: { - id: 999, - fallback: 'IFO Shopper: Horizon Protocol', - data: { - name: 'Horizon Protocol' - } - }, - description: { - id: 999, - fallback: 'Committed more than $5 worth of LP in the Horizon Protocol IFO', - data: { - name: 'Horizon Protocol' - } - }, - badge: 'ifo-hzn.svg', - points: 100 - } - ] - const achievements = await sdk.getAchievements(existingAddress1) - expect(achievements).toEqual(expectedAchievements) - }) - it('returns empty array for address with no achievements', async () => { - const achievements = await sdk.getAchievements(existingAddress2) - expect(achievements).toEqual([]) - }) - it('returns empty array for non-existent address', async () => { - const achievements = await sdk.getAchievements(nonexistentAddress) - expect(achievements).toEqual([]) - }) - }) - - describe('getTeam', () => { - beforeEach(() => { - jest.clearAllMocks() - }) - it('returns team data for valid team', async () => { - await expect(sdk.getTeam(2)).resolves.toEqual({ - ...teamsList[1], - users: 77000, - points: 341500, - isJoinable: true - }) - }) - it('returns null for non-existent team id', async () => { - await expect(sdk.getTeam(69)).resolves.toEqual(null) - }) - }) - - describe('getProfile', () => { - const sleepyNft = nfts.find((nft) => nft.identifier === 'sleepy') - beforeEach(() => { - jest.clearAllMocks() - }) - it('returns proper response for unregistered user', async () => { - const profile = await sdk.getProfile(nonexistentAddress) - expect(profile).toEqual({ hasRegistered: false, profile: null }) - }) - it('returns proper response for registered user', async () => { - const profile = await sdk.getProfile(existingAddress1) - expect(profile).toEqual({ - hasRegistered: true, - profile: { - isActive: true, - userId: 123, - username: 'Cheems', - teamId: 2, - points: 3000, - tokenId: 555, - nftAddress: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', - nft: sleepyNft, - team: { ...teamsList[1], users: 77000, points: 341500, isJoinable: true } - } - }) - }) - it('sets cookies', async () => { - await sdk.getProfile(existingAddress1) - expect(Cookies.set).toBeCalledWith( - `profile_${existingAddress1}`, - { - username: 'Cheems', - avatar: `https://dsentr.com/images/nfts/${(sleepyNft != null) ? sleepyNft.images.sm : ''}` - }, - { domain: 'dsentr.com', secure: true, expires: 30 } - ) - expect(Cookies.set).toBeCalledTimes(1) - }) - }) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/profile-sdk.ts b/packages/dsentr-profile-sdk/src/profile-sdk.ts deleted file mode 100644 index 9df3f7a..0000000 --- a/packages/dsentr-profile-sdk/src/profile-sdk.ts +++ /dev/null @@ -1,208 +0,0 @@ -import Web3 from 'web3' -import { Contract } from 'web3-eth-contract' -import { request, gql } from 'graphql-request' -import Cookies from 'js-cookie' -import web3NoAccount from './utils/web3' -import { getProfileContract } from './utils/contractHelpers' -import { profileApi, profileSubgraphApi, MAINNET_CHAIN_ID } from './constants/common' -import { campaignMap } from './constants/campaigns' -import teamsList from './constants/teams' -import { Achievement, Team, GetProfileResponse, Profile, Nft, UserPointIncreaseEvent } from './types' -import { getAchievementDescription, getAchievementTitle, transformProfileResponse } from './utils/transformHelpers' -import { getNftByTokenId } from './utils/collectibles' - -interface SdkConstructorArguments { - web3?: Web3 - chainId?: number -} - -class DSentrProfileSdk { - web3 = web3NoAccount - - chainId = MAINNET_CHAIN_ID - - profileContract: Contract - - constructor (args?: SdkConstructorArguments) { - if ((args?.web3) != null) this.web3 = args.web3 - if (args?.chainId != null) this.chainId = args.chainId - this.profileContract = getProfileContract(this.web3, this.chainId) - } - - /** - * Fetches user information via REST API - * Contains user information and leaderboard statistics about latest trading competition. - * API repo - https://github.com/dsentr-glass/dsentr-profile-api - */ - getUsername = async (address: string): Promise => { - try { - const response = await fetch(`${profileApi}/api/users/${address}`) - if (!response.ok) { - return '' - } - - const { username = '' } = await response.json() - return username - } catch (error) { - return '' - } - } - - getAchievements = async (account: string): Promise => { - try { - const data = await request( - profileSubgraphApi, - gql` - query getUser($id: String!) { - user(id: $id) { - points { - id - campaignId - points - } - } - } - `, - { id: account.toLowerCase() } - ) - if (data.user === null || data.user.points.length === 0) { - return [] - } - return data.user.points.reduce((accum: Achievement[], userPoint: UserPointIncreaseEvent) => { - const campaignMeta = campaignMap.get(userPoint.campaignId) - if (campaignMeta == null) { - return [] - } else { - return [ - ...accum, - { - id: userPoint.campaignId, - type: campaignMeta.type, - address: userPoint.id, - title: getAchievementTitle(campaignMeta), - description: getAchievementDescription(campaignMeta), - badge: campaignMeta.badge, - points: Number(userPoint.points) - } - ] - } - }, []) - } catch (error) { - return [] - } - } - - /** - * Fetches team information from - * Contains team name, number of users, total number of points for the team and whether the team is joinable. - * This data is combined with static team data (images, description, etc) that is stored in constant in this repo. - * Contract repo - https://github.com/dsentr-glass/dsentr-contracts/tree/master/projects/profile-nft-gamification - */ - getTeam = async (teamId: number | undefined): Promise => { - const fallback = { - id: -1, - name: '', - description: '', - images: { - lg: 'na-lg.png', - md: 'na-md.png', - sm: 'na-sm.png', - alt: 'na-alt.png', - ipfs: '' - }, - background: 'na-bg.svg', - textColor: '#191326', - users: 0, - points: 0 - } - if (teamId == null) { - return fallback - } - try { - const { - 0: teamName, - 2: numberUsers, - 3: numberPoints, - 4: isJoinable - } = await this.profileContract.methods.getTeamProfile(teamId).call() - const staticTeamInfo: Team = (teamsList.find(staticTeam => staticTeam.id === teamId)) || fallback - return { ...staticTeamInfo, isJoinable, name: teamName, users: numberUsers, points: numberPoints } - } catch (error) { - return fallback - } - } - - // id: number - // name: string - // description: string - // isJoinable?: boolean - // users: number - // points: number - // images: TeamImages - // background: string - // textColor: string - - /** - * Fetches profile information for specified address. - * This function combines data from getUsername and getTeam with profile data received getUserProfile method - * from DSentrProfile contract. - * NFT's shardId is retrieved from GlassShards contract and mapped to static NFT data stored in constant. - * Contracts repo - https://github.com/dsentr-glass/dsentr-contracts/tree/master/projects/profile-nft-gamification - */ - getProfile = async (address: string): Promise => { - try { - const hasRegistered = (await this.profileContract.methods.hasRegistered(address).call()) as boolean - - if (!hasRegistered) { - return { hasRegistered, profile: undefined } - } - - const profileResponse = await this.profileContract.methods.getUserProfile(address).call() - const { userId, points, teamId, tokenId, nftAddress, isActive } = transformProfileResponse(profileResponse) - const team = await this.getTeam(teamId) - const username = await this.getUsername(address) - - // If the profile is not active the tokenId returns 0, which is still a valid token id - // so only fetch the nft data if active - let nft: Nft | null | undefined - if (isActive != null && isActive && nftAddress != null && tokenId != null) { - nft = await getNftByTokenId(nftAddress, tokenId, this.web3, this.chainId) - const avatar = (nft != null) ? `https://dsentr.com/images/nfts/${nft.images.sm}` : undefined - // Save the preview image in a cookie so it can be used on the exchange - // TODO v2: optional (and configurable) Cookies.set - Cookies.set( - `profile_${address}`, - { - username, - avatar - }, - { domain: 'dsentr.com', secure: true, expires: 30 } - ) - } - if (userId == null || points == null || teamId == null || tokenId == null || nftAddress == null || isActive == null || nft == null) { - throw new Error('Some items were undefined') - } - const profile: Profile = { - userId, - points, - teamId, - tokenId, - username, - nftAddress, - isActive, - nft, - team, - hasRegistered - } - - return { hasRegistered, profile } - } catch (error) { - console.error('getProfile error: ', error) - const hasRegistered = false - const profile = undefined - return { hasRegistered, profile } - } - } -} - -export default DSentrProfileSdk diff --git a/packages/dsentr-profile-sdk/src/types.ts b/packages/dsentr-profile-sdk/src/types.ts deleted file mode 100644 index a866caa..0000000 --- a/packages/dsentr-profile-sdk/src/types.ts +++ /dev/null @@ -1,129 +0,0 @@ -export interface Address { - [key: number]: string - 97: string - 56: string -} - -export interface Images { - lg: string - md: string - sm: string - ipfs?: string -} - -export type NftImages = { - blur?: string -} & Images - -export interface NftVideo { - webm: string - mp4: string -} - -export interface Nft { - name: string - description: string - images: NftImages - sortOrder: number - type: NftType - video?: NftVideo - - // Uniquely identifies the nft. - // Used for matching an NFT from the config with the data from the NFT's tokenURI - identifier: string - - variationId?: number | string -} - -export enum NftType { - GLASS = 'glass', - MIRROR = 'mirror', -} - -export interface NftUriData { - [key: string]: { - name: string - description: string - image: string - attributes: { - shardId: string - } - } -} - -export type NftSource = { - [key in NftType]: { - address: Address - identifierKey: string - }; -} - -export type TeamImages = { - alt: string -} & Images - -export interface Team { - id: number - name: string - description: string - isJoinable?: boolean - users: number - points: number - images: TeamImages - background: string - textColor: string -} - -export interface GetProfileResponse { - hasRegistered: boolean - profile?: Profile -} - -export interface Profile { - userId: number - points: number - teamId: number - nftAddress: string - tokenId: number - isActive: boolean - username: string - nft?: Nft - team: Team - hasRegistered: boolean -} - -export type TranslatableText = - | string - | { - id: number - fallback: string - data?: { - [key: string]: string | number - } - } - -export type CampaignType = 'ifo' | 'teambattle' - -export interface Campaign { - id: string - type: CampaignType - title?: TranslatableText - description?: TranslatableText - badge?: string -} - -export interface Achievement { - id: string - type: CampaignType - address: string - title: TranslatableText - description?: TranslatableText - badge: string - points: number -} - -export interface UserPointIncreaseEvent { - campaignId: string - id: string // wallet address - points: string -} diff --git a/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts b/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts deleted file mode 100644 index 6667285..0000000 --- a/packages/dsentr-profile-sdk/src/utils/__mocks__/contractHelpers.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import Web3 from 'web3' -import { existingAddress1 } from '../../mocks/mockAddresses' - -const getProfileContract = jest.fn((web3?: Web3) => { - return { - methods: { - hasRegistered: jest.fn((callAddress: string) => { - if (callAddress === existingAddress1) { - return { call: jest.fn(async () => await Promise.resolve(true)) } - } - return { call: jest.fn(async () => await Promise.resolve(false)) } - }), - getUserProfile: jest.fn((callAddress: string) => { - if (callAddress === existingAddress1) { - return { - call: jest.fn(async () => - await Promise.resolve({ - 0: 123, - 1: 3000, - 2: 2, - 3: '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07', - 4: 555, - 5: true - }) - ) - } - } - return { call: jest.fn(async () => await Promise.resolve(null)) } - }), - getTeamProfile: jest.fn((teamId: number) => { - if (teamId === 2) { - return { - call: jest.fn(async () => - await Promise.resolve({ - 0: 'Fearsome Flippers', - 2: 77000, - 3: 341500, - 4: true - }) - ) - } - } - return { call: jest.fn(async () => await Promise.resolve(null)) } - }) - } - } -}) - -const getErc721Contract = jest.fn((web3?: Web3) => { - return { - methods: { - tokenURI: jest.fn((tokenId: string) => { - return { - call: jest.fn(async () => await Promise.resolve('ipfs://QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json')) - } - }) - } - } -}) - -module.exports = { getProfileContract, getErc721Contract } diff --git a/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts b/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts deleted file mode 100644 index a90047d..0000000 --- a/packages/dsentr-profile-sdk/src/utils/addressHelpers.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import addresses from '../constants/contracts' -import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID } from '../constants/common' -import { getGlassProfileAddress } from './addressHelpers' - -describe('addressHelpers', () => { - it('getAddress returns correct mainnet address', () => { - const profileAddress = getGlassProfileAddress(MAINNET_CHAIN_ID) - expect(profileAddress).toBe(addresses[MAINNET_CHAIN_ID]) - }) - it('getAddress returns correct testnet address', () => { - const profileAddress = getGlassProfileAddress(TESTNET_CHAIN_ID) - expect(profileAddress).toBe(addresses[TESTNET_CHAIN_ID]) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts b/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts deleted file mode 100644 index f27e17e..0000000 --- a/packages/dsentr-profile-sdk/src/utils/addressHelpers.ts +++ /dev/null @@ -1,10 +0,0 @@ -import addresses, { ProfileNumber } from '../constants/contracts' -import { Address } from '../types' - -export const getNftAddress = (nftAddresses: Address, chainId: number): string => { - return nftAddresses[chainId].toString() -} - -export const getGlassProfileAddress = (chainId: ProfileNumber): string => { - return addresses[chainId] -} diff --git a/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts b/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts deleted file mode 100644 index 5f5eea3..0000000 --- a/packages/dsentr-profile-sdk/src/utils/collectibles.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { MAINNET_CHAIN_ID, IPFS_GATEWAY } from '../constants/common' -import web3NoAccount from './web3' -import { getIdentifierKeyFromAddress, getTokenUrl, getTokenUriData, getNftByTokenId } from './collectibles' -import nfts from '../constants/nfts' -import { server, rest } from '../mocks/server' - -jest.mock('../constants/nfts') -jest.mock('./contractHelpers') - -const GLASS_NFT_ADDRESS = '0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07' -const MIRROR_NFT_ADDRESS = '0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566' -const UNKNOWN_NFT_ADDRESS = '0xa111122229E67F2Bc8b33F33e20E915522221111' -const MOCK_TOKEN_ID = 5 - -describe('collectibles', () => { - it('getIdentifierKeyFromAddress returns proper identifier key', () => { - const glassIdentifierKey = getIdentifierKeyFromAddress(GLASS_NFT_ADDRESS, MAINNET_CHAIN_ID) - const mirrorIdentifierKey = getIdentifierKeyFromAddress(MIRROR_NFT_ADDRESS, MAINNET_CHAIN_ID) - expect(glassIdentifierKey).toBe('image') - expect(mirrorIdentifierKey).toBe('otherIdentifier') - }) - - it('getIdentifierKeyFromAddress returns null for unknown nft', () => { - const identifierKey = getIdentifierKeyFromAddress(UNKNOWN_NFT_ADDRESS, MAINNET_CHAIN_ID) - expect(identifierKey).toBeNull() - }) - - it('getTokenUrl returns ipfs link if tokenUri is ipfs uri', () => { - const originalUri = 'ipfs://example/something.json' - const tokenUri = getTokenUrl(originalUri) - expect(tokenUri).toBe(`${IPFS_GATEWAY}/ipfs/${originalUri.slice(7)}`) - }) - - it('getTokenUrl returns https link if tokenUri is https uri', () => { - const originalUri = 'https://example.com/something.json' - const tokenUri = getTokenUrl(originalUri) - expect(tokenUri).toBe(originalUri) - }) - - it('getTokenUriData returns proper response', async () => { - const uriData = await getTokenUriData(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount) - expect(uriData).toEqual({ - name: 'Prism', - description: 'Glass works colors', - image: 'ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/prism.png', - attributes: { - shardId: '5' - } - }) - }) - - it('getTokenUriData returns null if request failed', async () => { - server.use( - rest.get( - `${IPFS_GATEWAY}/ipfs/QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json`, - async (req, res, ctx) => { - return await res(ctx.status(500), ctx.json({ message: '500 Internal Server Error' })) - } - ) - ) - const uriData = await getTokenUriData(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount) - expect(uriData).toBeNull() - }) - - it('getNftByTokenId returns proper nft', async () => { - const sleepyNft = nfts.find((nft) => nft.identifier === 'sleepy') - const nft = await getNftByTokenId(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) - expect(nft).toBe(sleepyNft) - }) - - it('getNftByTokenId returns null if uriData is null', async () => { - server.use( - rest.get( - `${IPFS_GATEWAY}/ipfs/QmYsTqbmGA3H5cgouCkh8tswJAQE1AsEko9uBZX9jZ3oTC/sleepy.json`, - async (req, res, ctx) => { - return await res(ctx.status(500), ctx.json({ message: '500 Internal Server Error' })) - } - ) - ) - const nft = await getNftByTokenId(GLASS_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) - expect(nft).toBe(null) - }) - - it('getNftByTokenId returns null if identifierKey is null', async () => { - const nft = await getNftByTokenId(UNKNOWN_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) - expect(nft).toBe(null) - }) - - it('getNftByTokenId returns null if uriData does not contain indentifierKey', async () => { - // In the NFT constant mocks MIXIE NFT type is intentionally given wrong identifier - const nft = await getNftByTokenId(MIRROR_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID) - expect(nft).toBe(null) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/utils/collectibles.ts b/packages/dsentr-profile-sdk/src/utils/collectibles.ts deleted file mode 100644 index 9c27bf1..0000000 --- a/packages/dsentr-profile-sdk/src/utils/collectibles.ts +++ /dev/null @@ -1,79 +0,0 @@ -import Web3 from 'web3' -import Nfts, { nftSources } from '../constants/nfts' -import { IPFS_GATEWAY } from '../constants/common' -import { Nft, NftUriData } from '../types' -import { getNftAddress } from './addressHelpers' -import { getErc721Contract } from './contractHelpers' - -/** - * Gets the identifier key based on the nft address - * Helpful for looking up the key when all you have is the address - */ -export const getIdentifierKeyFromAddress = (nftAddress: string, chainId: number): string | null => { - const nftSource = Object.values(nftSources).find((nftSourceEntry) => { - const address = getNftAddress(nftSourceEntry.address, chainId) - return address === nftAddress - }) - - return (nftSource != null) ? nftSource.identifierKey : null -} - -/** - * Some sources like Pancake do not return HTTP tokenURI's. Same with DSentr/Glass??? - */ -export const getTokenUrl = (tokenUri: string): string => { - if (tokenUri.startsWith('ipfs://')) { - return `${IPFS_GATEWAY}/ipfs/${tokenUri.slice(7)}` - } - - return tokenUri -} - -export const getTokenUriData = async (nftAddress: string, tokenId: number, web3: Web3): Promise => { - try { - const contract = getErc721Contract(nftAddress, web3) - if (contract == null) { - throw new Error('contract is undefined') - } - const tokenUri = await contract.methods.tokenURI(tokenId).call() - const uriDataResponse = await fetch(getTokenUrl(tokenUri)) - - if (!uriDataResponse.ok) { - return null - } - - const uriData: NftUriData = await uriDataResponse.json() - return uriData - } catch (error) { - console.error('getTokenUriData', error) - return null - } -} - -export const getNftByTokenId = async ( - nftAddress: string, - tokenId: number, - web3: Web3, - chainId: number -): Promise => { - const uriData: NftUriData | null = await getTokenUriData(nftAddress, tokenId, web3) - const identifierKey = getIdentifierKeyFromAddress(nftAddress, chainId) - - // Bail out early if we have no uriData, identifierKey, or the value does not - // exist in the object - if (uriData == null) { - return null - } - - if (identifierKey == null) { - return null - } - - if (uriData[identifierKey] == null) { - return null - } - - return Nfts.find((nft) => { - return identifierKey === nft.identifier && uriData[identifierKey] - }) -} diff --git a/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts b/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts deleted file mode 100644 index b93cbb3..0000000 --- a/packages/dsentr-profile-sdk/src/utils/contractHelpers.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Web3 from 'web3' -import { MAINNET_CHAIN_ID } from '../constants/common' -import web3NoAccount from './web3' -import { getProfileContract, getErc721Contract } from './contractHelpers' - -describe('contractHelpers', () => { - it('getProfileContract returns an instance of Contract', () => { - const profileContract = getProfileContract(web3NoAccount, MAINNET_CHAIN_ID) - // toBeInstanceOf doesn't work very well with third-party libs, read more - https://stackoverflow.com/a/58032069/4614082 - expect(profileContract.constructor.name).toBe('Contract') - }) - it('getErc721Contract returns an instance of Contract', () => { - const erc721Contract = getErc721Contract('0x7777777777777777777777777777777777777777', web3NoAccount) - expect((erc721Contract != null) ? erc721Contract.constructor.name : '').toBe('Contract') - }) - it('uses provided Web3 instnace', () => { - const httpProvider = new Web3.providers.HttpProvider('https://example.com', { - timeout: 10000 - }) - const customWeb3 = new Web3(httpProvider) - const glassShardContract = getProfileContract(customWeb3, MAINNET_CHAIN_ID) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(glassShardContract.currentProvider).toBe(httpProvider) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts b/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts deleted file mode 100644 index de704a7..0000000 --- a/packages/dsentr-profile-sdk/src/utils/contractHelpers.ts +++ /dev/null @@ -1,23 +0,0 @@ -import Web3 from 'web3' -import { AbiItem } from 'web3-utils' -import { Contract } from 'web3-eth-contract' -import erc721Abi from '../abi/erc721.json' -import profileABI from '../abi/dsentrProfile.json' -import { getGlassProfileAddress } from './addressHelpers' -import { ProfileNumber } from '../constants/contracts' - -const getContract = (abi: AbiItem, address: string, web3: Web3): Contract => { - return new web3.eth.Contract(abi, address) -} - -export const getErc721Contract = (address: string, web3?: Web3): Contract | undefined => { - if (web3 != null) { - return getContract(erc721Abi as unknown as AbiItem, address, web3) - } else { - throw new Error('web3 is undefined') - } -} - -export const getProfileContract = (web3: Web3, chainId: number): Contract => { - return getContract(profileABI as unknown as AbiItem, getGlassProfileAddress(chainId as ProfileNumber), web3) -} diff --git a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts b/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts deleted file mode 100644 index 45b1d2d..0000000 --- a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import getRpcUrl, { nodes } from './getRpcUrl' - -describe('getRpcUrl', () => { - describe.each` - randomRoll | expectedNode - ${0.15} | ${nodes[0]} - ${0.35} | ${nodes[1]} - ${0.75} | ${nodes[2]} - `('$a + $b', ({ randomRoll, expectedNode }) => { - it('returns random node', () => { - jest.spyOn(global.Math, 'random').mockReturnValue(randomRoll) - const nodeUrl = getRpcUrl() - expect(nodeUrl).toEqual(expectedNode) - }) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts b/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts deleted file mode 100644 index bf11d1d..0000000 --- a/packages/dsentr-profile-sdk/src/utils/getRpcUrl.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Array of available nodes to connect to -export const nodes = [ - 'https://bsc-dataseed1.ninicoin.io', - 'https://bsc-dataseed1.defibit.io', - 'https://bsc-dataseed.binance.org' -] - -const getRandomIndex = (): number => { - const lower = 0 - const upper = nodes.length - 1 - return Math.floor(lower + Math.random() * (upper - lower + 1)) -} - -const getNodeUrl = (): string => { - const randomIndex = getRandomIndex() - return nodes[randomIndex] -} - -export default getNodeUrl diff --git a/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts b/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts deleted file mode 100644 index 433e765..0000000 --- a/packages/dsentr-profile-sdk/src/utils/transformHelpers.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - transformProfileResponse, - getAchievementTitle, - getAchievementDescription, - ProfileResponse -} from './transformHelpers' -import { Campaign } from '../types' - -describe('transformHelpers', () => { - it('transformProfileResponse returns correct profile data', () => { - const rawProfileResponse: ProfileResponse = { - 0: '123', - 1: '500', - 2: '2', - 3: '0x12345', - 4: '15', - 5: true - } - const profile = transformProfileResponse(rawProfileResponse) - expect(profile).toEqual({ - userId: 123, - points: 500, - teamId: 2, - tokenId: 15, - nftAddress: '0x12345', - isActive: true - }) - }) - - describe('getAchievementTitle', () => { - it('returns correct title for IFO', () => { - const campaign: Campaign = { - id: '55666', - type: 'ifo', - title: 'Belt' - } - const title = getAchievementTitle(campaign) - expect(title).toEqual({ - id: 999, - fallback: 'IFO Shopper: Belt', - data: { - name: 'Belt' - } - }) - }) - it('returns default title for other campaign types', () => { - const campaign: Campaign = { - id: '55666', - type: 'teambattle', - title: 'Easter Gold' - } - const title = getAchievementTitle(campaign) - expect(title).toBe('Easter Gold') - }) - }) - - describe('getAchievementDescription', () => { - it('returns correct description for IFO', () => { - const campaign: Campaign = { - id: '55666', - type: 'ifo', - title: 'Belt' - } - const description = getAchievementDescription(campaign) - expect(description).toEqual({ - id: 999, - fallback: 'Committed more than $5 worth of LP in the Belt IFO', - data: { - name: 'Belt' - } - }) - }) - it('returns default description for other campaign types', () => { - const campaign: Campaign = { - id: '55666', - type: 'teambattle', - title: 'Easter Gold', - description: 'Random description' - } - const description = getAchievementDescription(campaign) - expect(description).toBe('Random description') - }) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts b/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts deleted file mode 100644 index d83e107..0000000 --- a/packages/dsentr-profile-sdk/src/utils/transformHelpers.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Campaign, TranslatableText, Profile } from '../types' - -export interface ProfileResponse { - 0: string - 1: string - 2: string - 3: string - 4: string - 5: boolean -} - -export const transformProfileResponse = (profileResponse: ProfileResponse): Partial => { - const { 0: userId, 1: numberPoints, 2: teamId, 3: nftAddress, 4: tokenId, 5: isActive } = profileResponse - - return { - userId: Number(userId), - points: Number(numberPoints), - teamId: Number(teamId), - tokenId: Number(tokenId), - nftAddress, - isActive - } -} - -export const getAchievementTitle = (campaign: Campaign): TranslatableText | undefined => { - switch (campaign.type) { - case 'ifo': - return { - id: 999, - fallback: `IFO Shopper: ${campaign.title?.toString() ?? ''}`, - data: { - name: campaign.title as string - } - } - default: - return campaign.title ?? '' - } -} - -export const getAchievementDescription = (campaign: Campaign): TranslatableText | undefined => { - switch (campaign.type) { - case 'ifo': - return { - id: 999, - fallback: `Committed more than $5 worth of LP in the ${campaign.title?.toString() ?? ''} IFO`, - data: { - name: campaign.title as string - } - } - default: - return campaign.description ?? '' - } -} diff --git a/packages/dsentr-profile-sdk/src/utils/web3.test.ts b/packages/dsentr-profile-sdk/src/utils/web3.test.ts deleted file mode 100644 index 9dcfb90..0000000 --- a/packages/dsentr-profile-sdk/src/utils/web3.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Web3 from 'web3' -import web3NoAccount from './web3' - -describe('web3', () => { - it('returns an instance of Web3', () => { - expect(web3NoAccount).toBeInstanceOf(Web3) - }) -}) diff --git a/packages/dsentr-profile-sdk/src/utils/web3.ts b/packages/dsentr-profile-sdk/src/utils/web3.ts deleted file mode 100644 index 872179f..0000000 --- a/packages/dsentr-profile-sdk/src/utils/web3.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Web3 from 'web3' -import getRpcUrl from './getRpcUrl' - -const RPC_URL = getRpcUrl() -const httpProvider = new Web3.providers.HttpProvider(RPC_URL, { - timeout: 10000 -}) -const web3NoAccount = new Web3(httpProvider) - -export default web3NoAccount diff --git a/packages/dsentr-profile-sdk/tsconfig.json b/packages/dsentr-profile-sdk/tsconfig.json deleted file mode 100644 index 8e19a59..0000000 --- a/packages/dsentr-profile-sdk/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "lib": ["ES2020", "DOM"], - "target": "ES5", - "esModuleInterop": true, - "resolveJsonModule": true, - "strict": true, - "types": ["jest"], - "typeRoots": ["../../node_modules/@types", "node_modules/@types"] - }, - "include": ["src", "."], - "exclude": ["node_modules", "../../node_modules", "dist"] -} From 282b7e9af314bb4886103f8e239ba8fc5a011a12 Mon Sep 17 00:00:00 2001 From: "Jason R. Sadler" Date: Fri, 9 Jul 2021 10:24:11 -0400 Subject: [PATCH 3/4] build: Update node to 16 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bce79bc..e3c8be1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v2.1.2 with: - node-version: 14.x + node-version: 16.x - name: Install dependencies run: yarn install From 6c4ae4d3ad872085290cd9b20d097898265b2a80 Mon Sep 17 00:00:00 2001 From: "Jason R. Sadler" Date: Fri, 9 Jul 2021 11:07:39 -0400 Subject: [PATCH 4/4] build: Added plugin-commonjs for rollup --- package.json | 1 + yarn.lock | 1596 ++------------------------------------------------ 2 files changed, 55 insertions(+), 1542 deletions(-) diff --git a/package.json b/package.json index c5c0e75..65598c4 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@babel/preset-env": "^7.14.4", "@commitlint/cli": "^12.1.1", "@commitlint/config-conventional": "^12.1.1", + "@rollup/plugin-commonjs": "^19.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.0.0", "@rollup/plugin-typescript": "^8.2.1", diff --git a/yarn.lock b/yarn.lock index 7b22e22..63af4f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -135,7 +135,7 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== @@ -868,13 +868,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz#761cb12ab5a88d640ad4af4aa81f820e6b5fdf5c" - integrity sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-transform-block-scoping@^7.14.4": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8" @@ -915,7 +908,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.13.0", "@babel/plugin-transform-destructuring@^7.13.17": +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.13.17": version "7.13.17" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== @@ -989,15 +982,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" - integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== - dependencies: - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helper-plugin-utils" "^7.13.0" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-amd@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz#589494b5b290ff76cf7f59c798011f6d77026553" @@ -1007,7 +991,16 @@ "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.14.0": +"@babel/plugin-transform-modules-amd@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" + integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== + dependencies: + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== @@ -1028,7 +1021,7 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.13.0", "@babel/plugin-transform-modules-umd@^7.14.0": +"@babel/plugin-transform-modules-umd@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== @@ -1265,81 +1258,6 @@ core-js-compat "^3.9.0" semver "^6.3.0" -"@babel/preset-env@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f" - integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA== - dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.14" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - core-js-compat "^3.9.0" - semver "^6.3.0" - "@babel/preset-env@^7.14.4": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d" @@ -1531,7 +1449,7 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@babel/types@^7.13.14", "@babel/types@^7.14.2": +"@babel/types@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== @@ -1820,46 +1738,7 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abstract-provider@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz#1f24c56cda5524ef4ed3cfc562a01d6b6f8eeb0b" - integrity sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/networks" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" - "@ethersproject/web" "^5.1.0" - -"@ethersproject/abstract-signer@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz#744c7a2d0ebe3cc0bc38294d0f53d5ca3f4e49e3" - integrity sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w== - dependencies: - "@ethersproject/abstract-provider" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - -"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.1.0": +"@ethersproject/address@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.1.0.tgz#3854fd7ebcb6af7597de66f847c3345dae735b58" integrity sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg== @@ -1870,14 +1749,7 @@ "@ethersproject/logger" "^5.1.0" "@ethersproject/rlp" "^5.1.0" -"@ethersproject/base64@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.1.0.tgz#27240c174d0a4e13f6eae87416fd876caf7f42b6" - integrity sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g== - dependencies: - "@ethersproject/bytes" "^5.1.0" - -"@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.1.0": +"@ethersproject/bignumber@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.1.0.tgz#966a013a5d871fc03fc67bf33cd8aadae627f0fd" integrity sha512-wUvQlhTjPjFXIdLPOuTrFeQmSa6Wvls1bGXQNQWvB/SEn1NsTCE8PmumIEZxmOPjSHl1eV2uyHP5jBm5Cgj92Q== @@ -1886,35 +1758,14 @@ "@ethersproject/logger" "^5.1.0" bn.js "^4.4.0" -"@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.1.0": +"@ethersproject/bytes@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.1.0.tgz#55dfa9c4c21df1b1b538be3accb50fb76d5facfd" integrity sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g== dependencies: "@ethersproject/logger" "^5.1.0" -"@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.1.0.tgz#4e7da6367ea0e9be87585d8b09f3fccf384b1452" - integrity sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - -"@ethersproject/hash@^5.0.4": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.1.0.tgz#40961d64837d57f580b7b055e0d74174876d891e" - integrity sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ== - dependencies: - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - -"@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.1.0": +"@ethersproject/keccak256@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.1.0.tgz#fdcd88fb13bfef4271b225cdd8dec4d315c8e60e" integrity sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig== @@ -1922,25 +1773,11 @@ "@ethersproject/bytes" "^5.1.0" js-sha3 "0.5.7" -"@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.1.0": +"@ethersproject/logger@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.1.0.tgz#4cdeeefac029373349d5818f39c31b82cc6d9bbf" integrity sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw== -"@ethersproject/networks@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.1.0.tgz#f537290cb05aa6dc5e81e910926c04cfd5814bca" - integrity sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA== - dependencies: - "@ethersproject/logger" "^5.1.0" - -"@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.1.0.tgz#9484bd6def16595fc6e4bdc26f29dff4d3f6ac42" - integrity sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg== - dependencies: - "@ethersproject/logger" "^5.1.0" - "@ethersproject/rlp@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.1.0.tgz#700f4f071c27fa298d3c1d637485fefe919dd084" @@ -1949,52 +1786,6 @@ "@ethersproject/bytes" "^5.1.0" "@ethersproject/logger" "^5.1.0" -"@ethersproject/signing-key@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.1.0.tgz#6eddfbddb6826b597b9650e01acf817bf8991b9c" - integrity sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw== - dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - bn.js "^4.4.0" - elliptic "6.5.4" - -"@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.1.0.tgz#0f95a56c3c8c9d5510a06c241d818779750e2da5" - integrity sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw== - dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - -"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.1.0.tgz#da7fcd7e77e23dcfcca317a945f60bc228c61b36" - integrity sha512-s10crRLZEA0Bgv6FGEl/AKkTw9f+RVUrlWDX1rHnD4ZncPFeiV2AJr4nT7QSUhxJdFPvjyKRDb3nEH27dIqcPQ== - dependencies: - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/rlp" "^5.1.0" - "@ethersproject/signing-key" "^5.1.0" - -"@ethersproject/web@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.1.0.tgz#ed56bbe4e3d9a8ffe3b2ed882da5c62d3551381b" - integrity sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA== - dependencies: - "@ethersproject/base64" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2905,24 +2696,6 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@mswjs/cookies@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.1.4.tgz#85ef872997eea2acd888f21af0b2067224dac244" - integrity sha512-gdtmSv21D4wHTnqF4rrZVX6ye7mQ4nRCTIHYnHBr4SkgoXaiqe3sMvUzXm43+H4PnL0EAKvUTxRVSSXz2xebeg== - dependencies: - "@types/set-cookie-parser" "^2.4.0" - set-cookie-parser "^2.4.6" - -"@mswjs/interceptors@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.8.1.tgz#8ef43a8b7b25c7b9a2bac67b3702167e25e5fc07" - integrity sha512-OI9FYmtURESZG3QDNz4Yt3osy3HY4T3FjlRw+AG4QS1UDdTSZ0tuPFAkp23nGR9ojmbSSj4gSMjf5+R8Oi/qtQ== - dependencies: - "@open-draft/until" "^1.0.3" - debug "^4.3.0" - headers-utils "^3.0.2" - strict-event-emitter "^0.2.0" - "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -3113,11 +2886,6 @@ dependencies: "@octokit/openapi-types" "^7.0.0" -"@open-draft/until@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" - integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== - "@pmmmwh/react-refresh-webpack-plugin@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" @@ -3145,10 +2913,10 @@ prop-types "^15.6.1" react-lifecycles-compat "^3.0.4" -"@rollup/plugin-commonjs@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-18.0.0.tgz#50dc7518b5aa9e66a270e529ea85115d269825c4" - integrity sha512-fj92shhg8luw7XbA0HowAqz90oo7qtLGwqTKbyZ8pmOyH8ui5e+u0wPEgeHLH3djcVma6gUCUrjY6w5R2o1u6g== +"@rollup/plugin-commonjs@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.0.tgz#8c3e71f9a66908e60d70cc1be205834ef3e45f71" + integrity sha512-adTpD6ATGbehdaQoZQ6ipDFhdjqsTgpOAhFiPwl+dzre4pPshsecptDPyEFb61JMJ1+mGljktaC4jI8ARMSNyw== dependencies: "@rollup/pluginutils" "^3.1.0" commondir "^1.0.1" @@ -3158,14 +2926,6 @@ magic-string "^0.25.7" resolve "^1.17.0" -"@rollup/plugin-image@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@rollup/plugin-image/-/plugin-image-2.0.6.tgz#2e6d7a72b25df81aa80c8c0866d45a45c1e6a265" - integrity sha512-bB+spXogbPiFjhBS7i8ajUOgOnVwWK3bnJ6VroxKey/q8/EPRkoSh+4O1qPCw97qMIDspF4TlzXVBhZ7nojIPw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - mini-svg-data-uri "^1.2.3" - "@rollup/plugin-json@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" @@ -3173,18 +2933,6 @@ dependencies: "@rollup/pluginutils" "^3.0.8" -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.19.0" - "@rollup/plugin-node-resolve@^13.0.0": version "13.0.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.0.tgz#352f07e430ff377809ec8ec8a6fd636547162dc4" @@ -3223,11 +2971,6 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -4019,13 +3762,6 @@ "@styled-system/core" "^5.1.2" "@styled-system/css" "^5.1.5" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@testing-library/dom@^7.28.1": version "7.31.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.0.tgz#938451abd3ca27e1b69bb395d4a40759fd7f5b3b" @@ -4110,13 +3846,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - "@types/braces@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb" @@ -4134,11 +3863,6 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/cookie@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108" - integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg== - "@types/estree@*": version "0.0.47" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" @@ -4194,14 +3918,6 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== -"@types/inquirer@^7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-7.3.1.tgz#1f231224e7df11ccfaf4cf9acbcc3b935fea292d" - integrity sha512-osD38QVIfcdgsPCT0V3lD7eH0OFurX71Jft18bZrsVQWVRt6TuxRzlr0GJLrxoHZR2V5ph7/qP8se/dcnI7o0g== - dependencies: - "@types/through" "*" - rxjs "^6.4.0" - "@types/is-function@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83" @@ -4226,7 +3942,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^26.0.22", "@types/jest@^26.0.23": +"@types/jest@*", "@types/jest@^26.0.23": version "26.0.23" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== @@ -4234,16 +3950,6 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/js-cookie@^2.2.6": - version "2.2.6" - resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" - integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== - -"@types/js-levenshtein@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.0.tgz#9541eec4ad6e3ec5633270a3a2b55d981edc44a9" - integrity sha512-14t0v1ICYRtRVcHASzes0v/O+TIeASb8aD55cWF1PidtInhFWSXcmhzhHqGjUWf9SUq1w70cvd1cWKUULubAfQ== - "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -4308,21 +4014,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== -"@types/node@^12.12.6": - version "12.20.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.10.tgz#4dcb8a85a8f1211acafb88d72fafc7e3d2685583" - integrity sha512-TxCmnSSppKBBOzYzPR2BR25YlX5Oay8z2XGwFBInuA/Co0V9xJhLlW4kjbxKtgeNo3NOMbQP1A5Rc03y+XecPw== - "@types/node@^14.0.10": version "14.14.44" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.44.tgz#df7503e6002847b834371c004b372529f3f85215" integrity sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA== -"@types/node@^14.14.39": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== - "@types/node@^15.12.2": version "15.12.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" @@ -4353,13 +4049,6 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - "@types/prettier@^2.0.0": version "2.2.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" @@ -4446,20 +4135,6 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== -"@types/secp256k1@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d" - integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A== - dependencies: - "@types/node" "*" - -"@types/set-cookie-parser@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.0.tgz#10cc0446bad372827671a5195fbd14ebce4a9baf" - integrity sha512-w7BFUq81sy7H/0jN0K5cax8MwRN6NOSURpY4YuO4+mOgoicxCZ33BUYz+gyF/sUf7uDl2We2yGJfppxzEXoAXQ== - dependencies: - "@types/node" "*" - "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -4498,13 +4173,6 @@ dependencies: "@types/jest" "*" -"@types/through@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" - integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== - dependencies: - "@types/node" "*" - "@types/uglify-js@*": version "3.13.0" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" @@ -5085,11 +4753,6 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array-filter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" - integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -5235,11 +4898,6 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -5268,13 +4926,6 @@ autoprefixer@^9.8.6: postcss "^7.0.32" postcss-value-parser "^4.1.0" -available-typed-arrays@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" - integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== - dependencies: - array-filter "^1.0.0" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -5493,19 +5144,12 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== - dependencies: - safe-buffer "^5.0.1" - base16@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -5552,11 +5196,6 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bignumber.js@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" - integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== - binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -5574,22 +5213,12 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -blakejs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" - integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= - -bluebird@^3.3.5, bluebird@^3.5.0, bluebird@^3.5.5: +bluebird@^3.3.5, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.9, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9, bn.js@^4.4.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -5599,7 +5228,7 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.0, body-parser@^1.16.0: +body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -5675,7 +5304,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -5764,22 +5393,6 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -5792,11 +5405,6 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -5811,21 +5419,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" - integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== - dependencies: - node-gyp-build "^4.2.0" - builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" @@ -5933,19 +5526,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -6150,17 +5730,6 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -6174,11 +5743,6 @@ cjs-module-lexer@^0.6.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -6269,13 +5833,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -6473,15 +6030,6 @@ content-disposition@0.5.3: dependencies: safe-buffer "5.1.2" -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -6598,16 +6146,6 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookie@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -cookiejar@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -6663,14 +6201,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -6784,7 +6314,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -crypto-browserify@3.12.0, crypto-browserify@^3.11.0: +crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== @@ -6917,14 +6447,6 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -6958,7 +6480,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.0, debug@^4.3.1: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -7000,13 +6522,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -7034,11 +6549,6 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -7333,11 +6843,6 @@ downshift@^6.0.15: prop-types "^15.7.2" react-is "^17.0.2" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -7378,7 +6883,7 @@ element-resize-detector@^1.2.2: dependencies: batch-processor "1.0.0" -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: +elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -7565,42 +7070,16 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - es5-shim@^4.5.13: version "4.5.15" resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.15.tgz#6a26869b261854a3b045273f5583c52d390217fe" integrity sha512-FYpuxEjMeDvU4rulKqFdukQyZSTpzhg4ScQHrAosrlVpR6GFyaw14f74yn2+4BugniIS0Frpg7TvwZocU4ZMTw== -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - es6-shim@^0.35.5: version "0.35.6" resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -7896,116 +7375,12 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eth-ens-namehash@2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -ethereum-bloom-filters@^1.0.6: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz#4a59dead803af0c9e33834170bd7695df67061ec" - integrity sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg== - dependencies: - js-sha3 "^0.8.0" - -ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" - integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== - -ethereumjs-tx@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== - dependencies: - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.0.0" - -ethereumjs-util@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0, events@^3.3.0: +events@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -8096,7 +7471,7 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" -express@^4.14.0, express@^4.17.1: +express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -8132,13 +7507,6 @@ express@^4.14.0, express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" -ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== - dependencies: - type "^2.0.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -8470,11 +7838,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -8579,15 +7942,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -8739,19 +8093,14 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -8908,7 +8257,7 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@^4.4.0, global@~4.4.0: +global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== @@ -8999,43 +8348,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -9050,7 +8362,7 @@ graphql-request@^3.4.0: extract-files "^9.0.0" form-data "^3.0.0" -graphql@^15.4.0, graphql@^15.5.0: +graphql@^15.5.0: version "15.5.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== @@ -9125,23 +8437,11 @@ has-glob@^1.0.0: dependencies: is-glob "^3.0.0" -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -9194,7 +8494,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -9275,11 +8575,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -headers-utils@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/headers-utils/-/headers-utils-3.0.2.tgz#dfc65feae4b0e34357308aefbcafa99c895e59ef" - integrity sha512-xAxZkM1dRyGV2Ou5bzMxBPNLoRCjcX+ya7KSWybQD2KwLphxsapUVK6x/02o7f4VU6GPSXch9vNY2+gkU8tYWQ== - highlight.js@^10.1.1, highlight.js@~10.7.0: version "10.7.2" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" @@ -9392,7 +8687,7 @@ htmlparser2@^3.10.1: inherits "^2.0.1" readable-stream "^3.1.1" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: +http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== @@ -9419,11 +8714,6 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -9509,14 +8799,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -9720,7 +9003,7 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-arguments@^1.0.4, is-arguments@^1.1.0: +is-arguments@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== @@ -9886,7 +9169,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1, is-function@^1.0.2: +is-function@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== @@ -9896,11 +9179,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" - integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== - is-glob@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -9922,11 +9200,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= - is-hexadecimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" @@ -10026,11 +9299,6 @@ is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.2" -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - is-root@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" @@ -10048,7 +9316,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -10077,17 +9345,6 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" - integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.2" - es-abstract "^1.18.0-next.2" - foreach "^2.0.5" - has-symbols "^1.0.1" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -10213,14 +9470,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - iterate-iterator@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" @@ -10614,26 +9863,11 @@ jest@^26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-cookie@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -js-sha3@0.5.7, js-sha3@^0.5.7: +js-sha3@0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" @@ -10699,11 +9933,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -10760,13 +9989,6 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -10804,21 +10026,6 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== -keccak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -11134,16 +10341,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lowlight@^1.14.0: version "1.20.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" @@ -11451,7 +10648,7 @@ mime-db@1.47.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.30" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== @@ -11473,11 +10670,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -11498,11 +10690,6 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-svg-data-uri@^1.2.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac" - integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA== - minimalistic-assert@^1.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" @@ -11644,14 +10831,7 @@ mkdirp-infer-owner@^2.0.0: infer-owner "^1.0.4" mkdirp "^1.0.3" -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -11663,11 +10843,6 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: dependencies: minimist "^1.2.5" -mock-fs@^4.1.0: - version "4.13.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.13.0.tgz#31c02263673ec3789f90eb7b6963676aa407a598" - integrity sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA== - modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -11705,70 +10880,6 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msw@^0.28.1: - version "0.28.1" - resolved "https://registry.yarnpkg.com/msw/-/msw-0.28.1.tgz#7fe487582221f7cca68dcc868511723f65bbd768" - integrity sha512-vkq1Oh7CZlQjdrVZdDJ0L5hPnUakwRKYXWRtTLh9uaD4sCzckEStSgqAgcvM7nxb3ViakcRu0BXKU6JQM1KxbA== - dependencies: - "@mswjs/cookies" "^0.1.4" - "@mswjs/interceptors" "^0.8.0" - "@open-draft/until" "^1.0.3" - "@types/cookie" "^0.4.0" - "@types/inquirer" "^7.3.1" - "@types/js-levenshtein" "^1.1.0" - chalk "^4.1.0" - chokidar "^3.4.2" - cookie "^0.4.1" - graphql "^15.4.0" - headers-utils "^3.0.2" - inquirer "^7.3.3" - js-levenshtein "^1.1.6" - node-fetch "^2.6.1" - node-match-path "^0.6.1" - statuses "^2.0.0" - strict-event-emitter "^0.1.0" - yargs "^16.2.0" - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -11790,11 +10901,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -11839,11 +10945,6 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -11857,11 +10958,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - node-dir@^0.1.10: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -11874,11 +10970,6 @@ node-fetch@2.6.1, node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-gyp-build@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" - integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== - node-gyp@^5.0.2: version "5.1.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -11946,11 +11037,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-match-path@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/node-match-path/-/node-match-path-0.6.3.tgz#55dd8443d547f066937a0752dce462ea7dc27551" - integrity sha512-fB1reOHKLRZCJMAka28hIxCwQLxGmd7WewOCBDYKpyA1KXi68A7vaGgdZAPhY2E6SXoYt3KqYCCvXLJ+O0Fu/Q== - node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" @@ -12030,11 +11116,6 @@ normalize-url@^3.3.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== - npm-bundled@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" @@ -12165,14 +11246,6 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -12183,7 +11256,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -12275,13 +11348,6 @@ objectorarray@^1.0.4: resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.4.tgz#d69b2f0ff7dc2701903d308bb85882f4ddb49483" integrity sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w== -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -12375,16 +11441,6 @@ p-all@^2.1.0: dependencies: p-map "^2.0.0" -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -12500,13 +11556,6 @@ p-reduce@^2.0.0, p-reduce@^2.1.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - p-timeout@^3.1.0, p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -12613,11 +11662,6 @@ parse-github-repo-url@^1.3.0: resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= -parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -12773,7 +11817,7 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.17, pbkdf2@^3.0.3: +pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -12985,16 +12029,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - prettier@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" @@ -13195,11 +12229,6 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= - punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -13237,15 +12266,6 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - query-string@^6.13.8: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -13977,7 +12997,7 @@ request-promise-native@^1.0.9: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.79.0, request@^2.88.0, request@^2.88.2: +request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -14068,13 +13088,6 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -14120,13 +13133,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== - dependencies: - bn.js "^4.11.1" - rollup@^2.47.0: version "2.47.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.47.0.tgz#9d958aeb2c0f6a383cacc0401dff02b6e252664d" @@ -14158,7 +13164,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.4.0, rxjs@^6.6.0: +rxjs@^6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -14258,20 +13264,6 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== - dependencies: - elliptic "^6.5.2" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" @@ -14356,27 +13348,11 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-cookie-parser@^2.4.6: - version "2.4.8" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz#d0da0ed388bc8f24e706a391f9c9e252a13c58b2" - integrity sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg== - set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -14474,20 +13450,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -14796,11 +13758,6 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -statuses@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -14843,23 +13800,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -strict-event-emitter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.1.0.tgz#fd742c1fb7e3852f0b964ecdae2d7666a6fb7ef8" - integrity sha512-8hSYfU+WKLdNcHVXJ0VxRXiPESalzRe7w1l8dg9+/22Ry+iZQUoQuoJ27R30GMD1TiyYINWsIEGY05WrskhSKw== - -strict-event-emitter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.0.tgz#78e2f75dc6ea502e5d8a877661065a1e2deedecd" - integrity sha512-zv7K2egoKwkQkZGEaH8m+i2D0XiKzx5jNsiSul6ja2IYFvil10A59Z9Y7PPAAe5OW53dQUf9CfsHKzjZzKkm1w== - dependencies: - events "^3.3.0" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -15024,13 +13964,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= - dependencies: - is-hex-prefixed "1.0.0" - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -15145,23 +14078,6 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" -swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -15194,7 +14110,7 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.0.2, tar@^4.4.12: +tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -15358,11 +14274,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" @@ -15414,11 +14325,6 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -15665,16 +14571,6 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -15707,11 +14603,6 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -15727,11 +14618,6 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -15867,7 +14753,7 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -15926,30 +14812,6 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -15982,18 +14844,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utf-8-validate@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" - integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== - dependencies: - node-gyp-build "^4.2.0" - -utf8@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -16028,18 +14878,6 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.0: - version "0.12.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" - integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -16055,11 +14893,6 @@ uuid-browser@^3.1.0: resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -16104,12 +14937,7 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: +vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -16209,246 +15037,6 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== -web3-bzz@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.5.tgz#f181a1319d9f867f4183b147e7aebd21aecff4a0" - integrity sha512-XiEUAbB1uKm/agqfwBsCW8fbw+sma85TfwuDpdcy591vinVk0S9TfWgLxro6v1KJ6nSELySIbKGbAJbh2GSyxw== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-core-helpers@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.5.tgz#9f0ff7ed40befb9f691986e66fd94c828c7b1b13" - integrity sha512-HYh3ix5FjysgT0jyzD8s/X5ym0b4BGU7I2QtuBiydMnE0mQEWy7GcT9XKpTySA8FTOHHIAQYvQS07DN/ky3UzA== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.3.5" - web3-utils "1.3.5" - -web3-core-method@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.5.tgz#995fe12f3b364469e5208a88d72736327b231faa" - integrity sha512-hCbmgQ+At6OTuaNGAdjXMsCr4eUCmp9yGKSuaB5HdkNVDpqFso4HHjVxcjNrTyJp3OZnyjKBzQzK1ZWLpLl84Q== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.3.5" - web3-core-promievent "1.3.5" - web3-core-subscriptions "1.3.5" - web3-utils "1.3.5" - -web3-core-promievent@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.5.tgz#33c34811cc4e2987c56e5192f9a014368c42ca39" - integrity sha512-K0j8x3ZJr0eAyNvyUCxOUsSTd4hco0/9nxxlyOuijcsa6YV8l9NL6eqhniWbSyxCJT8ka5Mb7yAiUZe69EDLBQ== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.5.tgz#c452ea85fcffdf5b82b84c250707b638790d0e75" - integrity sha512-9l294U3Ga8qmvv8E37BqjQREfMs+kFnkU3PY28g9DZGYzKvl3V1dgDYqxyrOBdCFhc7rNSpHdgC4PrVHjouspg== - dependencies: - underscore "1.9.1" - util "^0.12.0" - web3-core-helpers "1.3.5" - web3-providers-http "1.3.5" - web3-providers-ipc "1.3.5" - web3-providers-ws "1.3.5" - -web3-core-subscriptions@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.5.tgz#7c4dc9d559e344d852de2cf01bd0cc13c94023cb" - integrity sha512-6mtXdaEB1V1zKLqYBq7RF2W75AK5ZJNGpW6QYC7Zvbku7zq1ZlgaUkJo88JKMWJ7etfaHaYqQ/7VveHk5sQynA== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.3.5" - -web3-core@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.5.tgz#1e9335e6c4549dac09aaa07157242ebd6d097226" - integrity sha512-VQjTvnGTqJwDwjKEHSApea3RmgtFGLDSJ6bqrOyHROYNyTyKYjFQ/drG9zs3rjDkND9mgh8foI1ty37Qua3QCQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.3.5" - web3-core-method "1.3.5" - web3-core-requestmanager "1.3.5" - web3-utils "1.3.5" - -web3-eth-abi@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.5.tgz#eeffab0a4b318c47b8777de90983ca45614f8173" - integrity sha512-bkbG2v/mOW5DH6rF/SEgqunusjYoEi2IBw+fkmD3rzWDaEY7+/i1xY94AeO257d06QMgld75GtV/N+aEs7A6vQ== - dependencies: - "@ethersproject/abi" "5.0.7" - underscore "1.9.1" - web3-utils "1.3.5" - -web3-eth-accounts@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.5.tgz#c23ee748759a6a06d6485a9322b106baa944dcdd" - integrity sha512-r3WOR21rgm6Cd6OFnifr3Tizdm5K+g2TsSOPySwX4FrgLrYDL6ck4zr5VXUPz+llpSExb/JztpE8pqEHr3U2NA== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.3.5" - web3-core-helpers "1.3.5" - web3-core-method "1.3.5" - web3-utils "1.3.5" - -web3-eth-contract@1.3.5, web3-eth-contract@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.5.tgz#b41ecf8612b379c4fb1c614e950135717aa8f919" - integrity sha512-WfGVeQquN3D7Qm+KEIN9EI7yrm/fL2V9Y4+YhDWiKA/ns1pX1LYcEWojTOnBXCnPF3tcvoKKL+KBxXg1iKm38A== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.3.5" - web3-core-helpers "1.3.5" - web3-core-method "1.3.5" - web3-core-promievent "1.3.5" - web3-core-subscriptions "1.3.5" - web3-eth-abi "1.3.5" - web3-utils "1.3.5" - -web3-eth-ens@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.5.tgz#5a28d23eb402fb1f6964da60ea60641e4d24d366" - integrity sha512-5bkpFTXV18CvaVP8kCbLZZm2r1TWUv9AsXH+80yz8bTZulUGvXsBMRfK6e5nfEr2Yv59xlIXCFoalmmySI9EJw== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.3.5" - web3-core-helpers "1.3.5" - web3-core-promievent "1.3.5" - web3-eth-abi "1.3.5" - web3-eth-contract "1.3.5" - web3-utils "1.3.5" - -web3-eth-iban@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.5.tgz#dff1e37864e23a3387016ec4db96cdc290a6fbd6" - integrity sha512-x+BI/d2Vt0J1cKK8eFd4W0f1TDjgEOYCwiViTb28lLE+tqrgyPqWDA+l6UlKYLF/yMFX3Dym4ofcCOtgcn4q4g== - dependencies: - bn.js "^4.11.9" - web3-utils "1.3.5" - -web3-eth-personal@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.5.tgz#bc5d5b900bc4824139af2ef01eaf8e9855c644ba" - integrity sha512-xELQHNZ8p3VoO1582ghCaq+Bx7pSkOOalc6/ACOCGtHDMelqgVejrmSIZGScYl+k0HzngmQAzURZWQocaoGM1g== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.3.5" - web3-core-helpers "1.3.5" - web3-core-method "1.3.5" - web3-net "1.3.5" - web3-utils "1.3.5" - -web3-eth@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.5.tgz#2a3d0db870ef7921942a5d798ba0569175cc4de1" - integrity sha512-5qqDPMMD+D0xRqOV2ePU2G7/uQmhn0FgCEhFzKDMHrssDQJyQLW/VgfA0NLn64lWnuUrGnQStGvNxrWf7MgsfA== - dependencies: - underscore "1.9.1" - web3-core "1.3.5" - web3-core-helpers "1.3.5" - web3-core-method "1.3.5" - web3-core-subscriptions "1.3.5" - web3-eth-abi "1.3.5" - web3-eth-accounts "1.3.5" - web3-eth-contract "1.3.5" - web3-eth-ens "1.3.5" - web3-eth-iban "1.3.5" - web3-eth-personal "1.3.5" - web3-net "1.3.5" - web3-utils "1.3.5" - -web3-net@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.5.tgz#06e3465a9fbbeec1240160e2fd66ddb07b6af944" - integrity sha512-usbFbuUpKK8s7jPLGoUzi/WpNnefGFPTj948aJv8BZ04UQA4L/XS5NNkkhk358zNMmhGfEFW8wrWy+0Oy0njtA== - dependencies: - web3-core "1.3.5" - web3-core-method "1.3.5" - web3-utils "1.3.5" - -web3-providers-http@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.5.tgz#cdada6fb342e08fd75aea249fceb6eee467beffc" - integrity sha512-ZQOmceFjcajEZdiuqciXjijwIYWNmEJ1oxMtbrwB2eGxHRCMXEH2xGRUZuhOFNF88yQC/VXVi14yvYg5ZlFJlA== - dependencies: - web3-core-helpers "1.3.5" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.5.tgz#2f5536abfe03f3824e00dedc614d8f46db72b57f" - integrity sha512-cbZOeb/sALiHjzMolJjIyHla/J5wdL2JKUtRO66Nh/uLALBCpU8JUgzNvpAdJ1ae3+A33+EdFStdzuDYHKtQew== - dependencies: - oboe "2.1.5" - underscore "1.9.1" - web3-core-helpers "1.3.5" - -web3-providers-ws@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.5.tgz#7f841ec79358d90c4a803d1291157b5ffb15aeb7" - integrity sha512-zeZ4LMvKhYaJBDCqA//Bzgp4r/T0tNq5U/xvN0axA4YflzF7yqlsbzGwCkcZYDbrUaK3Ltl2uOmvwjbWALOZ1A== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.3.5" - websocket "^1.0.32" - -web3-shh@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.5.tgz#af0b8ebca90a3652dbbb90d351395f36ca91f40b" - integrity sha512-aRwzCduXvuGVslLL/Y15VcOHa70Qr2kxZI7UwOzQVhaaOdxuRRvo3AK/cmyln1Tsd54/n93Yk8I3qg5I2+6alw== - dependencies: - web3-core "1.3.5" - web3-core-method "1.3.5" - web3-core-subscriptions "1.3.5" - web3-net "1.3.5" - -web3-utils@1.3.5, web3-utils@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.5.tgz#14ee2ff1a7a226867698d6eaffd21aa97aed422e" - integrity sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.5.tgz#ef4c3a2241fdd74f2f7794e839f30bc6f9814e46" - integrity sha512-UyQW/MT5EIGBrXPCh/FDIaD7RtJTn5/rJUNw2FOglp0qoXnCQHNKvntiR1ylztk05fYxIF6UgsC76IrazlKJjw== - dependencies: - web3-bzz "1.3.5" - web3-core "1.3.5" - web3-eth "1.3.5" - web3-eth-personal "1.3.5" - web3-net "1.3.5" - web3-shh "1.3.5" - web3-utils "1.3.5" - webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -16537,18 +15125,6 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -16591,19 +15167,6 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which-typed-array@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" - integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.0" - es-abstract "^1.18.0-next.1" - foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" - which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -16731,15 +15294,6 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - ws@^7.4.4: version "7.4.5" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" @@ -16750,43 +15304,6 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -16812,11 +15329,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= - yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"