From cceefd63713562cfb70891c9b8a3e9f1a4c17bc4 Mon Sep 17 00:00:00 2001 From: gary <1032230992@qq.com> Date: Mon, 11 Apr 2022 15:02:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .commitlintrc.json | 11 + .eslintrc | 28 + .github/CODEOWNERS | 7 + .github/pull_request_template.md | 4 + .github/workflows/build.yml | 23 + .github/workflows/deploy-storybook.yml | 34 + .github/workflows/format.yml | 29 + .github/workflows/lint.yml | 23 + .github/workflows/test.yml | 22 + .github/workflows/tokenlist.yml | 27 + .gitignore | 19 + .prettierrc | 3 + CHANGELOG.md | 134 + README.md | 46 +- lerna.json | 13 + package.json | 66 + packages/eslint-config-pancake/CHANGELOG.md | 33 + packages/eslint-config-pancake/README.md | 15 + packages/eslint-config-pancake/lib/index.js | 58 + packages/eslint-config-pancake/package.json | 30 + packages/pancake-profile-sdk/CHANGELOG.md | 11 + packages/pancake-profile-sdk/README.md | 223 + packages/pancake-profile-sdk/babel.config.js | 6 + packages/pancake-profile-sdk/jest.config.js | 10 + packages/pancake-profile-sdk/jest.setup.js | 12 + packages/pancake-profile-sdk/package.json | 48 + packages/pancake-profile-sdk/rollup.config.js | 16 + .../pancake-profile-sdk/src/abi/erc721.json | 191 + .../src/abi/pancakeProfile.json | 717 + .../src/constants/__mocks__/nfts.ts | 71 + .../src/constants/campaigns.ts | 169 + .../src/constants/common.ts | 7 + .../src/constants/contracts.ts | 6 + .../pancake-profile-sdk/src/constants/nfts.ts | 308 + .../src/constants/teams.ts | 54 + .../src/images/chaotic-cakers-alt.png | Bin 0 -> 1942 bytes .../src/images/chaotic-cakers-bg.svg | 1 + .../src/images/chaotic-cakers-lg.png | Bin 0 -> 24506 bytes .../src/images/chaotic-cakers-md.png | Bin 0 -> 7042 bytes .../src/images/chaotic-cakers-sm.png | Bin 0 -> 1687 bytes .../src/images/fearsome-flippers-alt.png | Bin 0 -> 2095 bytes .../src/images/fearsome-flippers-bg.svg | 1 + .../src/images/fearsome-flippers-lg.png | Bin 0 -> 72285 bytes .../src/images/fearsome-flippers-md.png | Bin 0 -> 7000 bytes .../src/images/fearsome-flippers-sm.png | Bin 0 -> 1757 bytes .../src/images/images.d.ts | 2 + .../pancake-profile-sdk/src/images/index.ts | 17 + .../src/images/syrup-storm-alt.png | Bin 0 -> 2034 bytes .../src/images/syrup-storm-bg.svg | 1 + .../src/images/syrup-storm-lg.png | Bin 0 -> 80266 bytes .../src/images/syrup-storm-md.png | Bin 0 -> 7294 bytes .../src/images/syrup-storm-sm.png | Bin 0 -> 1641 bytes packages/pancake-profile-sdk/src/index.ts | 5 + .../pancake-profile-sdk/src/mocks/handlers.ts | 77 + .../src/mocks/mockAddresses.ts | 3 + .../pancake-profile-sdk/src/mocks/server.ts | 9 + .../src/profile-sdk.test.ts | 187 + .../pancake-profile-sdk/src/profile-sdk.ts | 172 + packages/pancake-profile-sdk/src/types.ts | 127 + .../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 | 76 + .../src/utils/contractHelpers.test.ts | 26 + .../src/utils/contractHelpers.ts | 18 + .../src/utils/getRpcUrl.test.ts | 16 + .../src/utils/getRpcUrl.ts | 19 + .../src/utils/transformHelpers.test.ts | 84 + .../src/utils/transformHelpers.ts | 53 + .../src/utils/web3.test.ts | 8 + .../pancake-profile-sdk/src/utils/web3.ts | 10 + packages/pancake-profile-sdk/tsconfig.json | 12 + packages/pancake-swap-sdk/.babelrc | 3 + .../pancake-swap-sdk/.github/workflows/CI.yml | 43 + packages/pancake-swap-sdk/.gitignore | 2 + packages/pancake-swap-sdk/.yarnrc | 1 + packages/pancake-swap-sdk/LICENSE | 21 + packages/pancake-swap-sdk/README.md | 53 + packages/pancake-swap-sdk/package.json | 58 + packages/pancake-swap-sdk/src/abis/ERC20.json | 20 + .../src/abis/IPancakePair.json | 707 + packages/pancake-swap-sdk/src/constants.ts | 57 + .../pancake-swap-sdk/src/declarations.d.ts | 1 + .../pancake-swap-sdk/src/entities/currency.ts | 37 + .../src/entities/fractions/currencyAmount.ts | 69 + .../src/entities/fractions/fraction.ts | 151 + .../src/entities/fractions/index.ts | 5 + .../src/entities/fractions/percent.ts | 14 + .../src/entities/fractions/price.ts | 76 + .../src/entities/fractions/tokenAmount.ts | 26 + .../pancake-swap-sdk/src/entities/index.ts | 7 + .../pancake-swap-sdk/src/entities/pair.ts | 229 + .../pancake-swap-sdk/src/entities/route.ts | 52 + .../pancake-swap-sdk/src/entities/token.ts | 85 + .../pancake-swap-sdk/src/entities/trade.ts | 411 + packages/pancake-swap-sdk/src/errors.ts | 30 + packages/pancake-swap-sdk/src/fetcher.ts | 75 + packages/pancake-swap-sdk/src/index.ts | 19 + packages/pancake-swap-sdk/src/router.ts | 144 + packages/pancake-swap-sdk/src/utils.ts | 78 + packages/pancake-swap-sdk/test/bytecode | 1 + .../pancake-swap-sdk/test/constants.test.ts | 18 + packages/pancake-swap-sdk/test/data.test.ts | 20 + .../pancake-swap-sdk/test/entities.test.ts | 188 + .../pancake-swap-sdk/test/fraction.test.ts | 128 + .../test/miscellaneous.test.ts | 173 + packages/pancake-swap-sdk/test/pair.test.ts | 118 + packages/pancake-swap-sdk/test/route.test.ts | 40 + packages/pancake-swap-sdk/test/router.test.ts | 241 + packages/pancake-swap-sdk/test/token.test.ts | 39 + packages/pancake-swap-sdk/test/trade.test.ts | 404 + packages/pancake-swap-sdk/tsconfig.json | 29 + packages/pancake-swap-sdk/yarn.lock | 6713 ++++++ packages/pancake-uikit/.storybook/main.js | 14 + .../.storybook/preview-head.html | 1 + packages/pancake-uikit/.storybook/preview.js | 32 + packages/pancake-uikit/CHANGELOG.md | 664 + packages/pancake-uikit/README.md | 40 + packages/pancake-uikit/babel.config.js | 4 + packages/pancake-uikit/jest.config.js | 8 + packages/pancake-uikit/package.json | 57 + packages/pancake-uikit/rollup.config.js | 12 + packages/pancake-uikit/src/ResetCSS.tsx | 117 + .../src/__tests__/components/alert.test.tsx | 102 + .../components/balanceinput.test.tsx | 120 + .../__tests__/components/breadcrumbs.test.tsx | 29 + .../src/__tests__/components/button.test.tsx | 73 + .../__tests__/components/buttonmenu.test.tsx | 172 + .../src/__tests__/components/card.test.tsx | 60 + .../__tests__/components/checkbox.test.tsx | 79 + .../__tests__/components/dropdown.test.tsx | 56 + .../components/fallingbunnies.test.tsx | 134 + .../src/__tests__/components/flex.test.tsx | 23 + .../src/__tests__/components/heading.test.tsx | 36 + .../src/__tests__/components/input.test.tsx | 60 + .../src/__tests__/components/layouts.test.tsx | 99 + .../src/__tests__/components/link.test.tsx | 109 + .../components/notificationdot.test.tsx | 44 + .../src/__tests__/components/overlay.test.tsx | 29 + .../components/pancaketoggle.test.tsx | 395 + .../__tests__/components/progress.test.tsx | 44 + .../src/__tests__/components/radio.test.tsx | 70 + .../__tests__/components/skeleton.test.tsx | 101 + .../src/__tests__/components/spinner.test.tsx | 146 + .../src/__tests__/components/svg.test.tsx | 36 + .../src/__tests__/components/tabmenu.test.tsx | 161 + .../src/__tests__/components/tag.test.tsx | 40 + .../src/__tests__/components/text.test.tsx | 24 + .../src/__tests__/components/toggle.test.tsx | 161 + .../__tests__/components/tokenimage.test.tsx | 58 + .../src/__tests__/widgets/menu.test.tsx | 1252 ++ .../src/__tests__/widgets/modal.test.tsx | 213 + .../__tests__/widgets/walletModal.test.tsx | 882 + .../src/components/Alert/Alert.tsx | 100 + .../src/components/Alert/index.stories.tsx | 67 + .../src/components/Alert/index.tsx | 3 + .../src/components/Alert/theme.ts | 10 + .../src/components/Alert/types.ts | 21 + .../components/BalanceInput/BalanceInput.tsx | 42 + .../components/BalanceInput/index.stories.tsx | 57 + .../src/components/BalanceInput/index.tsx | 2 + .../src/components/BalanceInput/styles.tsx | 29 + .../src/components/BalanceInput/types.ts | 12 + .../pancake-uikit/src/components/Box/Box.tsx | 13 + .../pancake-uikit/src/components/Box/Flex.tsx | 11 + .../pancake-uikit/src/components/Box/Grid.tsx | 12 + .../src/components/Box/index.stories.tsx | 58 + .../src/components/Box/index.tsx | 4 + .../pancake-uikit/src/components/Box/types.ts | 22 + .../components/Breadcrumbs/Breadcrumbs.tsx | 66 + .../components/Breadcrumbs/index.stories.tsx | 57 + .../src/components/Breadcrumbs/index.tsx | 2 + .../src/components/Breadcrumbs/types.ts | 5 + .../src/components/Button/Button.tsx | 51 + .../components/Button/ExpandableButton.tsx | 37 + .../src/components/Button/IconButton.tsx | 10 + .../src/components/Button/StyledButton.tsx | 85 + .../src/components/Button/index.stories.tsx | 160 + .../src/components/Button/index.tsx | 4 + .../src/components/Button/theme.ts | 56 + .../src/components/Button/types.ts | 50 + .../src/components/ButtonMenu/ButtonMenu.tsx | 54 + .../components/ButtonMenu/ButtonMenuItem.tsx | 32 + .../components/ButtonMenu/index.stories.tsx | 83 + .../src/components/ButtonMenu/index.tsx | 3 + .../src/components/ButtonMenu/types.ts | 14 + .../src/components/Card/Card.tsx | 13 + .../src/components/Card/CardBody.tsx | 14 + .../src/components/Card/CardFooter.tsx | 15 + .../src/components/Card/CardHeader.tsx | 18 + .../src/components/Card/CardRibbon.tsx | 67 + .../src/components/Card/StyledCard.tsx | 47 + .../src/components/Card/index.stories.tsx | 132 + .../src/components/Card/index.tsx | 6 + .../src/components/Card/theme.ts | 33 + .../src/components/Card/types.ts | 32 + .../src/components/Checkbox/Checkbox.tsx | 71 + .../src/components/Checkbox/index.stories.tsx | 21 + .../src/components/Checkbox/index.tsx | 2 + .../src/components/Checkbox/types.ts | 10 + .../src/components/Dropdown/Dropdown.tsx | 55 + .../src/components/Dropdown/index.stories.tsx | 39 + .../src/components/Dropdown/index.tsx | 2 + .../src/components/Dropdown/types.ts | 9 + .../FallingBunnies/FallingBunnies.tsx | 83 + .../FallingBunnies/index.stories.tsx | 12 + .../src/components/FallingBunnies/index.tsx | 2 + .../src/components/FallingBunnies/types.ts | 12 + .../src/components/Heading/Heading.tsx | 38 + .../src/components/Heading/index.stories.tsx | 34 + .../src/components/Heading/index.tsx | 2 + .../src/components/Heading/types.ts | 23 + .../src/components/Image/BackgroundImage.tsx | 42 + .../src/components/Image/Image.tsx | 57 + .../src/components/Image/TokenImage.tsx | 18 + .../src/components/Image/TokenPairImage.tsx | 32 + .../src/components/Image/Wrapper.tsx | 25 + .../src/components/Image/index.stories.tsx | 128 + .../src/components/Image/index.ts | 10 + .../src/components/Image/options.ts | 5 + .../src/components/Image/styles.tsx | 57 + .../src/components/Image/tokens.ts | 1546 ++ .../src/components/Image/types.ts | 31 + .../src/components/Input/Input.tsx | 70 + .../src/components/Input/index.stories.tsx | 41 + .../src/components/Input/index.tsx | 2 + .../src/components/Input/types.ts | 15 + .../src/components/Layouts/BaseLayout.tsx | 21 + .../src/components/Layouts/CardsLayout.tsx | 13 + .../src/components/Layouts/index.stories.tsx | 34 + .../src/components/Layouts/index.tsx | 2 + .../src/components/Link/Link.tsx | 25 + .../src/components/Link/LinkExternal.tsx | 15 + .../src/components/Link/index.stories.tsx | 49 + .../src/components/Link/index.tsx | 3 + .../src/components/Link/types.ts | 6 + .../src/components/Message/Message.tsx | 40 + .../src/components/Message/index.stories.tsx | 29 + .../src/components/Message/index.ts | 2 + .../src/components/Message/theme.ts | 12 + .../src/components/Message/types.ts | 12 + .../NotificationDot/NotificationDot.tsx | 30 + .../NotificationDot/index.stories.tsx | 49 + .../src/components/NotificationDot/index.tsx | 2 + .../src/components/NotificationDot/types.ts | 8 + .../src/components/Overlay/Overlay.tsx | 22 + .../src/components/Overlay/index.stories.tsx | 11 + .../src/components/Overlay/index.tsx | 2 + .../src/components/Overlay/types.ts | 4 + .../PancakeToggle/PancakeToggle.tsx | 23 + .../PancakeToggle/StyledPancakeToggle.tsx | 177 + .../PancakeToggle/index.stories.tsx | 24 + .../src/components/PancakeToggle/index.tsx | 2 + .../src/components/PancakeToggle/theme.ts | 12 + .../src/components/PancakeToggle/types.ts | 48 + .../src/components/Progress/Progress.tsx | 39 + .../Progress/ProgressBunnyWrapper.tsx | 12 + .../components/Progress/StyledProgress.tsx | 49 + .../src/components/Progress/index.stories.tsx | 81 + .../src/components/Progress/index.tsx | 2 + .../src/components/Progress/themes.ts | 21 + .../src/components/Progress/types.ts | 21 + .../src/components/Radio/Radio.tsx | 78 + .../src/components/Radio/index.stories.tsx | 38 + .../src/components/Radio/index.tsx | 2 + .../src/components/Radio/theme.ts | 10 + .../src/components/Radio/types.ts | 16 + .../src/components/Skeleton/Skeleton.tsx | 66 + .../src/components/Skeleton/index.stories.tsx | 51 + .../src/components/Skeleton/index.tsx | 2 + .../src/components/Skeleton/types.ts | 19 + .../src/components/Slider/Slider.tsx | 70 + .../src/components/Slider/index.stories.tsx | 96 + .../src/components/Slider/index.tsx | 2 + .../src/components/Slider/styles.ts | 103 + .../src/components/Slider/svg/bunny-full.svg | 33 + .../src/components/Slider/svg/bunnybutt.svg | 6 + .../components/Slider/svg/bunnyhead-main.svg | 29 + .../components/Slider/svg/bunnyhead-max.svg | 28 + .../src/components/Slider/types.ts | 12 + .../src/components/Spinner/PanIcon.tsx | 68 + .../src/components/Spinner/PancakeIcon.tsx | 32 + .../src/components/Spinner/Spinner.tsx | 54 + .../src/components/Spinner/index.stories.tsx | 12 + .../src/components/Spinner/index.tsx | 2 + .../src/components/Spinner/types.ts | 3 + .../src/components/Stepper/Step.tsx | 96 + .../src/components/Stepper/Stepper.tsx | 25 + .../src/components/Stepper/index.stories.tsx | 91 + .../src/components/Stepper/index.ts | 3 + .../src/components/Stepper/types.ts | 18 + .../src/components/Svg/Icons/Add.tsx | 13 + .../src/components/Svg/Icons/ArrowBack.tsx | 13 + .../src/components/Svg/Icons/ArrowDown.tsx | 13 + .../components/Svg/Icons/ArrowDropDown.tsx | 13 + .../src/components/Svg/Icons/ArrowDropUp.tsx | 13 + .../src/components/Svg/Icons/ArrowForward.tsx | 13 + .../src/components/Svg/Icons/ArrowUp.tsx | 13 + .../src/components/Svg/Icons/AutoRenew.tsx | 13 + .../src/components/Svg/Icons/Binance.tsx | 17 + .../src/components/Svg/Icons/Block.tsx | 13 + .../components/Svg/Icons/BnbUsdtPairToken.tsx | 38 + .../src/components/Svg/Icons/BunnyCards.tsx | 83 + .../components/Svg/Icons/BunnyPlaceholder.tsx | 75 + .../src/components/Svg/Icons/Calculate.tsx | 18 + .../src/components/Svg/Icons/CardView.tsx | 13 + .../src/components/Svg/Icons/Cards.tsx | 17 + .../src/components/Svg/Icons/Chart.tsx | 18 + .../src/components/Svg/Icons/Checkmark.tsx | 13 + .../components/Svg/Icons/CheckmarkCircle.tsx | 13 + .../src/components/Svg/Icons/ChevronDown.tsx | 13 + .../src/components/Svg/Icons/ChevronLeft.tsx | 13 + .../src/components/Svg/Icons/ChevronRight.tsx | 13 + .../src/components/Svg/Icons/ChevronUp.tsx | 13 + .../components/Svg/Icons/CircleOutline.tsx | 13 + .../src/components/Svg/Icons/Close.tsx | 13 + .../src/components/Svg/Icons/Cog.tsx | 13 + .../src/components/Svg/Icons/Community.tsx | 13 + .../src/components/Svg/Icons/Copy.tsx | 13 + .../src/components/Svg/Icons/Crown.tsx | 260 + .../src/components/Svg/Icons/Error.tsx | 13 + .../src/components/Svg/Icons/Help.tsx | 13 + .../src/components/Svg/Icons/History.tsx | 13 + .../src/components/Svg/Icons/Info.tsx | 13 + .../src/components/Svg/Icons/Language.tsx | 13 + .../src/components/Svg/Icons/LaurelLeft.tsx | 13 + .../src/components/Svg/Icons/LaurelRight.tsx | 13 + .../src/components/Svg/Icons/ListView.tsx | 13 + .../src/components/Svg/Icons/Logo.tsx | 38 + .../src/components/Svg/Icons/LogoRound.tsx | 43 + .../src/components/Svg/Icons/MedalBronze.tsx | 61 + .../src/components/Svg/Icons/MedalGold.tsx | 61 + .../src/components/Svg/Icons/MedalPurple.tsx | 61 + .../src/components/Svg/Icons/MedalSilver.tsx | 61 + .../src/components/Svg/Icons/MedalTeal.tsx | 61 + .../src/components/Svg/Icons/Metamask.tsx | 75 + .../src/components/Svg/Icons/Minus.tsx | 13 + .../components/Svg/Icons/NoProfileAvatar.tsx | 34 + .../src/components/Svg/Icons/OpenNew.tsx | 13 + .../src/components/Svg/Icons/PancakeRound.tsx | 118 + .../src/components/Svg/Icons/Pancakes.tsx | 113 + .../Svg/Icons/PlayCircleOutline.tsx | 13 + .../src/components/Svg/Icons/PocketWatch.tsx | 104 + .../src/components/Svg/Icons/PresentCheck.tsx | 63 + .../src/components/Svg/Icons/PresentNone.tsx | 49 + .../src/components/Svg/Icons/PresentWon.tsx | 109 + .../src/components/Svg/Icons/Prize.tsx | 13 + .../components/Svg/Icons/ProgressBunny.tsx | 20 + .../src/components/Svg/Icons/Proposal.tsx | 13 + .../src/components/Svg/Icons/Refresh.tsx | 13 + .../src/components/Svg/Icons/Remove.tsx | 13 + .../src/components/Svg/Icons/Search.tsx | 13 + .../src/components/Svg/Icons/StarFill.tsx | 17 + .../src/components/Svg/Icons/StarLine.tsx | 17 + .../src/components/Svg/Icons/SwapVert.tsx | 13 + .../src/components/Svg/Icons/SyncAlt.tsx | 17 + .../src/components/Svg/Icons/TeamPlayer.tsx | 136 + .../src/components/Svg/Icons/Testnet.tsx | 13 + .../src/components/Svg/Icons/Ticket.tsx | 82 + .../src/components/Svg/Icons/TicketRound.tsx | 101 + .../src/components/Svg/Icons/Timer.tsx | 13 + .../src/components/Svg/Icons/TrophyGold.tsx | 106 + .../src/components/Svg/Icons/Tune.tsx | 14 + .../src/components/Svg/Icons/Verified.tsx | 13 + .../components/Svg/Icons/VisibilityOff.tsx | 13 + .../src/components/Svg/Icons/VisibilityOn.tsx | 13 + .../src/components/Svg/Icons/VolumeOff.tsx | 13 + .../src/components/Svg/Icons/VolumeUp.tsx | 13 + .../src/components/Svg/Icons/Vote.tsx | 13 + .../src/components/Svg/Icons/Wait.tsx | 13 + .../src/components/Svg/Icons/Warning.tsx | 13 + .../pancake-uikit/src/components/Svg/Svg.tsx | 34 + .../src/components/Svg/index.stories.tsx | 68 + .../src/components/Svg/index.tsx | 82 + .../pancake-uikit/src/components/Svg/types.ts | 8 + .../src/components/TabMenu/Tab.tsx | 32 + .../src/components/TabMenu/TabMenu.tsx | 48 + .../src/components/TabMenu/index.stories.tsx | 69 + .../src/components/TabMenu/index.tsx | 3 + .../src/components/TabMenu/types.ts | 12 + .../src/components/Table/example/const.ts | 40 + .../src/components/Table/example/header.tsx | 22 + .../src/components/Table/hooks.tsx | 421 + .../src/components/Table/index.stories.tsx | 57 + .../src/components/Table/index.tsx | 3 + .../src/components/Table/types.ts | 143 + .../src/components/Table/utils.ts | 27 + .../src/components/Tag/StyledTag.tsx | 50 + .../pancake-uikit/src/components/Tag/Tag.tsx | 25 + .../src/components/Tag/index.stories.tsx | 46 + .../src/components/Tag/index.tsx | 2 + .../pancake-uikit/src/components/Tag/theme.ts | 41 + .../pancake-uikit/src/components/Tag/types.ts | 29 + .../src/components/Text/Text.tsx | 41 + .../src/components/Text/TooltipText.tsx | 9 + .../src/components/Text/index.stories.tsx | 78 + .../src/components/Text/index.tsx | 3 + .../src/components/Text/types.ts | 10 + .../src/components/Toggle/StyledToggle.tsx | 79 + .../src/components/Toggle/Toggle.tsx | 20 + .../src/components/Toggle/index.stories.tsx | 24 + .../src/components/Toggle/index.tsx | 2 + .../src/components/Toggle/theme.ts | 10 + .../src/components/Toggle/types.ts | 37 + .../src/components/Tooltip/theme.ts | 14 + .../src/components/Tooltip/types.ts | 5 + packages/pancake-uikit/src/hooks/index.ts | 4 + .../src/hooks/useKonamiCheatCode.stories.tsx | 20 + .../src/hooks/useKonamiCheatCode.ts | 37 + .../src/hooks/useMatchBreakpoints.stories.tsx | 17 + .../src/hooks/useMatchBreakpoints.ts | 84 + .../src/hooks/useParticleBurst.stories.tsx | 105 + .../src/hooks/useParticleBurst.ts | 146 + .../src/hooks/useTooltip/StyledTooltip.tsx | 46 + .../src/hooks/useTooltip/index.tsx | 3 + .../src/hooks/useTooltip/types.ts | 17 + .../hooks/useTooltip/useTooltip.stories.tsx | 346 + .../src/hooks/useTooltip/useTooltip.tsx | 205 + packages/pancake-uikit/src/index.ts | 45 + packages/pancake-uikit/src/setupTests.js | 2 + packages/pancake-uikit/src/styled.d.ts | 7 + packages/pancake-uikit/src/testHelpers.tsx | 48 + packages/pancake-uikit/src/theme/base.ts | 53 + packages/pancake-uikit/src/theme/colors.ts | 76 + packages/pancake-uikit/src/theme/dark.ts | 27 + packages/pancake-uikit/src/theme/index.ts | 35 + packages/pancake-uikit/src/theme/light.ts | 27 + packages/pancake-uikit/src/theme/types.ts | 75 + packages/pancake-uikit/src/types/index.d.ts | 4 + .../src/util/getExternalLinkProps.ts | 6 + .../pancake-uikit/src/util/getThemeValue.ts | 9 + .../pancake-uikit/src/widgets/Menu/Menu.tsx | 155 + .../src/widgets/Menu/components/Accordion.tsx | 78 + .../src/widgets/Menu/components/Avatar.tsx | 63 + .../src/widgets/Menu/components/CakePrice.tsx | 38 + .../widgets/Menu/components/LangSelector.tsx | 38 + .../src/widgets/Menu/components/Logo.tsx | 82 + .../widgets/Menu/components/MenuButton.tsx | 14 + .../src/widgets/Menu/components/MenuEntry.tsx | 82 + .../src/widgets/Menu/components/MenuLink.tsx | 13 + .../src/widgets/Menu/components/Panel.tsx | 48 + .../src/widgets/Menu/components/PanelBody.tsx | 88 + .../widgets/Menu/components/PanelFooter.tsx | 71 + .../widgets/Menu/components/SocialLinks.tsx | 37 + .../widgets/Menu/components/ThemeSwitcher.tsx | 29 + .../src/widgets/Menu/components/UserBlock.tsx | 47 + .../pancake-uikit/src/widgets/Menu/config.ts | 211 + .../src/widgets/Menu/icons/Farm.tsx | 24 + .../src/widgets/Menu/icons/Groups.tsx | 13 + .../src/widgets/Menu/icons/Hamburger.tsx | 13 + .../src/widgets/Menu/icons/HamburgerClose.tsx | 13 + .../src/widgets/Menu/icons/Home.tsx | 13 + .../src/widgets/Menu/icons/Ifo.tsx | 13 + .../src/widgets/Menu/icons/Info.tsx | 18 + .../src/widgets/Menu/icons/Logo.tsx | 87 + .../src/widgets/Menu/icons/Moon.tsx | 17 + .../src/widgets/Menu/icons/More.tsx | 13 + .../src/widgets/Menu/icons/Nft.tsx | 13 + .../src/widgets/Menu/icons/Pool.tsx | 18 + .../src/widgets/Menu/icons/Predictions.tsx | 18 + .../src/widgets/Menu/icons/Sun.tsx | 25 + .../src/widgets/Menu/icons/TeamBattle.tsx | 13 + .../src/widgets/Menu/icons/Telegram.tsx | 13 + .../src/widgets/Menu/icons/Ticket.tsx | 17 + .../src/widgets/Menu/icons/Trade.tsx | 17 + .../src/widgets/Menu/icons/Twitter.tsx | 13 + .../src/widgets/Menu/icons/index.ts | 19 + .../src/widgets/Menu/index.stories.tsx | 257 + .../pancake-uikit/src/widgets/Menu/index.ts | 3 + .../pancake-uikit/src/widgets/Menu/theme.ts | 10 + .../pancake-uikit/src/widgets/Menu/types.ts | 64 + .../pancake-uikit/src/widgets/Modal/Modal.tsx | 34 + .../src/widgets/Modal/ModalContext.tsx | 89 + .../src/widgets/Modal/index.stories.tsx | 137 + .../pancake-uikit/src/widgets/Modal/index.tsx | 5 + .../src/widgets/Modal/styles.tsx | 59 + .../pancake-uikit/src/widgets/Modal/theme.ts | 10 + .../pancake-uikit/src/widgets/Modal/types.ts | 20 + .../src/widgets/Modal/useModal.ts | 44 + .../pancake-uikit/src/widgets/Toast/Toast.tsx | 73 + .../src/widgets/Toast/ToastContainer.tsx | 49 + .../src/widgets/Toast/index.stories.tsx | 81 + .../pancake-uikit/src/widgets/Toast/index.tsx | 3 + .../pancake-uikit/src/widgets/Toast/types.ts | 31 + .../src/widgets/WalletModal/AccountModal.tsx | 47 + .../src/widgets/WalletModal/ConnectModal.tsx | 40 + .../widgets/WalletModal/CopyToClipboard.tsx | 70 + .../src/widgets/WalletModal/WalletCard.tsx | 37 + .../src/widgets/WalletModal/config.tsx | 55 + .../WalletModal/icons/BinanceChain.tsx | 44 + .../WalletModal/icons/Coin98Wallet.tsx | 37 + .../widgets/WalletModal/icons/MathWallet.tsx | 19 + .../widgets/WalletModal/icons/Metamask.tsx | 75 + .../WalletModal/icons/SafePalWallet.tsx | 17 + .../widgets/WalletModal/icons/TokenPocket.tsx | 21 + .../widgets/WalletModal/icons/TrustWallet.tsx | 30 + .../WalletModal/icons/WalletConnect.tsx | 20 + .../src/widgets/WalletModal/index.stories.tsx | 23 + .../src/widgets/WalletModal/index.tsx | 4 + .../src/widgets/WalletModal/types.ts | 16 + .../widgets/WalletModal/useWalletModal.tsx | 18 + packages/pancake-uikit/tsconfig.json | 20 + packages/token-lists/.eslintrc | 17 + packages/token-lists/CHANGELOG.md | 107 + packages/token-lists/README.md | 49 + packages/token-lists/babel.config.js | 6 + packages/token-lists/jest.config.js | 14 + ...7ea5c0ea75a8df45d288a4debdd5bb633f9e56.png | Bin 0 -> 1593 bytes ...9cb485212f996a9dbb85a9a75d898f94d38da6.png | Bin 0 -> 3755 bytes ...ff0ff224f904be3118461335064bb48df47938.png | Bin 0 -> 4685 bytes ...5c4324039dA91c52C55DF5D785385Aab073DcF.png | Bin 0 -> 2268 bytes ...BAf95Fd4C52fd09a56D840bAEe0AB8D7357bf0.png | Bin 0 -> 2509 bytes ...c747b40be4d535fc83d09939fb0f626f32800b.png | Bin 0 -> 3719 bytes ...aaa29e63ffeb2ebf59b33ee61437e1a91a3bb2.png | Bin 0 -> 7547 bytes ...3a21356793b49154fd3bbe91cbc2a16c0457f5.png | Bin 0 -> 3889 bytes ...8ce2a99bb6e3b7db580ed848240e4a0f9ae153.png | Bin 0 -> 7153 bytes ...9319565be7f53CeFE84Ad201Be3f40feAE2740.png | Bin 0 -> 13047 bytes ...a6ed8b13214ff28e9ca979dd37439e8a88f6c4.png | Bin 0 -> 1623 bytes ...09fabb73bd3ade0a17ecc321fd13a19e81ce82.png | Bin 0 -> 5857 bytes ...b3a705fc54725037cc9e008bdede697f62f335.png | Bin 0 -> 3113 bytes ...9e4d49f25de22c2202af916b681fbb3790497b.png | Bin 0 -> 5450 bytes ...1d82428437127bf1608f699cd651e6abf9766e.png | Bin 0 -> 1585 bytes ...03355742e76875154c0d13eb81dcd7711dc7d9.png | Bin 0 -> 2761 bytes ...016e85a25aeb13065688cafb43044c2ef86784.png | Bin 0 -> 1945 bytes ...13957159e9b0ac6c80e824f7eea748a32a0ae2.png | Bin 0 -> 8042 bytes ...939ef78684453bfdfb47825f8a5f714f12623a.png | Bin 0 -> 1496 bytes ...96ae0b0fa4862485106a0de9b654eFE301D0b2.png | Bin 0 -> 10854 bytes ...0b589cf9Fb8DDEabBFeae36a813FFb2A702454.png | Bin 0 -> 12342 bytes ...2fb0Af670D0234c2857FaD35b789F8Cb725584.png | Bin 0 -> 14481 bytes ...f3f329e8be154074d8769d1ffa4ee058b1dbc3.png | Bin 0 -> 1271 bytes ...a42e5193dfa8b03d15dd1b86a3113bbbef8eeb.png | Bin 0 -> 2229 bytes ...1eb8e8293222e1a29d2c0e4ce6c0acfd89aaac.png | Bin 0 -> 2081 bytes ...2f0da169ceb9fc7b3144628db156f3f6c60dbe.png | Bin 0 -> 1278 bytes ...7216fdb338247512ec99715587bb97bbf96eae.png | Bin 0 -> 5367 bytes ...fd0b47127fdd4097e54521c9e2c7f0d66aafc5.png | Bin 0 -> 1677 bytes ...90c8295769791ab7A3CF1CC6e0AA19F35e441A.png | Bin 0 -> 7542 bytes ...1ffbe424b90e25a15531ca322adf1559779e45.png | Bin 0 -> 1329 bytes ...70ed0880ac9a755fd29b2688956bd959f933f8.png | Bin 0 -> 1747 bytes ...22227e22102fe3322098e4cbfe18cfebd57c95.png | Bin 0 -> 1766 bytes ...396cF899Ca06c4472205fC903bDB4de249D6fC.png | Bin 0 -> 4079 bytes ...3d91A0713155003fc4DcE0AFa871b508B3B715.png | Bin 0 -> 2558 bytes ...e8a70534308a4AAF76fb8C32ec13d17a3BD89e.png | Bin 0 -> 3640 bytes ...0632378e573c6be1ac2f97fcdf00515d0aa91b.png | Bin 0 -> 8838 bytes ...0b211EE44459dAd5Cd3bCa803dD6a7EcB5d46C.png | Bin 0 -> 1138 bytes ...A528af62e56512A19ce8c3cAB427807c28CC19.png | Bin 0 -> 3103 bytes ...e9d05365c867e59c1904e7463af9f312296f9e.png | Bin 0 -> 2478 bytes ...a5dfab467d4f58fb266648cae769503cec9580.png | Bin 0 -> 1510 bytes ...A5dAF6Fe0708fBD63b1A7D1592577284f52256.png | Bin 0 -> 2918 bytes ...D1075682b0FCCaADd0Ca629e138E64015Ba11c.png | Bin 0 -> 9198 bytes ...D9a5C8C13b93955103B9a7C167B67Ef4d568a3.png | Bin 0 -> 2808 bytes ...03c9E46cA618C8C1cE5dC67e7e9D75f5da2377.png | Bin 0 -> 7279 bytes ...dfACfaeDA801437Ff648A1559d73f4C40aAcb7.png | Bin 0 -> 2875 bytes ...3B312C01048b3ed2720bF1B090084C09e408A1.png | Bin 0 -> 4946 bytes ...47B992DC0147D2D89dF0392213781b04B25075.png | Bin 0 -> 1890 bytes ...e2200efb3400fabb9aacf31297cbdd1d435d47.png | Bin 0 -> 1720 bytes ...da9383a84c05ec8f7630fe10adf1fac13241cc.png | Bin 0 -> 1172 bytes ...31b87f74415190425ccd873048c708f8005823.png | Bin 0 -> 1178 bytes ...712dF5009c20fee340B245b510c0395896cF6e.png | Bin 0 -> 2757 bytes ...f6f551ae042cbe50c739158b4f0cac0edb9096.png | Bin 0 -> 1978 bytes ...1e0cd023a32532bf3969cddfc002c00e98429d.png | Bin 0 -> 3671 bytes ...38665cbb7b2485a8855a139b75d5e34ab0db94.png | Bin 0 -> 1297 bytes ...754455564474a89358b2c2265883df993b12f0.png | Bin 0 -> 10308 bytes ...91937a7508860F876c9c0a2a617E7d9E945D4B.png | Bin 0 -> 2716 bytes ...bead2563dcbf3bf2c9407fea4dc236faba485a.png | Bin 0 -> 15046 bytes ...022089e78a8D46Ec87A3AF86a1Db6c189aFA6f.png | Bin 0 -> 4383 bytes ...A0057f784858a48fe351445C672FF2a3d43515.png | Bin 0 -> 2197 bytes ...A7163E153419E0E1064e418dd7A99314Ed27b6.png | Bin 0 -> 31419 bytes ...080377f83D669D7bB83B3184a8A5E61B500608.png | Bin 0 -> 6432 bytes ...0f1812e5df2a09796481ff14017e6005508003.png | Bin 0 -> 3637 bytes ...d17003473389a42daf6a0a729f6fdb328bbbd7.png | Bin 0 -> 1441 bytes ...fbbdfbd5bf0814472ff35c72717bd095ada055.png | Bin 0 -> 1460 bytes ...6415a5727ea08aae4580057187923aec331227.png | Bin 0 -> 2473 bytes ...840AADD28DA189B9906674B4Afcb77C128d9ea.png | Bin 0 -> 5632 bytes ...ce071bd9b1c4b00a0b92d298c512478cad67e8.png | Bin 0 -> 1527 bytes ...1e619858737031a1244a5d0cd47e5ef480342c.png | Bin 0 -> 2809 bytes ...12014efa6Cd57764Fa743756F7a6Ce3358cC83.png | Bin 0 -> 4429 bytes ...d398326f99059ff775485246999027b3197955.png | Bin 0 -> 1444 bytes ...21b5a3f4a8008c4ccdd1b942b121c8b1944f1f.png | Bin 0 -> 1385 bytes ...b6fb708fc5732dec1afc8d8556423a2edccbd6.png | Bin 0 -> 1781 bytes ...21dee8556c4593eefcfad3ca5e2f618606483b.png | Bin 0 -> 2480 bytes ...86d5c77c65e5801a5caa4fae80089f870a71da.png | Bin 0 -> 1956 bytes ...3010d4d8D3B5fB49f8B6E57FB9E48063f16700.png | Bin 0 -> 3860 bytes ...84ce30DC3cF7909101C69086c50De191895883.png | Bin 0 -> 37706 bytes ...88AB06e8dfe89DF127B2430Bba4Af600866035.png | Bin 0 -> 10057 bytes ...16E8cE8cA316407c6E6307095dc9540a8D62B3.png | Bin 0 -> 5291 bytes ...c52ee5b2a633895292ff6d8a89bb9190451587.png | Bin 0 -> 1833 bytes ...6dcf557e2abe2323c48445e8cc948910d8c2c9.png | Bin 0 -> 1165 bytes ...684adaf3fcfe9cfb5cede3abf02f0cdd1012e3.png | Bin 0 -> 1541 bytes ...D71B23bF15218C7d2D7E48DBbD9e9c650B173f.png | Bin 0 -> 1942 bytes ...870A18B6e42b01Ef1Ad8A2302ef50B7132054F.png | Bin 0 -> 1957 bytes ...8A109C5900BC6d2357c87549B651670E5b0539.png | Bin 0 -> 1347 bytes ...8E64FFcF40D240A43D52CA9342140316Ae44fA.png | Bin 0 -> 3160 bytes ...ee3cb086f8a16f34bee3ca72fad36f7db929e2.png | Bin 0 -> 1591 bytes ...5FD30aF473F2960e81Dc9bA7cB67679d35EDb7.png | Bin 0 -> 2165 bytes ...fF4Fb161347ad7de4A625AE5aa3A1CA7077819.png | Bin 0 -> 2247 bytes ...769e65c14ebd1f68817f5f1dcdb61cfa2d6f7e.png | Bin 0 -> 3964 bytes ...83609fce4d1d8dc0c979aab8c869ea2c873402.png | Bin 0 -> 1493 bytes ...30d2a12b9bcbfae4f2634d864a1ee1ce3ead9c.png | Bin 0 -> 1627 bytes ...DE20e0C4616E7fcBfDD3f875d568492cBE4739.png | Bin 0 -> 8423 bytes ...8C5baC3C3e370E372Fc4671f9ef6916b814d8B.png | Bin 0 -> 1516 bytes ...faa679e1008ad8382959ff48e392042a8b06f7.png | Bin 0 -> 2190 bytes ...8FB037A375F17c7e195CC634D77dA4F554255B.png | Bin 0 -> 3313 bytes ...2539b45a1dcce3d36d080f74d1aed37844b878.png | Bin 0 -> 2903 bytes ...650b139471520656b9e7aa7a5e9276814a38e9.png | Bin 0 -> 1576 bytes ...1da9f49224ef98389b071b8a3294d1cc5e3e6a.png | Bin 0 -> 1963 bytes ...9f28eb62c791422aa23ceae1da9c847cbec9b0.png | Bin 0 -> 6007 bytes ...f173f350d916358af3e218bdf2178494beb748.png | Bin 0 -> 2443 bytes ...396bfc8a2f84748701167c2d622f041a1d7a17.png | Bin 0 -> 21355 bytes ...70642d88cf1c4a3a7abb072b53b929b653eda5.png | Bin 0 -> 1617 bytes ...76c74c5e3f5852037f31ff0093eeb8c8add8d3.png | Bin 0 -> 3303 bytes ...d5f92c2c8c682070c95495313ddb680b267320.png | Bin 0 -> 4769 bytes ...0ee35443639348adbbc467b33310d2ab43c168.png | Bin 0 -> 3042 bytes ...859801b01764D4f0Fa5E64729f5a6C3b91435b.png | Bin 0 -> 27923 bytes ...43f091997f06a61670b735ed92734f5628692f.png | Bin 0 -> 1482 bytes ...4fa82f1e54824655470970f7004dd90546bb28.png | Bin 0 -> 4918 bytes ...19ea49c997f50ceffa444d240fb655e89248aa.png | Bin 0 -> 2222 bytes ...7b222fc79e1cbbf8ca5f78cb133d1b7cf34bbd.png | Bin 0 -> 3922 bytes ...95f9da7b868b1822194faed312235e43007b49.png | Bin 0 -> 27525 bytes ...eac5ac2f758618dfa09bdbe0cf174e7d574d5b.png | Bin 0 -> 5072 bytes ...f1a5ae2a3bf98aeaf342d26b30a79438c9142e.png | Bin 0 -> 9155 bytes ...c76a51cc950d9822d68b83fe1ad97b32cd580d.png | Bin 0 -> 9276 bytes ...d6e29d3686d24d3c2018cee54621ea0f89313b.png | Bin 0 -> 1714 bytes ...0528ce5ef7b51152a59745befdd91d97091d2f.png | Bin 0 -> 3208 bytes ...f795a6f4d97e7887c79bea79aba5cc76444adf.png | Bin 0 -> 1785 bytes ...8e55daB735aa8260AF3cEDadA18B5f70C72f1b.png | Bin 0 -> 3243 bytes ...7950bcc74888a40ffa2593c5798f11fc9124c4.png | Bin 0 -> 5655 bytes ...8d2a81086a075b3130bac19e4c6dee1d2e3fe8.png | Bin 0 -> 2338 bytes ...a1199EBA84ac5f19546519e287d43D2F0E1b41.png | Bin 0 -> 6606 bytes ...058f8c3e16576d9bd68766f3836d9a33158f89.png | Bin 0 -> 1605 bytes ...17857e191354dbea0b714d78bc59e57c411087.png | Bin 0 -> 4299 bytes ...78e42cebeb63f23197d726b29b1cb20d0064e5.png | Bin 0 -> 3500 bytes ...dd399f9c3afda1f194182f71600f1b65946501.png | Bin 0 -> 3852 bytes ...99a98b222fcb2f3dbee7df45d943093a4ff9ff.png | Bin 0 -> 3904 bytes ...882567A62a5560d147d64871776EeA72Df41D3.png | Bin 0 -> 3562 bytes ...dc3ae5c814b79dcA2556564047C5e7e5449C19.png | Bin 0 -> 6110 bytes ...319b959e33369C5eaA494a770117eE3e585318.png | Bin 0 -> 4255 bytes ...589e3eabe42ebc94a44727b3f3531c0c877809.png | Bin 0 -> 1801 bytes ...434F1FC3F437fa33F7a781E041961C0205B5Da.png | Bin 0 -> 9628 bytes ...120b9e674d3fC3875f415A7DF52e382F141225.png | Bin 0 -> 8775 bytes ...4E638E60D154B43f660a6BF8fD8a3b249a6a21.png | Bin 0 -> 3865 bytes ...7754f5b4C704A24d2db68e661b2875a4dDD197.png | Bin 0 -> 16188 bytes ...eFf7749b125444953ef89682201Fb8c6A917CD.png | Bin 0 -> 1273 bytes ...d8D35EBA58a0935ff2D5a33Df105DD9f071731.png | Bin 0 -> 3595 bytes ...3F508B8e4Dd382eE878A314789373D80A5190A.png | Bin 0 -> 9790 bytes ...e6c2A48BFAA66b43815c5548b10800919c993E.png | Bin 0 -> 2641 bytes ...021b1B247fe2F1fa57e0A87C748Cc1E321F07F.png | Bin 0 -> 2200 bytes ...e514c71282b6f4e823703a39374Cf58dc3eA4f.png | Bin 0 -> 1555 bytes ...9801669C6138E84bD50dEB500827b776777d28.png | Bin 0 -> 8544 bytes ...15A127A196e3988C09d052e16BcFD365Cd7AA3.png | Bin 0 -> 1730 bytes ...5262a9d427F96d2437379eF090db986eaE5d42.png | Bin 0 -> 4850 bytes ...4F060077D90Fe2647B61e4dA4aD1F97d6649dc.png | Bin 0 -> 1759 bytes ...303e6199b319a891b79685f0537d289af1fc83.png | Bin 0 -> 7164 bytes ...84088a740c695e156f91f5cc086a06bb78b827.png | Bin 0 -> 16717 bytes ...faa113cbe53436df28ff0aee54275c13b40975.png | Bin 0 -> 1917 bytes ...B726B1145A4773F68593CF171187d8EBe4d495.png | Bin 0 -> 21900 bytes ...f552078dcc247c2684336020c03648500c6d9f.png | Bin 0 -> 6128 bytes ...c2b8eec3d368c0253ad3dae65a5f2bbb89c929.png | Bin 0 -> 6296 bytes ...c41A46a6B3531d28d5c32F6633dd2fF05dFB90.png | Bin 0 -> 4392 bytes ...9E582e5751d703F85912903bacADdFed26484C.png | Bin 0 -> 1806 bytes ...aE871B7E3b67aEeC6B46AE9FE1A91660AadAC5.png | Bin 0 -> 5204 bytes ...51066d7bec65dc4589368da368b212745d63e8.png | Bin 0 -> 3410 bytes ...6caeb32cd2c308980a548bd0bc5aa4306c6c18.png | Bin 0 -> 1405 bytes ...9269f27437f0fcbc232d39ec814844a51d6b8f.png | Bin 0 -> 7165 bytes ...f0d72a118ce24fee3cd1d43d383897d05b4e99.png | Bin 0 -> 4788 bytes ...53d56ff99f1322515e54fdde93ff8b3b7dafd5.png | Bin 0 -> 4930 bytes ...bd0749dbe21f623d9baba856d3b0f0e1bfec9c.png | Bin 0 -> 1361 bytes ...9490ab09a0f526cc7305822ac65f2ab12f9723.png | Bin 0 -> 3053 bytes ...6abcb37c3a4b64f74f59301aff131a1becc787.png | Bin 0 -> 1611 bytes ...C540d00dd0Bf76ea12E4B4B95eFC90804f924E.png | Bin 0 -> 14188 bytes ...2aE424d960c26247Dd6c32edC70B295c744C43.png | Bin 0 -> 2492 bytes ...4cdb9cbd36b01bd1cbaebf2de08d9173bc095c.png | Bin 0 -> 1454 bytes ...eb90cfb6fafa1f69aa130b7341089abeef5811.png | Bin 0 -> 5864 bytes ...5609612b7c44bef426de600b5fd1379db2ecf1.png | Bin 0 -> 6525 bytes ...f39f0edda668c58371e519af37ca705f2bfcbd.png | Bin 0 -> 2524 bytes ...2949f67dcdc549c6ebe98696449fa79d988a9f.png | Bin 0 -> 5406 bytes ...5140a22578168fd562dccf235e5d43a02ce9b1.png | Bin 0 -> 7785 bytes ...7c81fff98bbe61b40ed186e4afd6ddd01337fe.png | Bin 0 -> 2036 bytes ...a0841f7a90c4ce6643f651756ee340991f99d5.png | Bin 0 -> 5843 bytes ...3b7a43223bb9bf4b69bd68ab20ca1b79d81c75.png | Bin 0 -> 7873 bytes ...fed6eb39178a541d274e6fc748d48f0ca01cc3.png | Bin 0 -> 1416 bytes ...0c9a843e1c6d01b7578284a9028854f6683b1b.png | Bin 0 -> 1790 bytes ...3708664b99DF348dd27C3Ac0759d2DA9c40462.png | Bin 0 -> 3131 bytes ...a49b4cbe004b6fd55b30ba1de6ac360ff9765d.png | Bin 0 -> 26424 bytes ...e6689c9c8b02be7c49912ef19e79cf24977f03.png | Bin 0 -> 5519 bytes ...849e6fdb743d08faee3e34dd2d1bc69ea11a51.png | Bin 0 -> 1462 bytes ...40f2670cf58720b694968698a5514e924f742d.png | Bin 0 -> 2000 bytes ...6bb5389c92bdda8a3747ddb454cb7a64626c63.png | Bin 0 -> 8143 bytes ...1fdb03ba84762dd66a0af1a6c8540ff1ba5dfb.png | Bin 0 -> 1423 bytes ...cb328a82bdf5f03eb737f37fa6b370aef3e888.png | Bin 0 -> 5935 bytes ...acb0ab6fb34d24e8a67bfa14bf4d95d4c7af92.png | Bin 0 -> 1963 bytes ...f8cb622790b7f92686c722b02cab55592f152c.png | Bin 0 -> 2342 bytes ...2df9e3e622debdd69fb838bb799e3f168902c5.png | Bin 0 -> 3910 bytes ...d1f66215998786110ba0102ef558b22224c016.png | Bin 0 -> 990 bytes ...ae305ebe1abe663f261bc00534067c80ad677c.png | Bin 0 -> 1302 bytes ...50a593d09fbc8dcd557b5c88cea6946a8b404a.png | Bin 0 -> 5478 bytes ...0eaf5A997DFAe83739e035b005A33AfdCc6df5.png | Bin 0 -> 5242 bytes ...4f5cb844946c1f102bd25bbd87a5ab4ae89fbe.png | Bin 0 -> 9859 bytes ...92f64c582698b8572aaf765bdc426ac3aefb6b.png | Bin 0 -> 3230 bytes ...e7cea3dedca5984780bafc599bd69add087d56.png | Bin 0 -> 1282 bytes ...d49b26169e1b52c04cFd19FCf289405dF55F80.png | Bin 0 -> 5315 bytes ...a41281c24451168a37211f0bc2b8645af45092.png | Bin 0 -> 1286 bytes ...28a457a5a76596ac48d87c0f577020f6ea1c4c.png | Bin 0 -> 2505 bytes ...5e45ad22150677a017fbd94b84fbb63dc9b44c.png | Bin 0 -> 2217 bytes ...7a32Eb035b786898c00bB1C64d8c6F8E7a46D5.png | Bin 0 -> 2188 bytes ...e406c49c63abf358030a299c0e00118c4c6ba5.png | Bin 0 -> 3738 bytes ...1768ccbc73ea5b6fd3c687208a7c2def2d966e.png | Bin 0 -> 9498 bytes ...18184af829cf2b0019f8e6f0b2423498a36983.png | Bin 0 -> 2389 bytes ...07910a4c7bbc79691fd374889b36d8531b08e3.png | Bin 0 -> 1590 bytes ...9037f6f6be66832de4e7516be52826bc3cbcc4.png | Bin 0 -> 1045 bytes ...59Bf77cBe8699013d6Dbc7C2b926Aaf307F830.png | Bin 0 -> 1545 bytes ...a0bf9cf54bb92f17374d9e9a321e6a111a51bd.png | Bin 0 -> 1352 bytes ...CeC8d50f6c8ad3Fb6dcCEC577e05aA32B224FE.png | Bin 0 -> 3321 bytes ...e146bF3146100cfe5dB4129cf6C82b0eF4Ad8c.png | Bin 0 -> 1720 bytes ...7b3a77848f1c2d67e05e54d78d174a0c850335.png | Bin 0 -> 1387 bytes ...Eecbf8D7267757c2dc3d13D730E97E15BfdF7F.png | Bin 0 -> 2043 bytes .../lists/pancakeswap-default.json | 136 + .../lists/pancakeswap-extended.json | 1672 ++ .../lists/pancakeswap-top-100.json | 816 + .../token-lists/lists/pancakeswap-top-15.json | 136 + packages/token-lists/lists/token-lists.json | 20 + packages/token-lists/netlify.toml | 18 + packages/token-lists/package.json | 46 + packages/token-lists/rollup.config.js | 9 + packages/token-lists/src/buildList.ts | 107 + packages/token-lists/src/checksum.ts | 41 + packages/token-lists/src/ci-check.ts | 62 + packages/token-lists/src/index.ts | 26 + .../src/tokens/pancakeswap-default.json | 122 + .../src/tokens/pancakeswap-extended.json | 1658 ++ .../src/tokens/pancakeswap-top-100.json | 802 + .../src/tokens/pancakeswap-top-15.json | 122 + packages/token-lists/src/top-100.ts | 120 + packages/token-lists/test/default.test.ts | 188 + packages/token-lists/tsconfig.json | 13 + yarn.lock | 16816 ++++++++++++++++ 736 files changed, 57879 insertions(+), 30 deletions(-) create mode 100644 .commitlintrc.json create mode 100644 .eslintrc create mode 100644 .github/CODEOWNERS create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/deploy-storybook.yml create mode 100644 .github/workflows/format.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/tokenlist.yml create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 CHANGELOG.md create mode 100644 lerna.json create mode 100644 package.json create mode 100644 packages/eslint-config-pancake/CHANGELOG.md create mode 100644 packages/eslint-config-pancake/README.md create mode 100644 packages/eslint-config-pancake/lib/index.js create mode 100644 packages/eslint-config-pancake/package.json create mode 100644 packages/pancake-profile-sdk/CHANGELOG.md create mode 100644 packages/pancake-profile-sdk/README.md create mode 100644 packages/pancake-profile-sdk/babel.config.js create mode 100644 packages/pancake-profile-sdk/jest.config.js create mode 100644 packages/pancake-profile-sdk/jest.setup.js create mode 100644 packages/pancake-profile-sdk/package.json create mode 100644 packages/pancake-profile-sdk/rollup.config.js create mode 100644 packages/pancake-profile-sdk/src/abi/erc721.json create mode 100644 packages/pancake-profile-sdk/src/abi/pancakeProfile.json create mode 100644 packages/pancake-profile-sdk/src/constants/__mocks__/nfts.ts create mode 100644 packages/pancake-profile-sdk/src/constants/campaigns.ts create mode 100644 packages/pancake-profile-sdk/src/constants/common.ts create mode 100644 packages/pancake-profile-sdk/src/constants/contracts.ts create mode 100644 packages/pancake-profile-sdk/src/constants/nfts.ts create mode 100644 packages/pancake-profile-sdk/src/constants/teams.ts create mode 100644 packages/pancake-profile-sdk/src/images/chaotic-cakers-alt.png create mode 100644 packages/pancake-profile-sdk/src/images/chaotic-cakers-bg.svg create mode 100644 packages/pancake-profile-sdk/src/images/chaotic-cakers-lg.png create mode 100644 packages/pancake-profile-sdk/src/images/chaotic-cakers-md.png create mode 100644 packages/pancake-profile-sdk/src/images/chaotic-cakers-sm.png create mode 100644 packages/pancake-profile-sdk/src/images/fearsome-flippers-alt.png create mode 100644 packages/pancake-profile-sdk/src/images/fearsome-flippers-bg.svg create mode 100644 packages/pancake-profile-sdk/src/images/fearsome-flippers-lg.png create mode 100644 packages/pancake-profile-sdk/src/images/fearsome-flippers-md.png create mode 100644 packages/pancake-profile-sdk/src/images/fearsome-flippers-sm.png create mode 100644 packages/pancake-profile-sdk/src/images/images.d.ts create mode 100644 packages/pancake-profile-sdk/src/images/index.ts create mode 100644 packages/pancake-profile-sdk/src/images/syrup-storm-alt.png create mode 100644 packages/pancake-profile-sdk/src/images/syrup-storm-bg.svg create mode 100644 packages/pancake-profile-sdk/src/images/syrup-storm-lg.png create mode 100644 packages/pancake-profile-sdk/src/images/syrup-storm-md.png create mode 100644 packages/pancake-profile-sdk/src/images/syrup-storm-sm.png create mode 100644 packages/pancake-profile-sdk/src/index.ts create mode 100644 packages/pancake-profile-sdk/src/mocks/handlers.ts create mode 100644 packages/pancake-profile-sdk/src/mocks/mockAddresses.ts create mode 100644 packages/pancake-profile-sdk/src/mocks/server.ts create mode 100644 packages/pancake-profile-sdk/src/profile-sdk.test.ts create mode 100644 packages/pancake-profile-sdk/src/profile-sdk.ts create mode 100644 packages/pancake-profile-sdk/src/types.ts create mode 100644 packages/pancake-profile-sdk/src/utils/__mocks__/contractHelpers.ts create mode 100644 packages/pancake-profile-sdk/src/utils/addressHelpers.test.ts create mode 100644 packages/pancake-profile-sdk/src/utils/addressHelpers.ts create mode 100644 packages/pancake-profile-sdk/src/utils/collectibles.test.ts create mode 100644 packages/pancake-profile-sdk/src/utils/collectibles.ts create mode 100644 packages/pancake-profile-sdk/src/utils/contractHelpers.test.ts create mode 100644 packages/pancake-profile-sdk/src/utils/contractHelpers.ts create mode 100644 packages/pancake-profile-sdk/src/utils/getRpcUrl.test.ts create mode 100644 packages/pancake-profile-sdk/src/utils/getRpcUrl.ts create mode 100644 packages/pancake-profile-sdk/src/utils/transformHelpers.test.ts create mode 100644 packages/pancake-profile-sdk/src/utils/transformHelpers.ts create mode 100644 packages/pancake-profile-sdk/src/utils/web3.test.ts create mode 100644 packages/pancake-profile-sdk/src/utils/web3.ts create mode 100644 packages/pancake-profile-sdk/tsconfig.json create mode 100644 packages/pancake-swap-sdk/.babelrc create mode 100644 packages/pancake-swap-sdk/.github/workflows/CI.yml create mode 100644 packages/pancake-swap-sdk/.gitignore create mode 100644 packages/pancake-swap-sdk/.yarnrc create mode 100644 packages/pancake-swap-sdk/LICENSE create mode 100644 packages/pancake-swap-sdk/README.md create mode 100644 packages/pancake-swap-sdk/package.json create mode 100644 packages/pancake-swap-sdk/src/abis/ERC20.json create mode 100644 packages/pancake-swap-sdk/src/abis/IPancakePair.json create mode 100644 packages/pancake-swap-sdk/src/constants.ts create mode 100644 packages/pancake-swap-sdk/src/declarations.d.ts create mode 100644 packages/pancake-swap-sdk/src/entities/currency.ts create mode 100644 packages/pancake-swap-sdk/src/entities/fractions/currencyAmount.ts create mode 100644 packages/pancake-swap-sdk/src/entities/fractions/fraction.ts create mode 100644 packages/pancake-swap-sdk/src/entities/fractions/index.ts create mode 100644 packages/pancake-swap-sdk/src/entities/fractions/percent.ts create mode 100644 packages/pancake-swap-sdk/src/entities/fractions/price.ts create mode 100644 packages/pancake-swap-sdk/src/entities/fractions/tokenAmount.ts create mode 100644 packages/pancake-swap-sdk/src/entities/index.ts create mode 100644 packages/pancake-swap-sdk/src/entities/pair.ts create mode 100644 packages/pancake-swap-sdk/src/entities/route.ts create mode 100644 packages/pancake-swap-sdk/src/entities/token.ts create mode 100644 packages/pancake-swap-sdk/src/entities/trade.ts create mode 100644 packages/pancake-swap-sdk/src/errors.ts create mode 100644 packages/pancake-swap-sdk/src/fetcher.ts create mode 100644 packages/pancake-swap-sdk/src/index.ts create mode 100644 packages/pancake-swap-sdk/src/router.ts create mode 100644 packages/pancake-swap-sdk/src/utils.ts create mode 100644 packages/pancake-swap-sdk/test/bytecode create mode 100644 packages/pancake-swap-sdk/test/constants.test.ts create mode 100644 packages/pancake-swap-sdk/test/data.test.ts create mode 100644 packages/pancake-swap-sdk/test/entities.test.ts create mode 100644 packages/pancake-swap-sdk/test/fraction.test.ts create mode 100644 packages/pancake-swap-sdk/test/miscellaneous.test.ts create mode 100644 packages/pancake-swap-sdk/test/pair.test.ts create mode 100644 packages/pancake-swap-sdk/test/route.test.ts create mode 100644 packages/pancake-swap-sdk/test/router.test.ts create mode 100644 packages/pancake-swap-sdk/test/token.test.ts create mode 100644 packages/pancake-swap-sdk/test/trade.test.ts create mode 100644 packages/pancake-swap-sdk/tsconfig.json create mode 100644 packages/pancake-swap-sdk/yarn.lock create mode 100644 packages/pancake-uikit/.storybook/main.js create mode 100644 packages/pancake-uikit/.storybook/preview-head.html create mode 100644 packages/pancake-uikit/.storybook/preview.js create mode 100644 packages/pancake-uikit/CHANGELOG.md create mode 100644 packages/pancake-uikit/README.md create mode 100644 packages/pancake-uikit/babel.config.js create mode 100644 packages/pancake-uikit/jest.config.js create mode 100644 packages/pancake-uikit/package.json create mode 100644 packages/pancake-uikit/rollup.config.js create mode 100644 packages/pancake-uikit/src/ResetCSS.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/alert.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/balanceinput.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/breadcrumbs.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/button.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/buttonmenu.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/card.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/checkbox.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/dropdown.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/fallingbunnies.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/flex.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/heading.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/input.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/layouts.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/link.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/notificationdot.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/overlay.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/pancaketoggle.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/progress.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/radio.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/skeleton.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/spinner.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/svg.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/tabmenu.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/tag.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/text.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/toggle.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/components/tokenimage.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/widgets/menu.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/widgets/modal.test.tsx create mode 100644 packages/pancake-uikit/src/__tests__/widgets/walletModal.test.tsx create mode 100644 packages/pancake-uikit/src/components/Alert/Alert.tsx create mode 100644 packages/pancake-uikit/src/components/Alert/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Alert/index.tsx create mode 100644 packages/pancake-uikit/src/components/Alert/theme.ts create mode 100644 packages/pancake-uikit/src/components/Alert/types.ts create mode 100644 packages/pancake-uikit/src/components/BalanceInput/BalanceInput.tsx create mode 100644 packages/pancake-uikit/src/components/BalanceInput/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/BalanceInput/index.tsx create mode 100644 packages/pancake-uikit/src/components/BalanceInput/styles.tsx create mode 100644 packages/pancake-uikit/src/components/BalanceInput/types.ts create mode 100644 packages/pancake-uikit/src/components/Box/Box.tsx create mode 100644 packages/pancake-uikit/src/components/Box/Flex.tsx create mode 100644 packages/pancake-uikit/src/components/Box/Grid.tsx create mode 100644 packages/pancake-uikit/src/components/Box/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Box/index.tsx create mode 100644 packages/pancake-uikit/src/components/Box/types.ts create mode 100644 packages/pancake-uikit/src/components/Breadcrumbs/Breadcrumbs.tsx create mode 100644 packages/pancake-uikit/src/components/Breadcrumbs/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Breadcrumbs/index.tsx create mode 100644 packages/pancake-uikit/src/components/Breadcrumbs/types.ts create mode 100644 packages/pancake-uikit/src/components/Button/Button.tsx create mode 100644 packages/pancake-uikit/src/components/Button/ExpandableButton.tsx create mode 100644 packages/pancake-uikit/src/components/Button/IconButton.tsx create mode 100644 packages/pancake-uikit/src/components/Button/StyledButton.tsx create mode 100644 packages/pancake-uikit/src/components/Button/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Button/index.tsx create mode 100644 packages/pancake-uikit/src/components/Button/theme.ts create mode 100644 packages/pancake-uikit/src/components/Button/types.ts create mode 100644 packages/pancake-uikit/src/components/ButtonMenu/ButtonMenu.tsx create mode 100644 packages/pancake-uikit/src/components/ButtonMenu/ButtonMenuItem.tsx create mode 100644 packages/pancake-uikit/src/components/ButtonMenu/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/ButtonMenu/index.tsx create mode 100644 packages/pancake-uikit/src/components/ButtonMenu/types.ts create mode 100644 packages/pancake-uikit/src/components/Card/Card.tsx create mode 100644 packages/pancake-uikit/src/components/Card/CardBody.tsx create mode 100644 packages/pancake-uikit/src/components/Card/CardFooter.tsx create mode 100644 packages/pancake-uikit/src/components/Card/CardHeader.tsx create mode 100644 packages/pancake-uikit/src/components/Card/CardRibbon.tsx create mode 100644 packages/pancake-uikit/src/components/Card/StyledCard.tsx create mode 100644 packages/pancake-uikit/src/components/Card/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Card/index.tsx create mode 100644 packages/pancake-uikit/src/components/Card/theme.ts create mode 100644 packages/pancake-uikit/src/components/Card/types.ts create mode 100644 packages/pancake-uikit/src/components/Checkbox/Checkbox.tsx create mode 100644 packages/pancake-uikit/src/components/Checkbox/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Checkbox/index.tsx create mode 100644 packages/pancake-uikit/src/components/Checkbox/types.ts create mode 100644 packages/pancake-uikit/src/components/Dropdown/Dropdown.tsx create mode 100644 packages/pancake-uikit/src/components/Dropdown/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Dropdown/index.tsx create mode 100644 packages/pancake-uikit/src/components/Dropdown/types.ts create mode 100644 packages/pancake-uikit/src/components/FallingBunnies/FallingBunnies.tsx create mode 100644 packages/pancake-uikit/src/components/FallingBunnies/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/FallingBunnies/index.tsx create mode 100644 packages/pancake-uikit/src/components/FallingBunnies/types.ts create mode 100644 packages/pancake-uikit/src/components/Heading/Heading.tsx create mode 100644 packages/pancake-uikit/src/components/Heading/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Heading/index.tsx create mode 100644 packages/pancake-uikit/src/components/Heading/types.ts create mode 100644 packages/pancake-uikit/src/components/Image/BackgroundImage.tsx create mode 100644 packages/pancake-uikit/src/components/Image/Image.tsx create mode 100644 packages/pancake-uikit/src/components/Image/TokenImage.tsx create mode 100644 packages/pancake-uikit/src/components/Image/TokenPairImage.tsx create mode 100644 packages/pancake-uikit/src/components/Image/Wrapper.tsx create mode 100644 packages/pancake-uikit/src/components/Image/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Image/index.ts create mode 100644 packages/pancake-uikit/src/components/Image/options.ts create mode 100644 packages/pancake-uikit/src/components/Image/styles.tsx create mode 100644 packages/pancake-uikit/src/components/Image/tokens.ts create mode 100644 packages/pancake-uikit/src/components/Image/types.ts create mode 100644 packages/pancake-uikit/src/components/Input/Input.tsx create mode 100644 packages/pancake-uikit/src/components/Input/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Input/index.tsx create mode 100644 packages/pancake-uikit/src/components/Input/types.ts create mode 100644 packages/pancake-uikit/src/components/Layouts/BaseLayout.tsx create mode 100644 packages/pancake-uikit/src/components/Layouts/CardsLayout.tsx create mode 100644 packages/pancake-uikit/src/components/Layouts/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Layouts/index.tsx create mode 100644 packages/pancake-uikit/src/components/Link/Link.tsx create mode 100644 packages/pancake-uikit/src/components/Link/LinkExternal.tsx create mode 100644 packages/pancake-uikit/src/components/Link/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Link/index.tsx create mode 100644 packages/pancake-uikit/src/components/Link/types.ts create mode 100644 packages/pancake-uikit/src/components/Message/Message.tsx create mode 100644 packages/pancake-uikit/src/components/Message/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Message/index.ts create mode 100644 packages/pancake-uikit/src/components/Message/theme.ts create mode 100644 packages/pancake-uikit/src/components/Message/types.ts create mode 100644 packages/pancake-uikit/src/components/NotificationDot/NotificationDot.tsx create mode 100644 packages/pancake-uikit/src/components/NotificationDot/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/NotificationDot/index.tsx create mode 100644 packages/pancake-uikit/src/components/NotificationDot/types.ts create mode 100644 packages/pancake-uikit/src/components/Overlay/Overlay.tsx create mode 100644 packages/pancake-uikit/src/components/Overlay/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Overlay/index.tsx create mode 100644 packages/pancake-uikit/src/components/Overlay/types.ts create mode 100644 packages/pancake-uikit/src/components/PancakeToggle/PancakeToggle.tsx create mode 100644 packages/pancake-uikit/src/components/PancakeToggle/StyledPancakeToggle.tsx create mode 100644 packages/pancake-uikit/src/components/PancakeToggle/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/PancakeToggle/index.tsx create mode 100644 packages/pancake-uikit/src/components/PancakeToggle/theme.ts create mode 100644 packages/pancake-uikit/src/components/PancakeToggle/types.ts create mode 100644 packages/pancake-uikit/src/components/Progress/Progress.tsx create mode 100644 packages/pancake-uikit/src/components/Progress/ProgressBunnyWrapper.tsx create mode 100644 packages/pancake-uikit/src/components/Progress/StyledProgress.tsx create mode 100644 packages/pancake-uikit/src/components/Progress/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Progress/index.tsx create mode 100644 packages/pancake-uikit/src/components/Progress/themes.ts create mode 100644 packages/pancake-uikit/src/components/Progress/types.ts create mode 100644 packages/pancake-uikit/src/components/Radio/Radio.tsx create mode 100644 packages/pancake-uikit/src/components/Radio/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Radio/index.tsx create mode 100644 packages/pancake-uikit/src/components/Radio/theme.ts create mode 100644 packages/pancake-uikit/src/components/Radio/types.ts create mode 100644 packages/pancake-uikit/src/components/Skeleton/Skeleton.tsx create mode 100644 packages/pancake-uikit/src/components/Skeleton/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Skeleton/index.tsx create mode 100644 packages/pancake-uikit/src/components/Skeleton/types.ts create mode 100644 packages/pancake-uikit/src/components/Slider/Slider.tsx create mode 100644 packages/pancake-uikit/src/components/Slider/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Slider/index.tsx create mode 100644 packages/pancake-uikit/src/components/Slider/styles.ts create mode 100644 packages/pancake-uikit/src/components/Slider/svg/bunny-full.svg create mode 100644 packages/pancake-uikit/src/components/Slider/svg/bunnybutt.svg create mode 100644 packages/pancake-uikit/src/components/Slider/svg/bunnyhead-main.svg create mode 100644 packages/pancake-uikit/src/components/Slider/svg/bunnyhead-max.svg create mode 100644 packages/pancake-uikit/src/components/Slider/types.ts create mode 100644 packages/pancake-uikit/src/components/Spinner/PanIcon.tsx create mode 100644 packages/pancake-uikit/src/components/Spinner/PancakeIcon.tsx create mode 100644 packages/pancake-uikit/src/components/Spinner/Spinner.tsx create mode 100644 packages/pancake-uikit/src/components/Spinner/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Spinner/index.tsx create mode 100644 packages/pancake-uikit/src/components/Spinner/types.ts create mode 100644 packages/pancake-uikit/src/components/Stepper/Step.tsx create mode 100644 packages/pancake-uikit/src/components/Stepper/Stepper.tsx create mode 100644 packages/pancake-uikit/src/components/Stepper/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Stepper/index.ts create mode 100644 packages/pancake-uikit/src/components/Stepper/types.ts create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Add.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ArrowBack.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ArrowDown.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ArrowDropDown.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ArrowDropUp.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ArrowForward.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ArrowUp.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/AutoRenew.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Binance.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Block.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/BnbUsdtPairToken.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/BunnyCards.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/BunnyPlaceholder.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Calculate.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/CardView.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Cards.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Chart.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Checkmark.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/CheckmarkCircle.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ChevronDown.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ChevronLeft.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ChevronRight.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ChevronUp.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/CircleOutline.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Close.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Cog.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Community.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Copy.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Crown.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Error.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Help.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/History.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Info.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Language.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/LaurelLeft.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/LaurelRight.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ListView.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Logo.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/LogoRound.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/MedalBronze.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/MedalGold.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/MedalPurple.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/MedalSilver.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/MedalTeal.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Metamask.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Minus.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/NoProfileAvatar.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/OpenNew.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/PancakeRound.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Pancakes.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/PlayCircleOutline.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/PocketWatch.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/PresentCheck.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/PresentNone.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/PresentWon.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Prize.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/ProgressBunny.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Proposal.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Refresh.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Remove.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Search.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/StarFill.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/StarLine.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/SwapVert.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/SyncAlt.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/TeamPlayer.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Testnet.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Ticket.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/TicketRound.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Timer.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/TrophyGold.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Tune.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Verified.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/VisibilityOff.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/VisibilityOn.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/VolumeOff.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/VolumeUp.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Vote.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Wait.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Icons/Warning.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/Svg.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/index.tsx create mode 100644 packages/pancake-uikit/src/components/Svg/types.ts create mode 100644 packages/pancake-uikit/src/components/TabMenu/Tab.tsx create mode 100644 packages/pancake-uikit/src/components/TabMenu/TabMenu.tsx create mode 100644 packages/pancake-uikit/src/components/TabMenu/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/TabMenu/index.tsx create mode 100644 packages/pancake-uikit/src/components/TabMenu/types.ts create mode 100644 packages/pancake-uikit/src/components/Table/example/const.ts create mode 100644 packages/pancake-uikit/src/components/Table/example/header.tsx create mode 100644 packages/pancake-uikit/src/components/Table/hooks.tsx create mode 100644 packages/pancake-uikit/src/components/Table/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Table/index.tsx create mode 100644 packages/pancake-uikit/src/components/Table/types.ts create mode 100644 packages/pancake-uikit/src/components/Table/utils.ts create mode 100644 packages/pancake-uikit/src/components/Tag/StyledTag.tsx create mode 100644 packages/pancake-uikit/src/components/Tag/Tag.tsx create mode 100644 packages/pancake-uikit/src/components/Tag/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Tag/index.tsx create mode 100644 packages/pancake-uikit/src/components/Tag/theme.ts create mode 100644 packages/pancake-uikit/src/components/Tag/types.ts create mode 100644 packages/pancake-uikit/src/components/Text/Text.tsx create mode 100644 packages/pancake-uikit/src/components/Text/TooltipText.tsx create mode 100644 packages/pancake-uikit/src/components/Text/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Text/index.tsx create mode 100644 packages/pancake-uikit/src/components/Text/types.ts create mode 100644 packages/pancake-uikit/src/components/Toggle/StyledToggle.tsx create mode 100644 packages/pancake-uikit/src/components/Toggle/Toggle.tsx create mode 100644 packages/pancake-uikit/src/components/Toggle/index.stories.tsx create mode 100644 packages/pancake-uikit/src/components/Toggle/index.tsx create mode 100644 packages/pancake-uikit/src/components/Toggle/theme.ts create mode 100644 packages/pancake-uikit/src/components/Toggle/types.ts create mode 100644 packages/pancake-uikit/src/components/Tooltip/theme.ts create mode 100644 packages/pancake-uikit/src/components/Tooltip/types.ts create mode 100644 packages/pancake-uikit/src/hooks/index.ts create mode 100644 packages/pancake-uikit/src/hooks/useKonamiCheatCode.stories.tsx create mode 100644 packages/pancake-uikit/src/hooks/useKonamiCheatCode.ts create mode 100644 packages/pancake-uikit/src/hooks/useMatchBreakpoints.stories.tsx create mode 100644 packages/pancake-uikit/src/hooks/useMatchBreakpoints.ts create mode 100644 packages/pancake-uikit/src/hooks/useParticleBurst.stories.tsx create mode 100644 packages/pancake-uikit/src/hooks/useParticleBurst.ts create mode 100644 packages/pancake-uikit/src/hooks/useTooltip/StyledTooltip.tsx create mode 100644 packages/pancake-uikit/src/hooks/useTooltip/index.tsx create mode 100644 packages/pancake-uikit/src/hooks/useTooltip/types.ts create mode 100644 packages/pancake-uikit/src/hooks/useTooltip/useTooltip.stories.tsx create mode 100644 packages/pancake-uikit/src/hooks/useTooltip/useTooltip.tsx create mode 100644 packages/pancake-uikit/src/index.ts create mode 100644 packages/pancake-uikit/src/setupTests.js create mode 100644 packages/pancake-uikit/src/styled.d.ts create mode 100644 packages/pancake-uikit/src/testHelpers.tsx create mode 100644 packages/pancake-uikit/src/theme/base.ts create mode 100644 packages/pancake-uikit/src/theme/colors.ts create mode 100644 packages/pancake-uikit/src/theme/dark.ts create mode 100644 packages/pancake-uikit/src/theme/index.ts create mode 100644 packages/pancake-uikit/src/theme/light.ts create mode 100644 packages/pancake-uikit/src/theme/types.ts create mode 100644 packages/pancake-uikit/src/types/index.d.ts create mode 100644 packages/pancake-uikit/src/util/getExternalLinkProps.ts create mode 100644 packages/pancake-uikit/src/util/getThemeValue.ts create mode 100644 packages/pancake-uikit/src/widgets/Menu/Menu.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/Accordion.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/Avatar.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/CakePrice.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/LangSelector.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/Logo.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/MenuButton.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/MenuEntry.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/MenuLink.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/Panel.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/PanelBody.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/PanelFooter.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/SocialLinks.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/ThemeSwitcher.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/components/UserBlock.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/config.ts create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Farm.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Groups.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Hamburger.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/HamburgerClose.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Home.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Ifo.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Info.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Logo.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Moon.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/More.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Nft.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Pool.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Predictions.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Sun.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/TeamBattle.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Telegram.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Ticket.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Trade.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/Twitter.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/icons/index.ts create mode 100644 packages/pancake-uikit/src/widgets/Menu/index.stories.tsx create mode 100644 packages/pancake-uikit/src/widgets/Menu/index.ts create mode 100644 packages/pancake-uikit/src/widgets/Menu/theme.ts create mode 100644 packages/pancake-uikit/src/widgets/Menu/types.ts create mode 100644 packages/pancake-uikit/src/widgets/Modal/Modal.tsx create mode 100644 packages/pancake-uikit/src/widgets/Modal/ModalContext.tsx create mode 100644 packages/pancake-uikit/src/widgets/Modal/index.stories.tsx create mode 100644 packages/pancake-uikit/src/widgets/Modal/index.tsx create mode 100644 packages/pancake-uikit/src/widgets/Modal/styles.tsx create mode 100644 packages/pancake-uikit/src/widgets/Modal/theme.ts create mode 100644 packages/pancake-uikit/src/widgets/Modal/types.ts create mode 100644 packages/pancake-uikit/src/widgets/Modal/useModal.ts create mode 100644 packages/pancake-uikit/src/widgets/Toast/Toast.tsx create mode 100644 packages/pancake-uikit/src/widgets/Toast/ToastContainer.tsx create mode 100644 packages/pancake-uikit/src/widgets/Toast/index.stories.tsx create mode 100644 packages/pancake-uikit/src/widgets/Toast/index.tsx create mode 100644 packages/pancake-uikit/src/widgets/Toast/types.ts create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/AccountModal.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/ConnectModal.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/CopyToClipboard.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/WalletCard.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/config.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/BinanceChain.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/Coin98Wallet.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/MathWallet.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/Metamask.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/SafePalWallet.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/TokenPocket.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/TrustWallet.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/icons/WalletConnect.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/index.stories.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/index.tsx create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/types.ts create mode 100644 packages/pancake-uikit/src/widgets/WalletModal/useWalletModal.tsx create mode 100644 packages/pancake-uikit/tsconfig.json create mode 100644 packages/token-lists/.eslintrc create mode 100644 packages/token-lists/CHANGELOG.md create mode 100644 packages/token-lists/README.md create mode 100644 packages/token-lists/babel.config.js create mode 100644 packages/token-lists/jest.config.js create mode 100644 packages/token-lists/lists/images/0x007ea5c0ea75a8df45d288a4debdd5bb633f9e56.png create mode 100644 packages/token-lists/lists/images/0x039cb485212f996a9dbb85a9a75d898f94d38da6.png create mode 100644 packages/token-lists/lists/images/0x03ff0ff224f904be3118461335064bb48df47938.png create mode 100644 packages/token-lists/lists/images/0x045c4324039dA91c52C55DF5D785385Aab073DcF.png create mode 100644 packages/token-lists/lists/images/0x04BAf95Fd4C52fd09a56D840bAEe0AB8D7357bf0.png create mode 100644 packages/token-lists/lists/images/0x04c747b40be4d535fc83d09939fb0f626f32800b.png create mode 100644 packages/token-lists/lists/images/0x07aaa29e63ffeb2ebf59b33ee61437e1a91a3bb2.png create mode 100644 packages/token-lists/lists/images/0x0a3a21356793b49154fd3bbe91cbc2a16c0457f5.png create mode 100644 packages/token-lists/lists/images/0x0d8ce2a99bb6e3b7db580ed848240e4a0f9ae153.png create mode 100644 packages/token-lists/lists/images/0x0d9319565be7f53CeFE84Ad201Be3f40feAE2740.png create mode 100644 packages/token-lists/lists/images/0x0da6ed8b13214ff28e9ca979dd37439e8a88f6c4.png create mode 100644 packages/token-lists/lists/images/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82.png create mode 100644 packages/token-lists/lists/images/0x0eb3a705fc54725037cc9e008bdede697f62f335.png create mode 100644 packages/token-lists/lists/images/0x0f9e4d49f25de22c2202af916b681fbb3790497b.png create mode 100644 packages/token-lists/lists/images/0x101d82428437127bf1608f699cd651e6abf9766e.png create mode 100644 packages/token-lists/lists/images/0x1203355742e76875154c0d13eb81dcd7711dc7d9.png create mode 100644 packages/token-lists/lists/images/0x14016e85a25aeb13065688cafb43044c2ef86784.png create mode 100644 packages/token-lists/lists/images/0x1613957159e9b0ac6c80e824f7eea748a32a0ae2.png create mode 100644 packages/token-lists/lists/images/0x16939ef78684453bfdfb47825f8a5f714f12623a.png create mode 100644 packages/token-lists/lists/images/0x1796ae0b0fa4862485106a0de9b654eFE301D0b2.png create mode 100644 packages/token-lists/lists/images/0x190b589cf9Fb8DDEabBFeae36a813FFb2A702454.png create mode 100644 packages/token-lists/lists/images/0x1A2fb0Af670D0234c2857FaD35b789F8Cb725584.png create mode 100644 packages/token-lists/lists/images/0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3.png create mode 100644 packages/token-lists/lists/images/0x1ba42e5193dfa8b03d15dd1b86a3113bbbef8eeb.png create mode 100644 packages/token-lists/lists/images/0x1d1eb8e8293222e1a29d2c0e4ce6c0acfd89aaac.png create mode 100644 packages/token-lists/lists/images/0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe.png create mode 100644 packages/token-lists/lists/images/0x1f7216fdb338247512ec99715587bb97bbf96eae.png create mode 100644 packages/token-lists/lists/images/0x1ffd0b47127fdd4097e54521c9e2c7f0d66aafc5.png create mode 100644 packages/token-lists/lists/images/0x2090c8295769791ab7A3CF1CC6e0AA19F35e441A.png create mode 100644 packages/token-lists/lists/images/0x211ffbe424b90e25a15531ca322adf1559779e45.png create mode 100644 packages/token-lists/lists/images/0x2170ed0880ac9a755fd29b2688956bd959f933f8.png create mode 100644 packages/token-lists/lists/images/0x2222227e22102fe3322098e4cbfe18cfebd57c95.png create mode 100644 packages/token-lists/lists/images/0x23396cF899Ca06c4472205fC903bDB4de249D6fC.png create mode 100644 packages/token-lists/lists/images/0x233d91A0713155003fc4DcE0AFa871b508B3B715.png create mode 100644 packages/token-lists/lists/images/0x23e8a70534308a4AAF76fb8C32ec13d17a3BD89e.png create mode 100644 packages/token-lists/lists/images/0x250632378e573c6be1ac2f97fcdf00515d0aa91b.png create mode 100644 packages/token-lists/lists/images/0x250b211EE44459dAd5Cd3bCa803dD6a7EcB5d46C.png create mode 100644 packages/token-lists/lists/images/0x25A528af62e56512A19ce8c3cAB427807c28CC19.png create mode 100644 packages/token-lists/lists/images/0x25e9d05365c867e59c1904e7463af9f312296f9e.png create mode 100644 packages/token-lists/lists/images/0x26a5dfab467d4f58fb266648cae769503cec9580.png create mode 100644 packages/token-lists/lists/images/0x2FA5dAF6Fe0708fBD63b1A7D1592577284f52256.png create mode 100644 packages/token-lists/lists/images/0x2cD1075682b0FCCaADd0Ca629e138E64015Ba11c.png create mode 100644 packages/token-lists/lists/images/0x2eD9a5C8C13b93955103B9a7C167B67Ef4d568a3.png create mode 100644 packages/token-lists/lists/images/0x3203c9E46cA618C8C1cE5dC67e7e9D75f5da2377.png create mode 100644 packages/token-lists/lists/images/0x37dfACfaeDA801437Ff648A1559d73f4C40aAcb7.png create mode 100644 packages/token-lists/lists/images/0x393B312C01048b3ed2720bF1B090084C09e408A1.png create mode 100644 packages/token-lists/lists/images/0x3947B992DC0147D2D89dF0392213781b04B25075.png create mode 100644 packages/token-lists/lists/images/0x3ee2200efb3400fabb9aacf31297cbdd1d435d47.png create mode 100644 packages/token-lists/lists/images/0x3fda9383a84c05ec8f7630fe10adf1fac13241cc.png create mode 100644 packages/token-lists/lists/images/0x4131b87f74415190425ccd873048c708f8005823.png create mode 100644 packages/token-lists/lists/images/0x42712dF5009c20fee340B245b510c0395896cF6e.png create mode 100644 packages/token-lists/lists/images/0x42f6f551ae042cbe50c739158b4f0cac0edb9096.png create mode 100644 packages/token-lists/lists/images/0x431e0cd023a32532bf3969cddfc002c00e98429d.png create mode 100644 packages/token-lists/lists/images/0x4338665cbb7b2485a8855a139b75d5e34ab0db94.png create mode 100644 packages/token-lists/lists/images/0x44754455564474a89358b2c2265883df993b12f0.png create mode 100644 packages/token-lists/lists/images/0x4691937a7508860F876c9c0a2a617E7d9E945D4B.png create mode 100644 packages/token-lists/lists/images/0x47bead2563dcbf3bf2c9407fea4dc236faba485a.png create mode 100644 packages/token-lists/lists/images/0x49022089e78a8D46Ec87A3AF86a1Db6c189aFA6f.png create mode 100644 packages/token-lists/lists/images/0x4BA0057f784858a48fe351445C672FF2a3d43515.png create mode 100644 packages/token-lists/lists/images/0x4FA7163E153419E0E1064e418dd7A99314Ed27b6.png create mode 100644 packages/token-lists/lists/images/0x4a080377f83D669D7bB83B3184a8A5E61B500608.png create mode 100644 packages/token-lists/lists/images/0x4b0f1812e5df2a09796481ff14017e6005508003.png create mode 100644 packages/token-lists/lists/images/0x4bd17003473389a42daf6a0a729f6fdb328bbbd7.png create mode 100644 packages/token-lists/lists/images/0x4cfbbdfbd5bf0814472ff35c72717bd095ada055.png create mode 100644 packages/token-lists/lists/images/0x4e6415a5727ea08aae4580057187923aec331227.png create mode 100644 packages/token-lists/lists/images/0x4e840AADD28DA189B9906674B4Afcb77C128d9ea.png create mode 100644 packages/token-lists/lists/images/0x52ce071bd9b1c4b00a0b92d298c512478cad67e8.png create mode 100644 packages/token-lists/lists/images/0x541e619858737031a1244a5d0cd47e5ef480342c.png create mode 100644 packages/token-lists/lists/images/0x5512014efa6Cd57764Fa743756F7a6Ce3358cC83.png create mode 100644 packages/token-lists/lists/images/0x55d398326f99059ff775485246999027b3197955.png create mode 100644 packages/token-lists/lists/images/0x5621b5a3f4a8008c4ccdd1b942b121c8b1944f1f.png create mode 100644 packages/token-lists/lists/images/0x56b6fb708fc5732dec1afc8d8556423a2edccbd6.png create mode 100644 packages/token-lists/lists/images/0x5921dee8556c4593eefcfad3ca5e2f618606483b.png create mode 100644 packages/token-lists/lists/images/0x5986d5c77c65e5801a5caa4fae80089f870a71da.png create mode 100644 packages/token-lists/lists/images/0x5A3010d4d8D3B5fB49f8B6E57FB9E48063f16700.png create mode 100644 packages/token-lists/lists/images/0x5F84ce30DC3cF7909101C69086c50De191895883.png create mode 100644 packages/token-lists/lists/images/0x5F88AB06e8dfe89DF127B2430Bba4Af600866035.png create mode 100644 packages/token-lists/lists/images/0x5a16E8cE8cA316407c6E6307095dc9540a8D62B3.png create mode 100644 packages/token-lists/lists/images/0x5ac52ee5b2a633895292ff6d8a89bb9190451587.png create mode 100644 packages/token-lists/lists/images/0x5b6dcf557e2abe2323c48445e8cc948910d8c2c9.png create mode 100644 packages/token-lists/lists/images/0x5d684adaf3fcfe9cfb5cede3abf02f0cdd1012e3.png create mode 100644 packages/token-lists/lists/images/0x62D71B23bF15218C7d2D7E48DBbD9e9c650B173f.png create mode 100644 packages/token-lists/lists/images/0x63870A18B6e42b01Ef1Ad8A2302ef50B7132054F.png create mode 100644 packages/token-lists/lists/images/0x658A109C5900BC6d2357c87549B651670E5b0539.png create mode 100644 packages/token-lists/lists/images/0x658E64FFcF40D240A43D52CA9342140316Ae44fA.png create mode 100644 packages/token-lists/lists/images/0x67ee3cb086f8a16f34bee3ca72fad36f7db929e2.png create mode 100644 packages/token-lists/lists/images/0x695FD30aF473F2960e81Dc9bA7cB67679d35EDb7.png create mode 100644 packages/token-lists/lists/images/0x6bfF4Fb161347ad7de4A625AE5aa3A1CA7077819.png create mode 100644 packages/token-lists/lists/images/0x6f769e65c14ebd1f68817f5f1dcdb61cfa2d6f7e.png create mode 100644 packages/token-lists/lists/images/0x7083609fce4d1d8dc0c979aab8c869ea2c873402.png create mode 100644 packages/token-lists/lists/images/0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c.png create mode 100644 packages/token-lists/lists/images/0x71DE20e0C4616E7fcBfDD3f875d568492cBE4739.png create mode 100644 packages/token-lists/lists/images/0x728C5baC3C3e370E372Fc4671f9ef6916b814d8B.png create mode 100644 packages/token-lists/lists/images/0x72faa679e1008ad8382959ff48e392042a8b06f7.png create mode 100644 packages/token-lists/lists/images/0x758FB037A375F17c7e195CC634D77dA4F554255B.png create mode 100644 packages/token-lists/lists/images/0x762539b45a1dcce3d36d080f74d1aed37844b878.png create mode 100644 packages/token-lists/lists/images/0x78650b139471520656b9e7aa7a5e9276814a38e9.png create mode 100644 packages/token-lists/lists/images/0x7a1da9f49224ef98389b071b8a3294d1cc5e3e6a.png create mode 100644 packages/token-lists/lists/images/0x7a9f28eb62c791422aa23ceae1da9c847cbec9b0.png create mode 100644 packages/token-lists/lists/images/0x7af173f350d916358af3e218bdf2178494beb748.png create mode 100644 packages/token-lists/lists/images/0x7e396bfc8a2f84748701167c2d622f041a1d7a17.png create mode 100644 packages/token-lists/lists/images/0x7f70642d88cf1c4a3a7abb072b53b929b653eda5.png create mode 100644 packages/token-lists/lists/images/0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3.png create mode 100644 packages/token-lists/lists/images/0x80d5f92c2c8c682070c95495313ddb680b267320.png create mode 100644 packages/token-lists/lists/images/0x810ee35443639348adbbc467b33310d2ab43c168.png create mode 100644 packages/token-lists/lists/images/0x81859801b01764D4f0Fa5E64729f5a6C3b91435b.png create mode 100644 packages/token-lists/lists/images/0x8443f091997f06a61670b735ed92734f5628692f.png create mode 100644 packages/token-lists/lists/images/0x844fa82f1e54824655470970f7004dd90546bb28.png create mode 100644 packages/token-lists/lists/images/0x8519ea49c997f50ceffa444d240fb655e89248aa.png create mode 100644 packages/token-lists/lists/images/0x857b222fc79e1cbbf8ca5f78cb133d1b7cf34bbd.png create mode 100644 packages/token-lists/lists/images/0x8595f9da7b868b1822194faed312235e43007b49.png create mode 100644 packages/token-lists/lists/images/0x85eac5ac2f758618dfa09bdbe0cf174e7d574d5b.png create mode 100644 packages/token-lists/lists/images/0x88f1a5ae2a3bf98aeaf342d26b30a79438c9142e.png create mode 100644 packages/token-lists/lists/images/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png create mode 100644 packages/token-lists/lists/images/0x8cd6e29d3686d24d3c2018cee54621ea0f89313b.png create mode 100644 packages/token-lists/lists/images/0x8f0528ce5ef7b51152a59745befdd91d97091d2f.png create mode 100644 packages/token-lists/lists/images/0x8ff795a6f4d97e7887c79bea79aba5cc76444adf.png create mode 100644 packages/token-lists/lists/images/0x928e55daB735aa8260AF3cEDadA18B5f70C72f1b.png create mode 100644 packages/token-lists/lists/images/0x947950bcc74888a40ffa2593c5798f11fc9124c4.png create mode 100644 packages/token-lists/lists/images/0x948d2a81086a075b3130bac19e4c6dee1d2e3fe8.png create mode 100644 packages/token-lists/lists/images/0x95a1199EBA84ac5f19546519e287d43D2F0E1b41.png create mode 100644 packages/token-lists/lists/images/0x96058f8c3e16576d9bd68766f3836d9a33158f89.png create mode 100644 packages/token-lists/lists/images/0x9617857e191354dbea0b714d78bc59e57c411087.png create mode 100644 packages/token-lists/lists/images/0x9678e42cebeb63f23197d726b29b1cb20d0064e5.png create mode 100644 packages/token-lists/lists/images/0x96dd399f9c3afda1f194182f71600f1b65946501.png create mode 100644 packages/token-lists/lists/images/0x9899a98b222fcb2f3dbee7df45d943093a4ff9ff.png create mode 100644 packages/token-lists/lists/images/0x9F882567A62a5560d147d64871776EeA72Df41D3.png create mode 100644 packages/token-lists/lists/images/0x9Fdc3ae5c814b79dcA2556564047C5e7e5449C19.png create mode 100644 packages/token-lists/lists/images/0x9a319b959e33369C5eaA494a770117eE3e585318.png create mode 100644 packages/token-lists/lists/images/0x9f589e3eabe42ebc94a44727b3f3531c0c877809.png create mode 100644 packages/token-lists/lists/images/0xA1434F1FC3F437fa33F7a781E041961C0205B5Da.png create mode 100644 packages/token-lists/lists/images/0xA2120b9e674d3fC3875f415A7DF52e382F141225.png create mode 100644 packages/token-lists/lists/images/0xB64E638E60D154B43f660a6BF8fD8a3b249a6a21.png create mode 100644 packages/token-lists/lists/images/0xB67754f5b4C704A24d2db68e661b2875a4dDD197.png create mode 100644 packages/token-lists/lists/images/0xC0eFf7749b125444953ef89682201Fb8c6A917CD.png create mode 100644 packages/token-lists/lists/images/0xC7d8D35EBA58a0935ff2D5a33Df105DD9f071731.png create mode 100644 packages/token-lists/lists/images/0xCa3F508B8e4Dd382eE878A314789373D80A5190A.png create mode 100644 packages/token-lists/lists/images/0xDAe6c2A48BFAA66b43815c5548b10800919c993E.png create mode 100644 packages/token-lists/lists/images/0xDB021b1B247fe2F1fa57e0A87C748Cc1E321F07F.png create mode 100644 packages/token-lists/lists/images/0xE0e514c71282b6f4e823703a39374Cf58dc3eA4f.png create mode 100644 packages/token-lists/lists/images/0xEe9801669C6138E84bD50dEB500827b776777d28.png create mode 100644 packages/token-lists/lists/images/0xF215A127A196e3988C09d052e16BcFD365Cd7AA3.png create mode 100644 packages/token-lists/lists/images/0xF35262a9d427F96d2437379eF090db986eaE5d42.png create mode 100644 packages/token-lists/lists/images/0xa04F060077D90Fe2647B61e4dA4aD1F97d6649dc.png create mode 100644 packages/token-lists/lists/images/0xa1303e6199b319a891b79685f0537d289af1fc83.png create mode 100644 packages/token-lists/lists/images/0xa184088a740c695e156f91f5cc086a06bb78b827.png create mode 100644 packages/token-lists/lists/images/0xa1faa113cbe53436df28ff0aee54275c13b40975.png create mode 100644 packages/token-lists/lists/images/0xa2B726B1145A4773F68593CF171187d8EBe4d495.png create mode 100644 packages/token-lists/lists/images/0xa7f552078dcc247c2684336020c03648500c6d9f.png create mode 100644 packages/token-lists/lists/images/0xa8c2b8eec3d368c0253ad3dae65a5f2bbb89c929.png create mode 100644 packages/token-lists/lists/images/0xa9c41A46a6B3531d28d5c32F6633dd2fF05dFB90.png create mode 100644 packages/token-lists/lists/images/0xaA9E582e5751d703F85912903bacADdFed26484C.png create mode 100644 packages/token-lists/lists/images/0xaBaE871B7E3b67aEeC6B46AE9FE1A91660AadAC5.png create mode 100644 packages/token-lists/lists/images/0xac51066d7bec65dc4589368da368b212745d63e8.png create mode 100644 packages/token-lists/lists/images/0xad6caeb32cd2c308980a548bd0bc5aa4306c6c18.png create mode 100644 packages/token-lists/lists/images/0xae9269f27437f0fcbc232d39ec814844a51d6b8f.png create mode 100644 packages/token-lists/lists/images/0xaef0d72a118ce24fee3cd1d43d383897d05b4e99.png create mode 100644 packages/token-lists/lists/images/0xaf53d56ff99f1322515e54fdde93ff8b3b7dafd5.png create mode 100644 packages/token-lists/lists/images/0xb2bd0749dbe21f623d9baba856d3b0f0e1bfec9c.png create mode 100644 packages/token-lists/lists/images/0xb59490ab09a0f526cc7305822ac65f2ab12f9723.png create mode 100644 packages/token-lists/lists/images/0xb86abcb37c3a4b64f74f59301aff131a1becc787.png create mode 100644 packages/token-lists/lists/images/0xb8C540d00dd0Bf76ea12E4B4B95eFC90804f924E.png create mode 100644 packages/token-lists/lists/images/0xbA2aE424d960c26247Dd6c32edC70B295c744C43.png create mode 100644 packages/token-lists/lists/images/0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c.png create mode 100644 packages/token-lists/lists/images/0xbbeb90cfb6fafa1f69aa130b7341089abeef5811.png create mode 100644 packages/token-lists/lists/images/0xbc5609612b7c44bef426de600b5fd1379db2ecf1.png create mode 100644 packages/token-lists/lists/images/0xbcf39f0edda668c58371e519af37ca705f2bfcbd.png create mode 100644 packages/token-lists/lists/images/0xbd2949f67dcdc549c6ebe98696449fa79d988a9f.png create mode 100644 packages/token-lists/lists/images/0xbf5140a22578168fd562dccf235e5d43a02ce9b1.png create mode 100644 packages/token-lists/lists/images/0xbf7c81fff98bbe61b40ed186e4afd6ddd01337fe.png create mode 100644 packages/token-lists/lists/images/0xbfa0841f7a90c4ce6643f651756ee340991f99d5.png create mode 100644 packages/token-lists/lists/images/0xc13b7a43223bb9bf4b69bd68ab20ca1b79d81c75.png create mode 100644 packages/token-lists/lists/images/0xc3fed6eb39178a541d274e6fc748d48f0ca01cc3.png create mode 100644 packages/token-lists/lists/images/0xc40c9a843e1c6d01b7578284a9028854f6683b1b.png create mode 100644 packages/token-lists/lists/images/0xc53708664b99DF348dd27C3Ac0759d2DA9c40462.png create mode 100644 packages/token-lists/lists/images/0xc5a49b4cbe004b6fd55b30ba1de6ac360ff9765d.png create mode 100644 packages/token-lists/lists/images/0xc5e6689c9c8b02be7c49912ef19e79cf24977f03.png create mode 100644 packages/token-lists/lists/images/0xc9849e6fdb743d08faee3e34dd2d1bc69ea11a51.png create mode 100644 packages/token-lists/lists/images/0xcd40f2670cf58720b694968698a5514e924f742d.png create mode 100644 packages/token-lists/lists/images/0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63.png create mode 100644 packages/token-lists/lists/images/0xd41fdb03ba84762dd66a0af1a6c8540ff1ba5dfb.png create mode 100644 packages/token-lists/lists/images/0xd4cb328a82bdf5f03eb737f37fa6b370aef3e888.png create mode 100644 packages/token-lists/lists/images/0xdaacb0ab6fb34d24e8a67bfa14bf4d95d4c7af92.png create mode 100644 packages/token-lists/lists/images/0xdff8cb622790b7f92686c722b02cab55592f152c.png create mode 100644 packages/token-lists/lists/images/0xe02df9e3e622debdd69fb838bb799e3f168902c5.png create mode 100644 packages/token-lists/lists/images/0xe1d1f66215998786110ba0102ef558b22224c016.png create mode 100644 packages/token-lists/lists/images/0xe4ae305ebe1abe663f261bc00534067c80ad677c.png create mode 100644 packages/token-lists/lists/images/0xe550a593d09fbc8dcd557b5c88cea6946a8b404a.png create mode 100644 packages/token-lists/lists/images/0xe60eaf5A997DFAe83739e035b005A33AfdCc6df5.png create mode 100644 packages/token-lists/lists/images/0xe64f5cb844946c1f102bd25bbd87a5ab4ae89fbe.png create mode 100644 packages/token-lists/lists/images/0xe792f64c582698b8572aaf765bdc426ac3aefb6b.png create mode 100644 packages/token-lists/lists/images/0xe9e7cea3dedca5984780bafc599bd69add087d56.png create mode 100644 packages/token-lists/lists/images/0xeBd49b26169e1b52c04cFd19FCf289405dF55F80.png create mode 100644 packages/token-lists/lists/images/0xeca41281c24451168a37211f0bc2b8645af45092.png create mode 100644 packages/token-lists/lists/images/0xed28a457a5a76596ac48d87c0f577020f6ea1c4c.png create mode 100644 packages/token-lists/lists/images/0xf05e45ad22150677a017fbd94b84fbb63dc9b44c.png create mode 100644 packages/token-lists/lists/images/0xf07a32Eb035b786898c00bB1C64d8c6F8E7a46D5.png create mode 100644 packages/token-lists/lists/images/0xf0e406c49c63abf358030a299c0e00118c4c6ba5.png create mode 100644 packages/token-lists/lists/images/0xf21768ccbc73ea5b6fd3c687208a7c2def2d966e.png create mode 100644 packages/token-lists/lists/images/0xf218184af829cf2b0019f8e6f0b2423498a36983.png create mode 100644 packages/token-lists/lists/images/0xf307910a4c7bbc79691fd374889b36d8531b08e3.png create mode 100644 packages/token-lists/lists/images/0xf79037f6f6be66832de4e7516be52826bc3cbcc4.png create mode 100644 packages/token-lists/lists/images/0xf859Bf77cBe8699013d6Dbc7C2b926Aaf307F830.png create mode 100644 packages/token-lists/lists/images/0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd.png create mode 100644 packages/token-lists/lists/images/0xf9CeC8d50f6c8ad3Fb6dcCEC577e05aA32B224FE.png create mode 100644 packages/token-lists/lists/images/0xfCe146bF3146100cfe5dB4129cf6C82b0eF4Ad8c.png create mode 100644 packages/token-lists/lists/images/0xfd7b3a77848f1c2d67e05e54d78d174a0c850335.png create mode 100644 packages/token-lists/lists/images/0xffEecbf8D7267757c2dc3d13D730E97E15BfdF7F.png create mode 100644 packages/token-lists/lists/pancakeswap-default.json create mode 100644 packages/token-lists/lists/pancakeswap-extended.json create mode 100644 packages/token-lists/lists/pancakeswap-top-100.json create mode 100644 packages/token-lists/lists/pancakeswap-top-15.json create mode 100644 packages/token-lists/lists/token-lists.json create mode 100644 packages/token-lists/netlify.toml create mode 100644 packages/token-lists/package.json create mode 100644 packages/token-lists/rollup.config.js create mode 100644 packages/token-lists/src/buildList.ts create mode 100644 packages/token-lists/src/checksum.ts create mode 100644 packages/token-lists/src/ci-check.ts create mode 100644 packages/token-lists/src/index.ts create mode 100644 packages/token-lists/src/tokens/pancakeswap-default.json create mode 100644 packages/token-lists/src/tokens/pancakeswap-extended.json create mode 100644 packages/token-lists/src/tokens/pancakeswap-top-100.json create mode 100644 packages/token-lists/src/tokens/pancakeswap-top-15.json create mode 100644 packages/token-lists/src/top-100.ts create mode 100644 packages/token-lists/test/default.test.ts create mode 100644 packages/token-lists/tsconfig.json create mode 100644 yarn.lock diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 0000000..2ad7542 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,11 @@ +{ + "extends": ["@commitlint/config-conventional"], + "rules": { + "subject-case": [2, "always", "sentence-case"], + "type-enum": [ + 2, + "always", + ["build", "ci", "chore", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test"] + ] + } +} diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..5591df4 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,28 @@ +{ + "extends": "@pancakeswap/eslint-config-pancake", + "rules": { + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": [ + "src/setupTests.[jt]s?(x)", + "src/testHelpers.[jt]s?(x)", + "**/*.test.[jt]s?(x)", + "rollup.config.js", + "src/mocks/**" + ] + } + ] + }, + "overrides": [ + { + "files": ["jest.setup.js"], + "env": { + "jest": true + }, + "rules": { + "import/no-extraneous-dependencies": 0 + } + } + ] +} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..e30dfd4 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,7 @@ +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence, +# @global-owner1 and @global-owner2 will be requested for +# review when someone opens a pull request. +* @RabbitDoge @hachiojidev @Chef-Chungus + +packages/token-lists/ @RabbitDoge @hachiojidev @Chef-Chungus @ChefKai \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..c26228a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,4 @@ +[ ] Before opening a pull request, please read the [contributing guidelines](https://github.com/pancakeswap/pancake-uikit/blob/master/CONTRIBUTING.md) first +[ ] If your PR is work in progress, open it as `draft` +[ ] Before requesting a review, all the checks need to pass +[ ] Explain what your PR does diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..bce79bc --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,23 @@ +name: Build + +on: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node + uses: actions/setup-node@v2.1.2 + with: + node-version: 14.x + + - name: Install dependencies + run: yarn install + + - name: Run Build + run: yarn build diff --git a/.github/workflows/deploy-storybook.yml b/.github/workflows/deploy-storybook.yml new file mode 100644 index 0000000..e55d225 --- /dev/null +++ b/.github/workflows/deploy-storybook.yml @@ -0,0 +1,34 @@ +name: Deploy Storybook + +on: + push: + branches: + - master + +jobs: + storybook: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node + uses: actions/setup-node@v2.1.2 + with: + node-version: 14.x + + - name: Install dependencies + run: yarn install + + - name: Build Storybook + run: yarn storybook:build + + - name: Deploy Storybook + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./packages/pancake-uikit/storybook-static + publish_branch: gh-pages + user_name: "github-actions" + user_email: "github-actions@users.noreply.github.com" diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml new file mode 100644 index 0000000..3fb2837 --- /dev/null +++ b/.github/workflows/format.yml @@ -0,0 +1,29 @@ +name: Format + +on: + pull_request: + +jobs: + commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: wagoid/commitlint-github-action@v2 + with: + configFile: .commitlintrc.json + helpURL: https://docs.pancakeswap.finance/code/contributing#committing + code: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Setup Node + uses: actions/setup-node@v2.1.2 + with: + node-version: 14.x + - name: Install dependencies + run: yarn install + - name: Run check + run: yarn format:check diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..62193b5 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,23 @@ +name: Lint + +on: + pull_request: + +jobs: + eslint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node + uses: actions/setup-node@v2.1.2 + with: + node-version: 14.x + + - name: Install dependencies + run: yarn install + + - name: Run ESLint + run: yarn lint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..2a4f74e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,22 @@ +name: Tests + +on: pull_request + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node + uses: actions/setup-node@v2.1.2 + with: + node-version: 14.x + + - name: Install dependencies + run: yarn install + + - name: Run Jest tests + run: yarn test diff --git a/.github/workflows/tokenlist.yml b/.github/workflows/tokenlist.yml new file mode 100644 index 0000000..dbee13c --- /dev/null +++ b/.github/workflows/tokenlist.yml @@ -0,0 +1,27 @@ +name: Verify token lists + +on: + pull_request: + paths: + - "packages/token-lists/src/tokens/**" + - "packages/token-lists/lists/**" + +jobs: + verifyTokenLists: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node + uses: actions/setup-node@v2.1.2 + with: + node-version: 14.x + + - name: Install dependencies + run: yarn install + + - name: Check if tokenlists were updated correctly + working-directory: ./packages/token-lists + run: yarn ci-check diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4ef060 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules + +# testing +coverage + +# production +dist +storybook-static + +# misc +.DS_Store + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..963354f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "printWidth": 120 +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..21c71de --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,134 @@ +# 1.0.0 (2021-03-18) + + +### Bug Fixes + +* **heading:** Sizes type was wrong ([#183](https://github.com/pancakeswap/pancake-toolkit/issues/183)) ([f5155e0](https://github.com/pancakeswap/pancake-toolkit/commit/f5155e0fc977fbfd686d1b6f7473ccc2a336af90)) +* **lerna:** Config ([#15](https://github.com/pancakeswap/pancake-toolkit/issues/15)) ([8549ed7](https://github.com/pancakeswap/pancake-toolkit/commit/8549ed717d6393a554e146955790a840d11a250d)) +* **uikit:** Accept float values for Slider ([#4](https://github.com/pancakeswap/pancake-toolkit/issues/4)) ([018d7e5](https://github.com/pancakeswap/pancake-toolkit/commit/018d7e5276e06cf880b2ce8f15f6eaa10e47f236)) +* Format command ([#6](https://github.com/pancakeswap/pancake-toolkit/issues/6)) ([8cbc1b8](https://github.com/pancakeswap/pancake-toolkit/commit/8cbc1b866443047032cd040f6867f245e3d5b0c0)) +* **icons:** Update viewbox ([#216](https://github.com/pancakeswap/pancake-toolkit/issues/216)) ([4420a1b](https://github.com/pancakeswap/pancake-toolkit/commit/4420a1be0d4ff41ba737bcc80eaea46c7b2a16b2)) +* **slider:** Slider imports ([#222](https://github.com/pancakeswap/pancake-toolkit/issues/222)) ([ed2d693](https://github.com/pancakeswap/pancake-toolkit/commit/ed2d693d172a59b82e3209eed4d3e9a5f07f33b3)) +* Add fix for older versions of Safari ([#123](https://github.com/pancakeswap/pancake-toolkit/issues/123)) ([002fecc](https://github.com/pancakeswap/pancake-toolkit/commit/002feccd076c3d662885305a5d57a183a83d557f)) +* Add react router to menu links ([#46](https://github.com/pancakeswap/pancake-toolkit/issues/46)) ([6e0fa5b](https://github.com/pancakeswap/pancake-toolkit/commit/6e0fa5b8c67993e3f1537278a13da9bb4ebb9a17)) +* Build and add build step to workflow ([#43](https://github.com/pancakeswap/pancake-toolkit/issues/43)) ([6f3fefc](https://github.com/pancakeswap/pancake-toolkit/commit/6f3fefc3cbd394f869bfad0422cb16c716204e31)) +* bump react-dom to 17.x to fix react mismatch error in pancake-frontend ([#184](https://github.com/pancakeswap/pancake-toolkit/issues/184)) ([70941d1](https://github.com/pancakeswap/pancake-toolkit/commit/70941d177b6572e5879315d96beb5cee7b6e0a38)) +* Menu and footer interactions ([f3f7f74](https://github.com/pancakeswap/pancake-toolkit/commit/f3f7f74bb86654fcfae5344f115d6d3fac129327)) +* Menu on safari ([#53](https://github.com/pancakeswap/pancake-toolkit/issues/53)) ([5d5db86](https://github.com/pancakeswap/pancake-toolkit/commit/5d5db860c1648eb96a9b7637d9dad79edbab23b9)) +* Re render on mobile ([#201](https://github.com/pancakeswap/pancake-toolkit/issues/201)) ([3802c15](https://github.com/pancakeswap/pancake-toolkit/commit/3802c153a7786fae9dc9eb20d5a45bed4a2c8c27)) +* **menu:** Wrong type on Menu ([#120](https://github.com/pancakeswap/pancake-toolkit/issues/120)) ([a83ee2f](https://github.com/pancakeswap/pancake-toolkit/commit/a83ee2f14a2d1505c1574baa3582219715885530)) +* **toggle:** Types ([#182](https://github.com/pancakeswap/pancake-toolkit/issues/182)) ([18186af](https://github.com/pancakeswap/pancake-toolkit/commit/18186afcb8e62af5beb999ab122cbf53b4dfb4fa)) +* Copy to clipboard format ([#172](https://github.com/pancakeswap/pancake-toolkit/issues/172)) ([a77199c](https://github.com/pancakeswap/pancake-toolkit/commit/a77199cbbd871ca140be1446d5b688e3f85aba33)) +* Export type for menu ([#111](https://github.com/pancakeswap/pancake-toolkit/issues/111)) ([0344771](https://github.com/pancakeswap/pancake-toolkit/commit/03447710dd2e973ad9967b402de8d6ea4cea13cc)) +* Integration feedbacks into exchange ([#112](https://github.com/pancakeswap/pancake-toolkit/issues/112)) ([fc4627a](https://github.com/pancakeswap/pancake-toolkit/commit/fc4627a48f553c0a1e22141f286fb5e5ffcd9350)) +* Layer visibilities ([#45](https://github.com/pancakeswap/pancake-toolkit/issues/45)) ([6fbe6d5](https://github.com/pancakeswap/pancake-toolkit/commit/6fbe6d518276cda61a20787003ba7f25f6990696)) +* Logo link with react router ([d7b294b](https://github.com/pancakeswap/pancake-toolkit/commit/d7b294b172072c3d7e07b88377ef48601ac0be4f)) +* Menu hide logic ([#156](https://github.com/pancakeswap/pancake-toolkit/issues/156)) ([2bda8a0](https://github.com/pancakeswap/pancake-toolkit/commit/2bda8a0efdfa040a17bc8f6d97f2bace8292c560)) +* Table sort ([#175](https://github.com/pancakeswap/pancake-toolkit/issues/175)) ([67b97b4](https://github.com/pancakeswap/pancake-toolkit/commit/67b97b41d49bbfcc30ee7b52227186745dde0c61)) +* **alert:** Spacing ([#155](https://github.com/pancakeswap/pancake-toolkit/issues/155)) ([d897ce8](https://github.com/pancakeswap/pancake-toolkit/commit/d897ce86bf7b6643f438b6c4d83339c6d3c8861d)) +* Missing export ([#107](https://github.com/pancakeswap/pancake-toolkit/issues/107)) ([2c608db](https://github.com/pancakeswap/pancake-toolkit/commit/2c608dbcd9dcb82fe8fe0aef0dd0701ad89c3180)) +* Radio and Breadcrumb ([#149](https://github.com/pancakeswap/pancake-toolkit/issues/149)) ([e98ea32](https://github.com/pancakeswap/pancake-toolkit/commit/e98ea3263009a2cb9be10fef19f2f3b7a7a9a3cb)) +* **button:** Change import locations of button across WalletModal, Modal, Dropdown & Progress ([#72](https://github.com/pancakeswap/pancake-toolkit/issues/72)) ([779c8fa](https://github.com/pancakeswap/pancake-toolkit/commit/779c8fafcab07fbc5657c2537a6f8309cb43aee7)) +* **button:** Line height ([#91](https://github.com/pancakeswap/pancake-toolkit/issues/91)) ([2911ff7](https://github.com/pancakeswap/pancake-toolkit/commit/2911ff72c203cec77605535ed559ac644c69ea24)) +* **buttonmenu:** "as" not being forwarded correctly ([#99](https://github.com/pancakeswap/pancake-toolkit/issues/99)) ([6c9a8f1](https://github.com/pancakeswap/pancake-toolkit/commit/6c9a8f1d36838b75e44efa8546a7e07e2907ea13)) +* **card:** Space props ([#145](https://github.com/pancakeswap/pancake-toolkit/issues/145)) ([8d7fdfa](https://github.com/pancakeswap/pancake-toolkit/commit/8d7fdfafdec89dd22fc43d6033daf6ef9e207a67)) +* **radio:** Missing import ([#146](https://github.com/pancakeswap/pancake-toolkit/issues/146)) ([ec0fada](https://github.com/pancakeswap/pancake-toolkit/commit/ec0fada6caabb2bfb97feb9648bcb5a758ce4586)) +* Price cake logo ([#54](https://github.com/pancakeswap/pancake-toolkit/issues/54)) ([9b0a379](https://github.com/pancakeswap/pancake-toolkit/commit/9b0a3793d468a8ca4549da88ca77092a93023ab4)) +* Put scales at the theme root ([#34](https://github.com/pancakeswap/pancake-toolkit/issues/34)) ([c160770](https://github.com/pancakeswap/pancake-toolkit/commit/c160770e12d7f5139ae36b63c7b02aa412e2693b)) +* SM media query value ([#22](https://github.com/pancakeswap/pancake-toolkit/issues/22)) ([8caae72](https://github.com/pancakeswap/pancake-toolkit/commit/8caae724d39c3ebf1ca4622e53a87a4bf179bf8f)) +* Style on checkbox and text ([#24](https://github.com/pancakeswap/pancake-toolkit/issues/24)) ([27bf6cf](https://github.com/pancakeswap/pancake-toolkit/commit/27bf6cf40b1d9cd6d0ce5c8fbd366b2f0e456259)) +* Style type ([0e3a769](https://github.com/pancakeswap/pancake-toolkit/commit/0e3a769e7abd785a241452b77a811ed4ce27a941)) +* Tweak kit for exchange integration ([#98](https://github.com/pancakeswap/pancake-toolkit/issues/98)) ([19388c2](https://github.com/pancakeswap/pancake-toolkit/commit/19388c2664146cc4b659262ad06353ee2e7771fe)) +* Update eslint rules for typescript ([#6](https://github.com/pancakeswap/pancake-toolkit/issues/6)) ([7f71224](https://github.com/pancakeswap/pancake-toolkit/commit/7f7122451ea2444c64bcdeae1e567d2cd2b4770a)) +* Update root imports ([635b94a](https://github.com/pancakeswap/pancake-toolkit/commit/635b94a6272fc026d776433c293b83dbf490b31e)) +* Update Spinner ([#140](https://github.com/pancakeswap/pancake-toolkit/issues/140)) ([8d2cb19](https://github.com/pancakeswap/pancake-toolkit/commit/8d2cb194bbaa29ec1e0f5731cd715c424adb79d6)) +* Update spinner SVG according to new design ([#137](https://github.com/pancakeswap/pancake-toolkit/issues/137)) ([a9267e9](https://github.com/pancakeswap/pancake-toolkit/commit/a9267e966951e995f3a8eeeca3ff3929a4d33604)) +* **modal:** Dark mode ([#85](https://github.com/pancakeswap/pancake-toolkit/issues/85)) ([616b76b](https://github.com/pancakeswap/pancake-toolkit/commit/616b76b56478efb548db9fb89edc77a6b289c5a9)) +* **progress:** Issue when progress is 0 or 100% ([#88](https://github.com/pancakeswap/pancake-toolkit/issues/88)) ([071d95b](https://github.com/pancakeswap/pancake-toolkit/commit/071d95bad5f0c00ca51324f13cca6f6aa631d140)) +* Wallet types ([#59](https://github.com/pancakeswap/pancake-toolkit/issues/59)) ([2fc1a86](https://github.com/pancakeswap/pancake-toolkit/commit/2fc1a863fc8048b9f9d0e79cc2cd0b873854f307)) + + +### Features + +* Add eslint package ([#7](https://github.com/pancakeswap/pancake-toolkit/issues/7)) ([0e0454e](https://github.com/pancakeswap/pancake-toolkit/commit/0e0454eb9a63e976934956dc5c66fbef2ce2017a)) +* **button:** Add current color to start/end icons ([#210](https://github.com/pancakeswap/pancake-toolkit/issues/210)) ([a8901f8](https://github.com/pancakeswap/pancake-toolkit/commit/a8901f810d6baa1f0c96d3f7db898fa7a44dfdd2)) +* **icons:** Arrow up ([#209](https://github.com/pancakeswap/pancake-toolkit/issues/209)) ([6e93077](https://github.com/pancakeswap/pancake-toolkit/commit/6e93077a430f36bd72c65cc27a3a80f76adb6f04)) +* **icons:** Wait, Timer, Play icon ([#211](https://github.com/pancakeswap/pancake-toolkit/issues/211)) ([ba5e8be](https://github.com/pancakeswap/pancake-toolkit/commit/ba5e8beaf2791313f31475041ded08c5e1bbfef0)) +* Add Metamask Svg Icon ([#212](https://github.com/pancakeswap/pancake-toolkit/issues/212)) ([6cea4fb](https://github.com/pancakeswap/pancake-toolkit/commit/6cea4fbb464703d25855c067d69ceda7b4f164ff)) +* **progress:** Add flat variant ([#207](https://github.com/pancakeswap/pancake-toolkit/issues/207)) ([4d9e750](https://github.com/pancakeswap/pancake-toolkit/commit/4d9e75061f69d376a68be714ebb3f8bfd7381b86)) +* Add a pancake spinner ([#136](https://github.com/pancakeswap/pancake-toolkit/issues/136)) ([eec4478](https://github.com/pancakeswap/pancake-toolkit/commit/eec4478e33e04a36c9a2819800df92adb98a2c61)) +* Add copy to clipboard on the address ([#162](https://github.com/pancakeswap/pancake-toolkit/issues/162)) ([9906aad](https://github.com/pancakeswap/pancake-toolkit/commit/9906aad82a86689493cad378471f46ea68877b8c)) +* Add Image component ([#131](https://github.com/pancakeswap/pancake-toolkit/issues/131)) ([dc95cfc](https://github.com/pancakeswap/pancake-toolkit/commit/dc95cfc945a14764ee277f6305b905325703e5a7)) +* Add SafePal Wallet ([#202](https://github.com/pancakeswap/pancake-toolkit/issues/202)) ([da5c58c](https://github.com/pancakeswap/pancake-toolkit/commit/da5c58c33caffeead7b77b51272085b1336168ea)) +* Add top level indicator on nav ([#205](https://github.com/pancakeswap/pancake-toolkit/issues/205)) ([b008cf9](https://github.com/pancakeswap/pancake-toolkit/commit/b008cf96d18cf8fd14c0b804d0a658c354d464d9)) +* Add typography props to Text ([#188](https://github.com/pancakeswap/pancake-toolkit/issues/188)) ([9fb672d](https://github.com/pancakeswap/pancake-toolkit/commit/9fb672d42218d7c47033a306f73a499179ea4268)) +* Box ([#189](https://github.com/pancakeswap/pancake-toolkit/issues/189)) ([d89db88](https://github.com/pancakeswap/pancake-toolkit/commit/d89db887de155806efbf264382f2b9b9e7478ae1)) +* Create a new sidebar menu component ([afeb180](https://github.com/pancakeswap/pancake-toolkit/commit/afeb180b3e3f9d688c73808a64edbcaa9b754240)) +* EasterEgg ([1783785](https://github.com/pancakeswap/pancake-toolkit/commit/1783785d9a0b81193216e194eb3bb358766adc99)) +* Input border color ([#186](https://github.com/pancakeswap/pancake-toolkit/issues/186)) ([fa2cfa4](https://github.com/pancakeswap/pancake-toolkit/commit/fa2cfa4915b24c5510f8ec3a1f92057fd04b1ecc)) +* **breadcrumbs:** Add mobile stylings ([#154](https://github.com/pancakeswap/pancake-toolkit/issues/154)) ([8773601](https://github.com/pancakeswap/pancake-toolkit/commit/87736018fddcdf28f085670498d35589eb1fe6fe)) +* **button:** Success variant ([#96](https://github.com/pancakeswap/pancake-toolkit/issues/96)) ([8aae7be](https://github.com/pancakeswap/pancake-toolkit/commit/8aae7beaf2fb5575735fdfd546579a1aadcff002)) +* **icon:** Arrow down ([#95](https://github.com/pancakeswap/pancake-toolkit/issues/95)) ([a6967ba](https://github.com/pancakeswap/pancake-toolkit/commit/a6967ba8e4f59d472fb7a6424c6710f4ff6590f1)) +* **icons:** Additional icons ([#103](https://github.com/pancakeswap/pancake-toolkit/issues/103)) ([5f319a9](https://github.com/pancakeswap/pancake-toolkit/commit/5f319a9f73efe94c68fe8b7f17cc3ce34caa5fbb)) +* **menu:** Add config option to control initial accordion open state ([#119](https://github.com/pancakeswap/pancake-toolkit/issues/119)) ([7242f63](https://github.com/pancakeswap/pancake-toolkit/commit/7242f6396bdde36a32e02373c727a70010933f1c)) +* **menu:** Add pip to profiles without images ([#168](https://github.com/pancakeswap/pancake-toolkit/issues/168)) ([b39c2e2](https://github.com/pancakeswap/pancake-toolkit/commit/b39c2e23234f2acd1c45f7e367925fa14f3f7c21)) +* **menu:** Add prop to make logo absolute url ([#114](https://github.com/pancakeswap/pancake-toolkit/issues/114)) ([778a50e](https://github.com/pancakeswap/pancake-toolkit/commit/778a50e08c28b6a71560985358c41677a9be836c)) +* **menu:** Groups icon ([#144](https://github.com/pancakeswap/pancake-toolkit/issues/144)) ([4f7406e](https://github.com/pancakeswap/pancake-toolkit/commit/4f7406e02ed18d3dd179098bda54bf59af25747d)) +* **menu:** Menu accordion remains open on click ([#126](https://github.com/pancakeswap/pancake-toolkit/issues/126)) ([c33ca14](https://github.com/pancakeswap/pancake-toolkit/commit/c33ca14918b54b1fda10f6477f0d6ea25820db58)) +* **menu:** Profile avatar ([#159](https://github.com/pancakeswap/pancake-toolkit/issues/159)) ([2087ada](https://github.com/pancakeswap/pancake-toolkit/commit/2087adaf71c391c5ea8f7da927d405bae59b2242)) +* **modal:** Add option to disable overlay click ([#158](https://github.com/pancakeswap/pancake-toolkit/issues/158)) ([fbe334a](https://github.com/pancakeswap/pancake-toolkit/commit/fbe334a23eb87a74c0fce127fce4d43bf3c096fb)) +* **skeleton:** Add layout classes ([#151](https://github.com/pancakeswap/pancake-toolkit/issues/151)) ([02a0864](https://github.com/pancakeswap/pancake-toolkit/commit/02a0864c66b10c02070eca06d4c68f0d8597c1c1)) +* **toasts:** Add ability to add action ([#164](https://github.com/pancakeswap/pancake-toolkit/issues/164)) ([cbba5a4](https://github.com/pancakeswap/pancake-toolkit/commit/cbba5a4704b64e7f962556c4a2a8de733d04ed8c)) +* Breadcrumbs ([#134](https://github.com/pancakeswap/pancake-toolkit/issues/134)) ([afd4b0e](https://github.com/pancakeswap/pancake-toolkit/commit/afd4b0e2f0143d0b4a674f9fb985404f79eac2da)) +* Generic table ([#109](https://github.com/pancakeswap/pancake-toolkit/issues/109)) ([fd8d4b9](https://github.com/pancakeswap/pancake-toolkit/commit/fd8d4b9d092b5bae5b4c49860b6c5e10eccbac1b)) +* Input ([#86](https://github.com/pancakeswap/pancake-toolkit/issues/86)) ([415257c](https://github.com/pancakeswap/pancake-toolkit/commit/415257ca0341a91be6832efb2b2c6f8ad8de8bb5)) +* Toast ([#138](https://github.com/pancakeswap/pancake-toolkit/issues/138)) ([ed5faeb](https://github.com/pancakeswap/pancake-toolkit/commit/ed5faebb82584abcc761018a6e7d6f5b15b3c68e)) +* **nav:** Added NFT link ([#82](https://github.com/pancakeswap/pancake-toolkit/issues/82)) ([a70e7b9](https://github.com/pancakeswap/pancake-toolkit/commit/a70e7b99272824fb95483d50b15c2cfca8fe7908)) +* Add new tag and icon ([#73](https://github.com/pancakeswap/pancake-toolkit/issues/73)) ([04cd6f8](https://github.com/pancakeswap/pancake-toolkit/commit/04cd6f8ef63f8c2a6882552d7fde577fc339f737)) +* **button:** Icon button ([#69](https://github.com/pancakeswap/pancake-toolkit/issues/69)) ([1b34b28](https://github.com/pancakeswap/pancake-toolkit/commit/1b34b283de74513b4d059e5cf7b3382b83d99586)) +* **checkbox:** Added scale ([#68](https://github.com/pancakeswap/pancake-toolkit/issues/68)) ([0c1d224](https://github.com/pancakeswap/pancake-toolkit/commit/0c1d22476eef1595c611614c62c3e60813f7ec24)) +* **icon:** Arrow forward ([#70](https://github.com/pancakeswap/pancake-toolkit/issues/70)) ([4692bb9](https://github.com/pancakeswap/pancake-toolkit/commit/4692bb9bfe1b9a49f7a52e7bb0ccfc47dc839c19)) +* Add cake price to menu ([#49](https://github.com/pancakeswap/pancake-toolkit/issues/49)) ([9cbc7c4](https://github.com/pancakeswap/pancake-toolkit/commit/9cbc7c4f7286e959f5274b883c93a6406589a997)) +* Add color theme support in text props ([#61](https://github.com/pancakeswap/pancake-toolkit/issues/61)) ([2bbc200](https://github.com/pancakeswap/pancake-toolkit/commit/2bbc20097a1fdc1a48137186669b612daa0c88aa)) +* Add dropdown submenus ([#51](https://github.com/pancakeswap/pancake-toolkit/issues/51)) ([d8592e6](https://github.com/pancakeswap/pancake-toolkit/commit/d8592e6625f210648a2268cdf967d7df974205e9)) +* Add modal ([#26](https://github.com/pancakeswap/pancake-toolkit/issues/26)) ([2a86cda](https://github.com/pancakeswap/pancake-toolkit/commit/2a86cdaf4b5c46bd985d68f2e5db90d31be1845d)) +* Add more states to buttons ([#36](https://github.com/pancakeswap/pancake-toolkit/issues/36)) ([d0d307e](https://github.com/pancakeswap/pancake-toolkit/commit/d0d307e23c051b090bdfc188de64c90b525d4924)) +* Add new icons ([8e6062f](https://github.com/pancakeswap/pancake-toolkit/commit/8e6062fe339c2a29f6af5d0192fcc0718ef964d7)) +* Add new icons ([#63](https://github.com/pancakeswap/pancake-toolkit/issues/63)) ([35860c7](https://github.com/pancakeswap/pancake-toolkit/commit/35860c7bbbc929bf848dd5c32f1431e699a6ca07)) +* Add new props for Link component ([#66](https://github.com/pancakeswap/pancake-toolkit/issues/66)) ([28cbb64](https://github.com/pancakeswap/pancake-toolkit/commit/28cbb644733bbed3a7b6165101e375c53d8f0cea)) +* Add the pancake eslint config ([fb3608d](https://github.com/pancakeswap/pancake-toolkit/commit/fb3608daeeee92b28f4e69d379fe705b42b3f79f)) +* **nav:** New menu item ([#48](https://github.com/pancakeswap/pancake-toolkit/issues/48)) ([af92b47](https://github.com/pancakeswap/pancake-toolkit/commit/af92b474ef96aa192453443efdb9121ac8f04630)) +* Add Link component ([#13](https://github.com/pancakeswap/pancake-toolkit/issues/13)) ([339d0ef](https://github.com/pancakeswap/pancake-toolkit/commit/339d0efd233eaa0db478a9c7e2cdeef6f5ef4e9a)) +* Add reset.css component ([#9](https://github.com/pancakeswap/pancake-toolkit/issues/9)) ([855e648](https://github.com/pancakeswap/pancake-toolkit/commit/855e6488e1744acb500f74a5daed81ca42a22964)) +* Add space props from styled-system ([#42](https://github.com/pancakeswap/pancake-toolkit/issues/42)) ([ce4cc9a](https://github.com/pancakeswap/pancake-toolkit/commit/ce4cc9a0d3656b9979622cabe9549d7477bc6da5)) +* Add text component ([#12](https://github.com/pancakeswap/pancake-toolkit/issues/12)) ([1fe5fcd](https://github.com/pancakeswap/pancake-toolkit/commit/1fe5fcd5952eaadbd9d50e94e91060599b1af81e)) +* Button ([#8](https://github.com/pancakeswap/pancake-toolkit/issues/8)) ([e5ab247](https://github.com/pancakeswap/pancake-toolkit/commit/e5ab247d89130c0bc09595be7fd20b6f284e6fed)) +* ButtonMenu ([#10](https://github.com/pancakeswap/pancake-toolkit/issues/10)) ([1a85549](https://github.com/pancakeswap/pancake-toolkit/commit/1a855498803b6e838aec2bb386f6860a6a37967c)) +* Card component ([#11](https://github.com/pancakeswap/pancake-toolkit/issues/11)) ([b99f5b6](https://github.com/pancakeswap/pancake-toolkit/commit/b99f5b6423775691353b5c7db12ad29d4521765b)) +* Card ribbon ([#52](https://github.com/pancakeswap/pancake-toolkit/issues/52)) ([257a49c](https://github.com/pancakeswap/pancake-toolkit/commit/257a49c6706b67a08fbe92a160f9f91784895ab1)) +* Checkbox ([#20](https://github.com/pancakeswap/pancake-toolkit/issues/20)) ([bb4c67e](https://github.com/pancakeswap/pancake-toolkit/commit/bb4c67e3f62a20f215b1ba86303abe10401d85d4)) +* Heading ([#18](https://github.com/pancakeswap/pancake-toolkit/issues/18)) ([9e89a7a](https://github.com/pancakeswap/pancake-toolkit/commit/9e89a7afb32866d66ffa7a8ff8ce648fc1a00bb9)) +* Layout ([#21](https://github.com/pancakeswap/pancake-toolkit/issues/21)) ([72162ed](https://github.com/pancakeswap/pancake-toolkit/commit/72162edc9b0d44ff3a6eddfae9550ed684a9f8f4)) +* Navbar ([#40](https://github.com/pancakeswap/pancake-toolkit/issues/40)) ([f68ffa0](https://github.com/pancakeswap/pancake-toolkit/commit/f68ffa05362b2d80a86fb0abd5b0d84ca2f62a0b)) +* Panel ([#32](https://github.com/pancakeswap/pancake-toolkit/issues/32)) ([907994c](https://github.com/pancakeswap/pancake-toolkit/commit/907994cc047f3fc0dfa64f49cee09d459a194d89)) +* Progress ([#50](https://github.com/pancakeswap/pancake-toolkit/issues/50)) ([49a9c26](https://github.com/pancakeswap/pancake-toolkit/commit/49a9c26c613f1bd291e39e4b25b2823a282e81c2)) +* **card:** Card states ([#25](https://github.com/pancakeswap/pancake-toolkit/issues/25)) ([67305eb](https://github.com/pancakeswap/pancake-toolkit/commit/67305eb1c216ce7419367433e153cf54e9fe85fd)) +* **tags:** Outline variant ([#41](https://github.com/pancakeswap/pancake-toolkit/issues/41)) ([62bbb56](https://github.com/pancakeswap/pancake-toolkit/commit/62bbb56bd290625305f9936585156725f6429c37)) +* **wallet:** Add ids for analytics ([#115](https://github.com/pancakeswap/pancake-toolkit/issues/115)) ([851de1b](https://github.com/pancakeswap/pancake-toolkit/commit/851de1bba96aa2156bfb87dac9bc0bf476492410)) +* Svg and icons ([#28](https://github.com/pancakeswap/pancake-toolkit/issues/28)) ([6261102](https://github.com/pancakeswap/pancake-toolkit/commit/62611029d2787000599e00fb6a16a32c6a8b5c31)) +* Tags ([#23](https://github.com/pancakeswap/pancake-toolkit/issues/23)) ([dbc4da2](https://github.com/pancakeswap/pancake-toolkit/commit/dbc4da29ef66e2be92602a6271c66255d7cd0099)) +* Toggle ([#27](https://github.com/pancakeswap/pancake-toolkit/issues/27)) ([b770cb3](https://github.com/pancakeswap/pancake-toolkit/commit/b770cb335e3e88c2c5f045a2ae1bd360b0c2afba)) + + +### Performance Improvements + +* Memo menu components ([ba47f13](https://github.com/pancakeswap/pancake-toolkit/commit/ba47f13c1f833015375306c312b0fc6a7ef35b97)) + + +### Reverts + +* Revert "feat: Input border color (#186)" (#187) ([e3ab69a](https://github.com/pancakeswap/pancake-toolkit/commit/e3ab69a1040ceae3f5e65d45d0229adefdf2ccd2)), closes [#186](https://github.com/pancakeswap/pancake-toolkit/issues/186) [#187](https://github.com/pancakeswap/pancake-toolkit/issues/187) +* Revert "chore: Add 4 telegram groups" ([3de730c](https://github.com/pancakeswap/pancake-toolkit/commit/3de730cc067aaedb6b123d3018aa3d8de7f2bb84)) + + + diff --git a/README.md b/README.md index 800b7ad..e41b453 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,25 @@ -# highcity-toolkit +# Pancake Toolkit -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +This repository is a monorepo manage with [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) and [Lerna](https://lerna.js.org/). -#### 软件架构 -软件架构说明 +## Packages +- [pancake-uikit](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit) : React components used to build the Pancake UI +- [eslint-config-pancake](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake) : An ESLint config for pancake, with Typescript and Prettier support -#### 安装教程 +## How to use -1. xxxx -2. xxxx -3. xxxx +Clone the repository -#### 使用说明 +``` +git clone git@github.com:pancakeswap/pancake-toolkit.git +``` -1. xxxx -2. xxxx -3. xxxx +Run yarn at the root of the workspace -#### 参与贡献 +``` +cd pancake-toolkit +yarn +``` -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +Then, refer to the readme of each project. \ No newline at end of file diff --git a/lerna.json b/lerna.json new file mode 100644 index 0000000..0bf81fd --- /dev/null +++ b/lerna.json @@ -0,0 +1,13 @@ +{ + "packages": ["packages/*"], + "version": "independent", + "npmClient": "yarn", + "workspaces": true, + "ignoreChanges": ["**/__tests__/**", "**/*.md", "**/.storybook/**"], + "command": { + "version": { + "conventionalCommits": true, + "message": "chore(release): Publish" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5455ef3 --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "pancake-toolkit", + "version": "1.0.0", + "description": "Pancake frontend packages", + "private": true, + "workspaces": [ + "packages/*" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/pancakeswap/pancake-toolkit.git" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/pancakeswap/pancake-toolkit/issues" + }, + "homepage": "https://github.com/pancakeswap/pancake-toolkit#readme", + "scripts": { + "build": "lerna run build", + "test": "lerna run test", + "lint": "lerna run lint", + "format:check": "lerna run format:check", + "storybook:build": "lerna run storybook:build", + "release": "yarn build && yarn lerna publish" + }, + "husky": { + "hooks": { + "pre-commit": "yarn format:check", + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + }, + "devDependencies": { + "@babel/core": "^7.14.3", + "@babel/preset-env": "^7.14.4", + "@commitlint/cli": "^12.1.1", + "@commitlint/config-conventional": "^12.1.1", + "@pancakeswap/eslint-config-pancake": "1.2.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-typescript": "^8.2.1", + "@rollup/plugin-url": "^6.0.0", + "@storybook/addon-a11y": "^6.2.9", + "@storybook/addon-actions": "^6.2.9", + "@storybook/addon-essentials": "^6.2.9", + "@storybook/addon-links": "^6.2.9", + "@storybook/react": "^6.2.9", + "@types/react": "^17.0.5", + "@types/react-router-dom": "^5.1.7", + "@types/react-transition-group": "^4.4.1", + "@types/styled-components": "^5.1.9", + "@typescript-eslint/eslint-plugin": "^4.23.0", + "@typescript-eslint/parser": "^4.23.0", + "babel-loader": "^8.2.2", + "babel-plugin-styled-components": "^1.12.0", + "eslint": "^7.26.0", + "husky": "4.3.5", + "jest": "^26.6.3", + "lerna": "^4.0.0", + "prettier": "^2.3.0", + "react-is": "^17.0.2", + "rollup": "^2.47.0", + "themeprovider-storybook": "^1.7.1", + "ts-jest": "^26.5.6", + "tslib": "^2.2.0", + "typescript": "^4.2.4" + } +} diff --git a/packages/eslint-config-pancake/CHANGELOG.md b/packages/eslint-config-pancake/CHANGELOG.md new file mode 100644 index 0000000..ddbb02e --- /dev/null +++ b/packages/eslint-config-pancake/CHANGELOG.md @@ -0,0 +1,33 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [1.2.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/compare/@pancakeswap/eslint-config-pancake@1.1.0...@pancakeswap/eslint-config-pancake@1.2.0) (2021-07-09) + + +### Features + +* Migrate ad-hoc FE rules to eslint-config ([#187](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/issues/187)) ([75baf17](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/commit/75baf175c8316fdfc549bc99e2bc38d65b18c5b6)) + + + + + +# 1.1.0 (2021-05-07) + + +### Features + +* Add eslint package ([#7](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/issues/7)) ([0e0454e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/commit/0e0454eb9a63e976934956dc5c66fbef2ce2017a)) + + + + + +## [1.0.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/compare/@pancakeswap-libs/eslint-config-pancake@1.0.1...@pancakeswap-libs/eslint-config-pancake@1.0.1) (2021-03-19) + + +### Features + +* Add eslint package ([#7](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/issues/7)) ([0e0454e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake/commit/0e0454eb9a63e976934956dc5c66fbef2ce2017a)) diff --git a/packages/eslint-config-pancake/README.md b/packages/eslint-config-pancake/README.md new file mode 100644 index 0000000..f355b32 --- /dev/null +++ b/packages/eslint-config-pancake/README.md @@ -0,0 +1,15 @@ +# eslint-config-pancake + +Pancake Eslint config with: + +- Airbnb config +- Typescript +- Prettier + +## Usage + +``` +npx install-peerdeps --dev @pancakeswap/eslint-config-pancake +``` + +Add `"extends": "@pancakeswap/eslint-config-pancake"` to your eslint config file. diff --git a/packages/eslint-config-pancake/lib/index.js b/packages/eslint-config-pancake/lib/index.js new file mode 100644 index 0000000..980ff30 --- /dev/null +++ b/packages/eslint-config-pancake/lib/index.js @@ -0,0 +1,58 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 2017, + ecmaFeatures: { + jsx: true, + }, + }, + env: { + es6: true, + browser: true, + }, + settings: { + "import/resolver": { + node: { + extensions: [".js", ".ts", ".jsx", ".tsx"], + }, + }, + "import/extensions": [".js", ".ts", ".jsx", ".tsx"], + }, + extends: [ + "airbnb", + "airbnb/hooks", + "prettier", + "prettier/react", + "prettier/@typescript-eslint", + "plugin:@typescript-eslint/recommended", + ], + rules: { + // Typescript + "@typescript-eslint/no-unused-vars": "warn", + "no-use-before-define": "off", + "@typescript-eslint/no-use-before-define": ["warn"], + "no-shadow": "off", + "@typescript-eslint/no-shadow": ["error"], + "no-console": ["warn", { allow: ["info", "warn", "error"] }], + "no-plusplus": 0, + "prefer-destructuring": ["warn", { object: true, array: false }], + "no-underscore-dangle": 0, + // React + "react/jsx-filename-extension": ["error", { extensions: [".tsx"] }], + "react/prop-types": 0, + "react/jsx-props-no-spreading": 0, + "react/no-multi-comp": 0, + "import/extensions": [ + "error", + "ignorePackages", + { + js: "never", + mjs: "never", + jsx: "never", + ts: "never", + tsx: "never", + }, + ], + }, +}; diff --git a/packages/eslint-config-pancake/package.json b/packages/eslint-config-pancake/package.json new file mode 100644 index 0000000..169c955 --- /dev/null +++ b/packages/eslint-config-pancake/package.json @@ -0,0 +1,30 @@ +{ + "name": "@pancakeswap/eslint-config-pancake", + "version": "1.2.0", + "description": "Eslint config for PancakeSwap", + "main": "lib/index.js", + "files": [ + "lib" + ], + "repository": "https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/eslint-config-pancake", + "license": "MIT", + "author": "RabbitDoge", + "private": false, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^4.7.0", + "@typescript-eslint/parser": "^4.7.0", + "eslint-config-airbnb": "^18.2.1", + "eslint-config-prettier": "^6.15.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.0.0" + }, + "peerDependencies": { + "eslint": "^7.2.0", + "prettier": "^2.1.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/pancake-profile-sdk/CHANGELOG.md b/packages/pancake-profile-sdk/CHANGELOG.md new file mode 100644 index 0000000..ce72d59 --- /dev/null +++ b/packages/pancake-profile-sdk/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2021-06-14) + + +### Features + +* New Package: Profile SDK ([#80](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-profile-sdk/issues/80)) ([13dda1e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-profile-sdk/commit/13dda1e43c6528dd7a1812c8a860f6f242148062)) diff --git a/packages/pancake-profile-sdk/README.md b/packages/pancake-profile-sdk/README.md new file mode 100644 index 0000000..ec67380 --- /dev/null +++ b/packages/pancake-profile-sdk/README.md @@ -0,0 +1,223 @@ +# Pancakeswap Profile SDK + +This package provides some handy functions to retrieve data for Pancakeswap Profile system. + +If you're looking for React-ready solution - take a look at the [profile-hook](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-profile-hook). + +##### Table of Contents + +- [Installation](#installation) +- [Usage](#usage) + - [Initialization](#initialization) + - [getUsername](#getUsername) + - [getTeam](#getTeam) + - [getProfile](#getProfile) + - [getAchievements](#getAchievements) +- [Roadmap](#roadmap) + +## Installation + +Install `@pancakeswap/profile-sdk` into your project with npm: + +```bash +npm install @pancakeswap/profile-sdk --save +``` + +or yarn: + +```bash +yarn add @pancakeswap/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 PancakeProfileSdk from "@pancakeswap/profile-sdk"; + +const pancakeSdk = new PancakeProfileSdk(); +``` + +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 PancakeProfileSdk from "@pancakeswap/profile-sdk"; +import Web3 from "web3"; + +const httpProvider = new Web3.providers.HttpProvider("https://mycustomnode.com", { + timeout: 5000, +}); +const myWeb3 = new Web3(httpProvider); + +const pancakeSdk = new PancakeProfileSdk(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 PancakeProfileSdk from "@pancakeswap/profile-sdk"; + +const pancakeSdk = new PancakeProfileSdk(); +const username = pancakeSdk.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 PancakeProfileSdk from "@pancakeswap/profile-sdk"; + +const pancakeSdk = new PancakeProfileSdk(); +const team = pancakeSdk.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 pancakeswap.finance domain, maybe configurable in future versions) + +```js +import PancakeProfileSdk from "@pancakeswap/profile-sdk"; + +const pancakeSdk = new PancakeProfileSdk(); +const profile = pancakeSdk.getProfile("0x123456789"); +console.log(profile); +// { +// hasRegistered: true +// profile: { +// userId: 6173, +// points: 2500, +// teamId: 1, +// nftAddress: "0x11111111", +// tokenId: 15, +// isActive: true, +// username: "Matatabi", +// nft: { +// name: "Hiccup", +// description: "Oopsie daisy! Hiccup's had a bit of an accident. Poor little fella.", +// images: { +// lg: "hiccup-lg.png", +// md: "hiccup-md.png", +// sm: "hiccup-sm.png", +// ipfs: "https://gateway.pinata.cloud/ipfs/QmQ6EE6gkVzAQUdQLLM7CyrnME6LZHCoy92ZERW8HXmyjw/hiccup.png", +// }, +// sortOrder: 999, +// identifier: 'hiccup' +// type: 'pancake', +// 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 PancakeProfileSdk from "@pancakeswap/profile-sdk"; + +const pancakeSdk = new PancakeProfileSdk(); + +const achievements = pancakeSdk.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) 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/pancake-profile-sdk/babel.config.js b/packages/pancake-profile-sdk/babel.config.js new file mode 100644 index 0000000..dd242dc --- /dev/null +++ b/packages/pancake-profile-sdk/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-typescript", + ], +}; diff --git a/packages/pancake-profile-sdk/jest.config.js b/packages/pancake-profile-sdk/jest.config.js new file mode 100644 index 0000000..6b49436 --- /dev/null +++ b/packages/pancake-profile-sdk/jest.config.js @@ -0,0 +1,10 @@ +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/pancake-profile-sdk/jest.setup.js b/packages/pancake-profile-sdk/jest.setup.js new file mode 100644 index 0000000..25ceccb --- /dev/null +++ b/packages/pancake-profile-sdk/jest.setup.js @@ -0,0 +1,12 @@ +// 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/pancake-profile-sdk/package.json b/packages/pancake-profile-sdk/package.json new file mode 100644 index 0000000..993cc88 --- /dev/null +++ b/packages/pancake-profile-sdk/package.json @@ -0,0 +1,48 @@ +{ + "name": "@pancakeswap/profile-sdk", + "version": "0.1.0", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts", + "license": "MIT", + "repository": "https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-profile-sdk", + "scripts": { + "build": "rm -rf ./dist && rollup -c && tsc -d --emitDeclarationOnly --declarationDir dist", + "start": "yarn build && node ./dist", + "test": "jest", + "test:coverage": "jest --collectCoverage", + "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", + "format:check": "prettier --check --loglevel error 'src/**/*.{js,jsx,ts,tsx}'", + "format:write": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'" + }, + "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.4", + "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" + } +} diff --git a/packages/pancake-profile-sdk/rollup.config.js b/packages/pancake-profile-sdk/rollup.config.js new file mode 100644 index 0000000..9500721 --- /dev/null +++ b/packages/pancake-profile-sdk/rollup.config.js @@ -0,0 +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"; + +export default { + input: "src/index.ts", + output: [ + { 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"], +}; diff --git a/packages/pancake-profile-sdk/src/abi/erc721.json b/packages/pancake-profile-sdk/src/abi/erc721.json new file mode 100644 index 0000000..7880dcb --- /dev/null +++ b/packages/pancake-profile-sdk/src/abi/erc721.json @@ -0,0 +1,191 @@ +[ + { + "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/pancake-profile-sdk/src/abi/pancakeProfile.json b/packages/pancake-profile-sdk/src/abi/pancakeProfile.json new file mode 100644 index 0000000..8863a27 --- /dev/null +++ b/packages/pancake-profile-sdk/src/abi/pancakeProfile.json @@ -0,0 +1,717 @@ +[ + { + "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/pancake-profile-sdk/src/constants/__mocks__/nfts.ts b/packages/pancake-profile-sdk/src/constants/__mocks__/nfts.ts new file mode 100644 index 0000000..36a57b5 --- /dev/null +++ b/packages/pancake-profile-sdk/src/constants/__mocks__/nfts.ts @@ -0,0 +1,71 @@ +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.PANCAKE]: { + address: { + 56: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", + 97: "0x60935F36e4631F73f0f407e68642144e07aC7f5E", + }, + identifierKey: "image", + }, + [NftType.MIXIE]: { + address: { + 56: "0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566", + 97: "", + }, + identifierKey: "otherIdentifier", + }, +}; + +const Nfts: Nft[] = [ + { + name: "Mixie v1", + description: "Stories were told, and songs were sung, about Chef Mixie’s pancakes and her big Syrup gun.", + images: { + lg: "mixie-1-lg.png", + md: "mixie-1-md.png", + sm: "mixie-1-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Chef-Mixie.png`, + }, + sortOrder: 999, + identifier: "001-Chef-Mixie", + type: NftType.MIXIE, + variationId: 1, + }, + { + name: "Sleepy", + description: "Aww, looks like eating pancakes all day is tough work. Sweet dreams!", + images: { + lg: "sleepy-lg.png", + md: "sleepy-md.png", + sm: "sleepy-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/sleepy.png`, + blur: "sleepy-blur.png", + }, + sortOrder: 999, + identifier: "sleepy", + type: NftType.PANCAKE, + variationId: 5, + }, + { + name: "Swapsies", + description: "These bunnies love nothing more than swapping pancakes. Especially on BSC.", + images: { + lg: "swapsies-lg.png", + md: "swapsies-md.png", + sm: "swapsies-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/swapsies.png`, + blur: "swapsies-blur.png", + }, + sortOrder: 999, + identifier: "swapsies", + type: NftType.PANCAKE, + variationId: 0, + }, +]; + +export default Nfts; diff --git a/packages/pancake-profile-sdk/src/constants/campaigns.ts b/packages/pancake-profile-sdk/src/constants/campaigns.ts new file mode 100644 index 0000000..6ee45b1 --- /dev/null +++ b/packages/pancake-profile-sdk/src/constants/campaigns.ts @@ -0,0 +1,169 @@ +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/pancake-profile-sdk/src/constants/common.ts b/packages/pancake-profile-sdk/src/constants/common.ts new file mode 100644 index 0000000..38842b3 --- /dev/null +++ b/packages/pancake-profile-sdk/src/constants/common.ts @@ -0,0 +1,7 @@ +export const profileApi = "https://profile.pancakeswap.com"; +export const profileSubgraphApi = "https://api.thegraph.com/subgraphs/name/pancakeswap/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/pancake-profile-sdk/src/constants/contracts.ts b/packages/pancake-profile-sdk/src/constants/contracts.ts new file mode 100644 index 0000000..9352d5a --- /dev/null +++ b/packages/pancake-profile-sdk/src/constants/contracts.ts @@ -0,0 +1,6 @@ +export default { + pancakeProfile: { + 56: "0xDf4dBf6536201370F95e06A0F8a7a70fE40E388a", + 97: "0x4B683C7E13B6d5D7fd1FeA9530F451954c1A7c8A", + }, +}; diff --git a/packages/pancake-profile-sdk/src/constants/nfts.ts b/packages/pancake-profile-sdk/src/constants/nfts.ts new file mode 100644 index 0000000..9cc78de --- /dev/null +++ b/packages/pancake-profile-sdk/src/constants/nfts.ts @@ -0,0 +1,308 @@ +import { Nft, NftType, NftSource } from "../types"; +import { IPFS_GATEWAY } from "./common"; + +export const nftSources: NftSource = { + [NftType.PANCAKE]: { + address: { + 56: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", + 97: "0x60935F36e4631F73f0f407e68642144e07aC7f5E", + }, + identifierKey: "image", + }, + [NftType.MIXIE]: { + address: { + 56: "0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566", + 97: "", + }, + identifierKey: "image", + }, +}; + +const Nfts: Nft[] = [ + { + name: "Mixie v1", + description: "Stories were told, and songs were sung, about Chef Mixie’s pancakes and her big Syrup gun.", + images: { + lg: "mixie-1-lg.png", + md: "mixie-1-md.png", + sm: "mixie-1-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/001-Chef-Mixie.png`, + }, + sortOrder: 999, + identifier: "001-Chef-Mixie", + type: NftType.MIXIE, + variationId: 1, + }, + { + name: "Mixie v2", + description: "Stories were told, and songs were sung, about Chef Mixie’s pancakes and her big Syrup gun.", + images: { + lg: "mixie-2-lg.png", + md: "mixie-2-md.png", + sm: "mixie-2-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/002-Chef-Mixie.png`, + }, + sortOrder: 999, + identifier: "002-Chef-Mixie", + type: NftType.MIXIE, + variationId: 2, + }, + { + name: "Mixie v3", + description: "Stories were told, and songs were sung, about Chef Mixie’s pancakes and her big Syrup gun.", + images: { + lg: "mixie-3-lg.png", + md: "mixie-3-md.png", + sm: "mixie-3-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmQiRpr7ZMkzV7qbqVaUZ1LiuHTTdpWmapUhaY6ZGmVLQ4/003-Chef-Mixie.png`, + }, + sortOrder: 999, + identifier: "003-Chef-Mixie", + type: NftType.MIXIE, + variationId: 3, + }, + { + name: "Easter ‘21 Champions", + description: "Eggscellent! Celebrating Syrup Storm winning the Easter Battle!", + images: { + lg: "easter-champion-storm-lg.png", + md: "easter-champion-storm-md.png", + sm: "easter-champion-storm-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.PANCAKE, + 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.PANCAKE, + 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.PANCAKE, + 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.PANCAKE, + 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.PANCAKE, + variationId: 11, + }, + { + name: "Hiccup", + description: "Oopsie daisy! Hiccup's had a bit of an accident. Poor little fella.", + images: { + lg: "hiccup-lg.png", + md: "hiccup-md.png", + sm: "hiccup-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmQ6EE6gkVzAQUdQLLM7CyrnME6LZHCoy92ZERW8HXmyjw/hiccup.png`, + }, + sortOrder: 999, + identifier: "hiccup", + type: NftType.PANCAKE, + variationId: 10, + }, + { + name: "Sleepy", + description: "Aww, looks like eating pancakes all day is tough work. Sweet dreams!", + images: { + lg: "sleepy-lg.png", + md: "sleepy-md.png", + sm: "sleepy-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/sleepy.png`, + blur: "sleepy-blur.png", + }, + sortOrder: 999, + identifier: "sleepy", + type: NftType.PANCAKE, + variationId: 5, + }, + { + name: "Sunny", + description: "Sunny is always cheerful when there are pancakes around. Smile!", + images: { + lg: "sunny-lg.png", + md: "sunny-md.png", + sm: "sunny-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/sunny.png`, + blur: "sunny-blur.png", + }, + sortOrder: 999, + identifier: "sunny", + type: NftType.PANCAKE, + variationId: 9, + }, + { + name: "Churro", + description: "Don't let that dopey smile deceive you... Churro's a master CAKE chef!", + images: { + lg: "churro-lg.png", + md: "churro-md.png", + sm: "churro-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/churro.png`, + blur: "churro-blur.png", + }, + sortOrder: 999, + identifier: "churro", + type: NftType.PANCAKE, + 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.PANCAKE, + 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.PANCAKE, + variationId: 7, + }, + { + name: "Swapsies", + description: "These bunnies love nothing more than swapping pancakes. Especially on BSC.", + images: { + lg: "swapsies-lg.png", + md: "swapsies-md.png", + sm: "swapsies-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/swapsies.png`, + blur: "swapsies-blur.png", + }, + sortOrder: 999, + identifier: "swapsies", + type: NftType.PANCAKE, + variationId: 0, + }, + { + name: "Drizzle", + description: "It's raining syrup on this bunny, but he doesn't seem to mind. Can you blame him?", + images: { + lg: "drizzle-lg.png", + md: "drizzle-md.png", + sm: "drizzle-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/drizzle.png`, + blur: "drizzle-blur.png", + }, + sortOrder: 999, + identifier: "drizzle", + type: NftType.PANCAKE, + variationId: 1, + }, + { + name: "Blueberries", + description: "These bunnies like their pancakes with blueberries. What's your favorite topping?", + images: { + lg: "blueberries-lg.png", + md: "blueberries-md.png", + sm: "blueberries-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/blueberries.png`, + blur: "blueberries-blur.png", + }, + sortOrder: 999, + identifier: "blueberries", + type: NftType.PANCAKE, + variationId: 2, + }, + { + name: "Circular", + description: "Love makes the world go 'round... but so do pancakes. And these bunnies know it.", + images: { + lg: "circular-lg.png", + md: "circular-md.png", + sm: "circular-sm.png", + ipfs: `${IPFS_GATEWAY}/ipfs/QmXdHqg3nywpNJWDevJQPtkz93vpfoHcZWQovFz2nmtPf5/circular.png`, + blur: "circular-blur.png", + }, + sortOrder: 999, + identifier: "circular", + type: NftType.PANCAKE, + variationId: 3, + }, + { + name: "Sparkle", + description: "It’s sparkling syrup, pancakes, and even lottery tickets! This bunny really loves it.", + 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.PANCAKE, + variationId: 4, + }, +]; + +export default Nfts; diff --git a/packages/pancake-profile-sdk/src/constants/teams.ts b/packages/pancake-profile-sdk/src/constants/teams.ts new file mode 100644 index 0000000..e5057b5 --- /dev/null +++ b/packages/pancake-profile-sdk/src/constants/teams.ts @@ -0,0 +1,54 @@ +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/pancake-profile-sdk/src/images/chaotic-cakers-alt.png b/packages/pancake-profile-sdk/src/images/chaotic-cakers-alt.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ba3113fe0142c4308e1b8594e2f2fd50d2b29b GIT binary patch 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)<= literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/chaotic-cakers-bg.svg b/packages/pancake-profile-sdk/src/images/chaotic-cakers-bg.svg new file mode 100644 index 0000000..46eb4de --- /dev/null +++ b/packages/pancake-profile-sdk/src/images/chaotic-cakers-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/pancake-profile-sdk/src/images/chaotic-cakers-lg.png b/packages/pancake-profile-sdk/src/images/chaotic-cakers-lg.png new file mode 100644 index 0000000000000000000000000000000000000000..a016d9b8fec0086b017b2e9b6577b36cc85f43b4 GIT binary patch literal 24506 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 literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/chaotic-cakers-md.png b/packages/pancake-profile-sdk/src/images/chaotic-cakers-md.png new file mode 100644 index 0000000000000000000000000000000000000000..4252c74c10e38019d33c8688e47267307659ce71 GIT binary patch literal 7042 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 literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/chaotic-cakers-sm.png b/packages/pancake-profile-sdk/src/images/chaotic-cakers-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..b18a7c0c4af7d01ac0e9073c8d100732819eee43 GIT binary patch literal 1687 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 Z`~)78sx38IqyYc`002ovPDHLkV1i4b$N~TW literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/fearsome-flippers-bg.svg b/packages/pancake-profile-sdk/src/images/fearsome-flippers-bg.svg new file mode 100644 index 0000000..7d5020f --- /dev/null +++ b/packages/pancake-profile-sdk/src/images/fearsome-flippers-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/pancake-profile-sdk/src/images/fearsome-flippers-lg.png b/packages/pancake-profile-sdk/src/images/fearsome-flippers-lg.png new file mode 100644 index 0000000000000000000000000000000000000000..dd90d98af7ccb1871b4add05f9ddf90b14747edb GIT binary patch literal 72285 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

0RS!P848btF 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 Ef=^RwKL7v# literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/fearsome-flippers-md.png b/packages/pancake-profile-sdk/src/images/fearsome-flippers-md.png new file mode 100644 index 0000000000000000000000000000000000000000..83ee7e60ce9e02db57603e6c2dbd635aaaddf533 GIT binary patch literal 7000 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 \ No newline at end of file diff --git a/packages/pancake-profile-sdk/src/images/syrup-storm-lg.png b/packages/pancake-profile-sdk/src/images/syrup-storm-lg.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d01d5f0e2c6773e3323197e0a515ae10c0b225 GIT binary patch literal 80266 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 z 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 Jl)W$t`X9~4e#HO) literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/syrup-storm-md.png b/packages/pancake-profile-sdk/src/images/syrup-storm-md.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea8498a91ceeca417904c0e93b16333d8193b8b GIT binary patch literal 7294 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 Y1KFnxf&&crQ~&?~07*qoM6N<$g5b>PQUCw| literal 0 HcmV?d00001 diff --git a/packages/pancake-profile-sdk/src/images/syrup-storm-sm.png b/packages/pancake-profile-sdk/src/images/syrup-storm-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..aefc6c5daa89660611ce31f8a7a9932a132363b3 GIT binary patch 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/sleepy.json`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + name: "Sleepy", + description: "Aww, looks like eating pancakes all day is tough work. Sweet dreams!", + image: "ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/sleepy.png", + attributes: { + bunnyId: "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/pancake-profile-sdk/src/mocks/mockAddresses.ts b/packages/pancake-profile-sdk/src/mocks/mockAddresses.ts new file mode 100644 index 0000000..f74f75a --- /dev/null +++ b/packages/pancake-profile-sdk/src/mocks/mockAddresses.ts @@ -0,0 +1,3 @@ +export const existingAddress1 = "0x1111111111111111111111111111111111111111"; +export const existingAddress2 = "0x2222222222222222222222222222222222222222"; +export const nonexistentAddress = "0x9999999999999999999999999999999999999999"; diff --git a/packages/pancake-profile-sdk/src/mocks/server.ts b/packages/pancake-profile-sdk/src/mocks/server.ts new file mode 100644 index 0000000..eb97252 --- /dev/null +++ b/packages/pancake-profile-sdk/src/mocks/server.ts @@ -0,0 +1,9 @@ +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/pancake-profile-sdk/src/profile-sdk.test.ts b/packages/pancake-profile-sdk/src/profile-sdk.test.ts new file mode 100644 index 0000000..8a2d933 --- /dev/null +++ b/packages/pancake-profile-sdk/src/profile-sdk.test.ts @@ -0,0 +1,187 @@ +import Web3 from "web3"; +import Cookies from "js-cookie"; +import PancakeProfileSdk 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("PancakeProfileSdk", () => { + describe("constructor", () => { + it("uses default web3 instance if no web3 is provided", () => { + const sdk = new PancakeProfileSdk(); + expect(sdk.web3).toBe(web3NoAccount); + }); + it("uses mainnet chainId if no chainId is provided", () => { + const sdk = new PancakeProfileSdk(); + 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 PancakeProfileSdk({ web3: customWeb3 }); + expect(sdk.web3).toBe(customWeb3); + }); + it("uses specific chainId if chainId is provided", () => { + const sdk = new PancakeProfileSdk({ chainId: TESTNET_CHAIN_ID }); + expect(sdk.chainId).toBe(TESTNET_CHAIN_ID); + }); + }); + + describe("methods", () => { + const sdk = new PancakeProfileSdk(); + 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 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://pancakeswap.finance/images/nfts/${sleepyNft.images.sm}`, + }, + { domain: "pancakeswap.finance", secure: true, expires: 30 } + ); + expect(Cookies.set).toBeCalledTimes(1); + }); + }); + }); +}); diff --git a/packages/pancake-profile-sdk/src/profile-sdk.ts b/packages/pancake-profile-sdk/src/profile-sdk.ts new file mode 100644 index 0000000..eb47daa --- /dev/null +++ b/packages/pancake-profile-sdk/src/profile-sdk.ts @@ -0,0 +1,172 @@ +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; +}; + +class PancakeProfileSdk { + web3 = web3NoAccount; + + chainId = MAINNET_CHAIN_ID; + + 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); + } + + /** + * Fetches user information via REST API + * Contains user information and leaderboard statistics about latest trading competition. + * API repo - https://github.com/pancakeswap/pancake-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); + + 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/pancakeswap/pancake-contracts/tree/master/projects/profile-nft-gamification + */ + getTeam = async (teamId: number): Promise => { + 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 }; + } catch (error) { + return null; + } + }; + + /** + * Fetches profile information for specified address. + * This function combines data from getUsername and getTeam with profile data received getUserProfile method + * from PancakeProfile contract. + * NFT's bunnyId is retrieved from PancakeBunnies contract and mapped to static NFT data stored in constant. + * Contracts repo - https://github.com/pancakeswap/pancake-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: null }; + } + + 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://pancakeswap.finance/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: "pancakeswap.finance", secure: true, expires: 30 } + ); + } + + const profile = { + userId, + points, + teamId, + tokenId, + username, + nftAddress, + isActive, + nft, + team, + } as Profile; + + return { hasRegistered, profile }; + } catch (error) { + console.error("getProfile error: ", error); + return null; + } + }; +} + +export default PancakeProfileSdk; diff --git a/packages/pancake-profile-sdk/src/types.ts b/packages/pancake-profile-sdk/src/types.ts new file mode 100644 index 0000000..af0ff09 --- /dev/null +++ b/packages/pancake-profile-sdk/src/types.ts @@ -0,0 +1,127 @@ +export interface Address { + 97?: string; + 56: string; +} + +export type 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; + + // Uniquely identifies the nft. + // Used for matching an NFT from the config with the data from the NFT's tokenURI + identifier: string; + + // Used to be "bunnyId". Used when minting NFT + variationId?: number | string; +}; + +export enum NftType { + PANCAKE = "pancake", + MIXIE = "mixie", +} + +export type NftUriData = { + name: string; + description: string; + image: string; + attributes: { + bunnyId: string; + }; +}; + +export type NftSource = { + [key in NftType]: { + 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; +}; + +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 type 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/pancake-profile-sdk/src/utils/__mocks__/contractHelpers.ts b/packages/pancake-profile-sdk/src/utils/__mocks__/contractHelpers.ts new file mode 100644 index 0000000..e4947f8 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/__mocks__/contractHelpers.ts @@ -0,0 +1,62 @@ +/* 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(() => Promise.resolve(true)) }; + } + return { call: jest.fn(() => Promise.resolve(false)) }; + }), + getUserProfile: jest.fn((callAddress: string) => { + if (callAddress === existingAddress1) { + return { + call: jest.fn(() => + Promise.resolve({ + 0: 123, + 1: 3000, + 2: 2, + 3: "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07", + 4: 555, + 5: true, + }) + ), + }; + } + return { call: jest.fn(() => Promise.resolve(null)) }; + }), + getTeamProfile: jest.fn((teamId: number) => { + if (teamId === 2) { + return { + call: jest.fn(() => + Promise.resolve({ + 0: "Fearsome Flippers", + 2: 77000, + 3: 341500, + 4: true, + }) + ), + }; + } + return { call: jest.fn(() => 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")), + }; + }), + }, + }; +}); + +module.exports = { getProfileContract, getErc721Contract }; diff --git a/packages/pancake-profile-sdk/src/utils/addressHelpers.test.ts b/packages/pancake-profile-sdk/src/utils/addressHelpers.test.ts new file mode 100644 index 0000000..fc0f4aa --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/addressHelpers.test.ts @@ -0,0 +1,14 @@ +import addresses from "../constants/contracts"; +import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID } from "../constants/common"; +import { getPancakeProfileAddress } from "./addressHelpers"; + +describe("addressHelpers", () => { + it("getAddress returns correct mainnet address", () => { + const profileAddress = getPancakeProfileAddress(MAINNET_CHAIN_ID); + expect(profileAddress).toBe(addresses.pancakeProfile[MAINNET_CHAIN_ID]); + }); + it("getAddress returns correct testnet address", () => { + const profileAddress = getPancakeProfileAddress(TESTNET_CHAIN_ID); + expect(profileAddress).toBe(addresses.pancakeProfile[TESTNET_CHAIN_ID]); + }); +}); diff --git a/packages/pancake-profile-sdk/src/utils/addressHelpers.ts b/packages/pancake-profile-sdk/src/utils/addressHelpers.ts new file mode 100644 index 0000000..a96dd09 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/addressHelpers.ts @@ -0,0 +1,10 @@ +import addresses from "../constants/contracts"; +import { Address } from "../types"; + +export const getNftAddress = (nftAddresses: Address, chainId: number): string => { + return nftAddresses[chainId]; +}; + +export const getPancakeProfileAddress = (chainId: number): string => { + return addresses.pancakeProfile[chainId]; +}; diff --git a/packages/pancake-profile-sdk/src/utils/collectibles.test.ts b/packages/pancake-profile-sdk/src/utils/collectibles.test.ts new file mode 100644 index 0000000..1b53a90 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/collectibles.test.ts @@ -0,0 +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"; + +jest.mock("../constants/nfts"); +jest.mock("./contractHelpers"); + +const PANCAKE_NFT_ADDRESS = "0xDf7952B35f24aCF7fC0487D01c8d5690a60DBa07"; +const MIXIE_NFT_ADDRESS = "0xa251b5EAa9E67F2Bc8b33F33e20E91552Bf85566"; +const UNKNOWN_NFT_ADDRESS = "0xa111122229E67F2Bc8b33F33e20E915522221111"; +const MOCK_TOKEN_ID = 5; + +describe("collectibles", () => { + it("getIdentifierKeyFromAddress returns proper identifier key", () => { + const pancakeIdentifierKey = getIdentifierKeyFromAddress(PANCAKE_NFT_ADDRESS, MAINNET_CHAIN_ID); + const mixieIdentifierKey = getIdentifierKeyFromAddress(MIXIE_NFT_ADDRESS, MAINNET_CHAIN_ID); + expect(pancakeIdentifierKey).toBe("image"); + expect(mixieIdentifierKey).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(PANCAKE_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount); + expect(uriData).toEqual({ + name: "Sleepy", + description: "Aww, looks like eating pancakes all day is tough work. Sweet dreams!", + image: "ipfs://QmYD9AtzyQPjSa9jfZcZq88gSaRssdhGmKqQifUDjGFfXm/sleepy.png", + attributes: { + bunnyId: "5", + }, + }); + }); + + 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" })); + } + ) + ); + const uriData = await getTokenUriData(PANCAKE_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(PANCAKE_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 res(ctx.status(500), ctx.json({ message: "500 Internal Server Error" })); + } + ) + ); + const nft = await getNftByTokenId(PANCAKE_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(MIXIE_NFT_ADDRESS, MOCK_TOKEN_ID, web3NoAccount, MAINNET_CHAIN_ID); + expect(nft).toBe(null); + }); +}); diff --git a/packages/pancake-profile-sdk/src/utils/collectibles.ts b/packages/pancake-profile-sdk/src/utils/collectibles.ts new file mode 100644 index 0000000..8bf3a0e --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/collectibles.ts @@ -0,0 +1,76 @@ +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 ? nftSource.identifierKey : null; +}; + +/** + * Some sources like Pancake do not return HTTP tokenURI's + */ +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); + 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 = 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 (!identifierKey) { + return null; + } + + if (!uriData[identifierKey]) { + return null; + } + + return Nfts.find((nft) => { + return uriData[identifierKey].includes(nft.identifier); + }); +}; diff --git a/packages/pancake-profile-sdk/src/utils/contractHelpers.test.ts b/packages/pancake-profile-sdk/src/utils/contractHelpers.test.ts new file mode 100644 index 0000000..ca65198 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/contractHelpers.test.ts @@ -0,0 +1,26 @@ +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.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 pancakeRabbitContract = getProfileContract(customWeb3, MAINNET_CHAIN_ID); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + expect(pancakeRabbitContract.currentProvider).toBe(httpProvider); + }); +}); diff --git a/packages/pancake-profile-sdk/src/utils/contractHelpers.ts b/packages/pancake-profile-sdk/src/utils/contractHelpers.ts new file mode 100644 index 0000000..4c9f08b --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/contractHelpers.ts @@ -0,0 +1,18 @@ +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/pancakeProfile.json"; +import { getPancakeProfileAddress } from "./addressHelpers"; + +const getContract = (abi: AbiItem, address: string, web3: Web3): Contract => { + 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 getProfileContract = (web3: Web3, chainId: number): Contract => { + return getContract(profileABI as unknown as AbiItem, getPancakeProfileAddress(chainId), web3); +}; diff --git a/packages/pancake-profile-sdk/src/utils/getRpcUrl.test.ts b/packages/pancake-profile-sdk/src/utils/getRpcUrl.test.ts new file mode 100644 index 0000000..9f899dd --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/getRpcUrl.test.ts @@ -0,0 +1,16 @@ +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/pancake-profile-sdk/src/utils/getRpcUrl.ts b/packages/pancake-profile-sdk/src/utils/getRpcUrl.ts new file mode 100644 index 0000000..f98479d --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/getRpcUrl.ts @@ -0,0 +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", +]; + +const getRandomIndex = () => { + 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/pancake-profile-sdk/src/utils/transformHelpers.test.ts b/packages/pancake-profile-sdk/src/utils/transformHelpers.test.ts new file mode 100644 index 0000000..00c77e6 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/transformHelpers.test.ts @@ -0,0 +1,84 @@ +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/pancake-profile-sdk/src/utils/transformHelpers.ts b/packages/pancake-profile-sdk/src/utils/transformHelpers.ts new file mode 100644 index 0000000..60894af --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/transformHelpers.ts @@ -0,0 +1,53 @@ +import { Campaign, TranslatableText, Profile } from "../types"; + +export type 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 => { + switch (campaign.type) { + case "ifo": + return { + id: 999, + fallback: `IFO Shopper: ${campaign.title}`, + data: { + name: campaign.title as string, + }, + }; + default: + return campaign.title; + } +}; + +export const getAchievementDescription = (campaign: Campaign): TranslatableText => { + switch (campaign.type) { + case "ifo": + return { + id: 999, + fallback: `Committed more than $5 worth of LP in the ${campaign.title} IFO`, + data: { + name: campaign.title as string, + }, + }; + default: + return campaign.description; + } +}; diff --git a/packages/pancake-profile-sdk/src/utils/web3.test.ts b/packages/pancake-profile-sdk/src/utils/web3.test.ts new file mode 100644 index 0000000..8374ca3 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/web3.test.ts @@ -0,0 +1,8 @@ +import Web3 from "web3"; +import web3NoAccount from "./web3"; + +describe("web3", () => { + it("returns an instance of Web3", () => { + expect(web3NoAccount).toBeInstanceOf(Web3); + }); +}); diff --git a/packages/pancake-profile-sdk/src/utils/web3.ts b/packages/pancake-profile-sdk/src/utils/web3.ts new file mode 100644 index 0000000..3282ce2 --- /dev/null +++ b/packages/pancake-profile-sdk/src/utils/web3.ts @@ -0,0 +1,10 @@ +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/pancake-profile-sdk/tsconfig.json b/packages/pancake-profile-sdk/tsconfig.json new file mode 100644 index 0000000..878d0b6 --- /dev/null +++ b/packages/pancake-profile-sdk/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "lib": ["ES2020", "DOM"], + "target": "ES5", + "esModuleInterop": true, + "resolveJsonModule": true + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.test.ts", "**/__mocks__/*", "src/mocks/**", "jest.setup.js"] +} diff --git a/packages/pancake-swap-sdk/.babelrc b/packages/pancake-swap-sdk/.babelrc new file mode 100644 index 0000000..5ec58a4 --- /dev/null +++ b/packages/pancake-swap-sdk/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": [] // "transform-jsbi-to-bigint" +} diff --git a/packages/pancake-swap-sdk/.github/workflows/CI.yml b/packages/pancake-swap-sdk/.github/workflows/CI.yml new file mode 100644 index 0000000..b0c3092 --- /dev/null +++ b/packages/pancake-swap-sdk/.github/workflows/CI.yml @@ -0,0 +1,43 @@ +name: CI +env: + CI: true + +on: + pull_request: + branches: + - v2 + push: + branches: + - v2 + +jobs: + test: + strategy: + matrix: + node: ['10.x', '12.x'] + os: [ubuntu-latest, macOS-latest] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node }} + + - run: npm install -g yarn + + - id: yarn-cache + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v1 + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ matrix.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ matrix.os }}-yarn- + + - run: yarn + + - run: yarn lint + - run: yarn build + - run: yarn test diff --git a/packages/pancake-swap-sdk/.gitignore b/packages/pancake-swap-sdk/.gitignore new file mode 100644 index 0000000..de4d1f0 --- /dev/null +++ b/packages/pancake-swap-sdk/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/pancake-swap-sdk/.yarnrc b/packages/pancake-swap-sdk/.yarnrc new file mode 100644 index 0000000..5455c6c --- /dev/null +++ b/packages/pancake-swap-sdk/.yarnrc @@ -0,0 +1 @@ +ignore-scripts true diff --git a/packages/pancake-swap-sdk/LICENSE b/packages/pancake-swap-sdk/LICENSE new file mode 100644 index 0000000..93e6b30 --- /dev/null +++ b/packages/pancake-swap-sdk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Noah Zinsmeister + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/pancake-swap-sdk/README.md b/packages/pancake-swap-sdk/README.md new file mode 100644 index 0000000..e9a69c1 --- /dev/null +++ b/packages/pancake-swap-sdk/README.md @@ -0,0 +1,53 @@ +# Pancakeswap SDK + +Forked from the [Uniswap SDK](https://github.com/Uniswap/uniswap-v2-sdk/commit/a88048e9c4198a5bdaea00883ca00c8c8e582605). + +You can refer to the Uniswap SDK documentation [uniswap.org](https://uniswap.org/docs/v2/SDK/getting-started/). + +## Running tests + +To run the tests, follow these steps. You must have at least node v10 and [yarn](https://yarnpkg.com/) installed. + +First clone the repository: + +```sh +git clone https://github.com/pancakeswap/pancake-swap-sdk.git +``` + +Move into the pancakeswap-sdk working directory + +```sh +cd pancakeswap-sdk/ +``` + +Install dependencies + +```sh +yarn install +``` + +Run tests + +```sh +yarn test +``` + +You should see output like the following: + +```sh +yarn run v1.22.4 +$ tsdx test + PASS test/constants.test.ts + PASS test/pair.test.ts + PASS test/fraction.test.ts + PASS test/miscellaneous.test.ts + PASS test/entities.test.ts + PASS test/trade.test.ts + +Test Suites: 1 skipped, 6 passed, 6 of 7 total +Tests: 3 skipped, 82 passed, 85 total +Snapshots: 0 total +Time: 5.091s +Ran all test suites. +✨ Done in 6.61s. +``` diff --git a/packages/pancake-swap-sdk/package.json b/packages/pancake-swap-sdk/package.json new file mode 100644 index 0000000..7d6ba51 --- /dev/null +++ b/packages/pancake-swap-sdk/package.json @@ -0,0 +1,58 @@ +{ + "name": "@pancakeswap/sdk", + "license": "MIT", + "version": "2.4.3", + "description": "🛠 An SDK for building applications on top of Pancakeswap.", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "files": [ + "dist" + ], + "repository": "https://github.com/pancakeswap/pancake-swap-sdk.git", + "keywords": [ + "pancakeswap", + "bsc" + ], + "module": "dist/sdk.esm.js", + "scripts": { + "lint": "tsdx lint src test", + "build": "tsdx build", + "start": "tsdx watch", + "test": "tsdx test", + "prepublishOnly": "tsdx build" + }, + "dependencies": { + "big.js": "^5.2.2", + "decimal.js-light": "^2.5.0", + "jsbi": "^3.1.4", + "tiny-invariant": "^1.1.0", + "tiny-warning": "^1.0.3", + "toformat": "^2.0.0" + }, + "peerDependencies": { + "@ethersproject/address": "^5.0.0", + "@ethersproject/contracts": "^5.0.0", + "@ethersproject/networks": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@ethersproject/solidity": "^5.0.0" + }, + "devDependencies": { + "@ethersproject/address": "^5.0.2", + "@ethersproject/contracts": "^5.0.2", + "@ethersproject/networks": "^5.0.2", + "@ethersproject/providers": "^5.0.5", + "@ethersproject/solidity": "^5.0.2", + "@types/big.js": "^4.0.5", + "@types/jest": "^24.0.25", + "babel-plugin-transform-jsbi-to-bigint": "^1.3.1", + "tsdx": "^0.12.3" + }, + "engines": { + "node": ">=10" + }, + "prettier": { + "printWidth": 120, + "semi": false, + "singleQuote": true + } +} diff --git a/packages/pancake-swap-sdk/src/abis/ERC20.json b/packages/pancake-swap-sdk/src/abis/ERC20.json new file mode 100644 index 0000000..e8a2da6 --- /dev/null +++ b/packages/pancake-swap-sdk/src/abis/ERC20.json @@ -0,0 +1,20 @@ +[ + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [{ "name": "", "type": "uint8" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/pancake-swap-sdk/src/abis/IPancakePair.json b/packages/pancake-swap-sdk/src/abis/IPancakePair.json new file mode 100644 index 0000000..a5aae8e --- /dev/null +++ b/packages/pancake-swap-sdk/src/abis/IPancakePair.json @@ -0,0 +1,707 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0In", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1In", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0Out", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1Out", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "Swap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint112", + "name": "reserve0", + "type": "uint112" + }, + { + "indexed": false, + "internalType": "uint112", + "name": "reserve1", + "type": "uint112" + } + ], + "name": "Sync", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MINIMUM_LIQUIDITY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getReserves", + "outputs": [ + { + "internalType": "uint112", + "name": "reserve0", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "reserve1", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "blockTimestampLast", + "type": "uint32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "kLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "price0CumulativeLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "price1CumulativeLast", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "skim", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "amount0Out", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Out", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "swap", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "sync", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "token0", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "token1", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/packages/pancake-swap-sdk/src/constants.ts b/packages/pancake-swap-sdk/src/constants.ts new file mode 100644 index 0000000..f1bff8c --- /dev/null +++ b/packages/pancake-swap-sdk/src/constants.ts @@ -0,0 +1,57 @@ +import JSBI from 'jsbi' + +// exports for external consumption +export type BigintIsh = JSBI | number | string + +export enum ChainId { + MAINNET = 56, + TESTNET = 97 +} + +export enum TradeType { + EXACT_INPUT, + EXACT_OUTPUT +} + +export enum Rounding { + ROUND_DOWN, + ROUND_HALF_UP, + ROUND_UP +} + +export const FACTORY_ADDRESS = '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73' + +export const FACTORY_ADDRESS_MAP = { + [ChainId.MAINNET]: FACTORY_ADDRESS, + [ChainId.TESTNET]: '0x6725f303b657a9451d8ba641348b6761a6cc7a17' +} + +export const INIT_CODE_HASH = '0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5' + +export const INIT_CODE_HASH_MAP = { + [ChainId.MAINNET]: INIT_CODE_HASH, + [ChainId.TESTNET]: '0xd0d4c4cd0848c93cb4fd1f498d7013ee6bfb25783ea21593d5834f5d250ece66' +} + +export const MINIMUM_LIQUIDITY = JSBI.BigInt(1000) + +// exports for internal consumption +export const ZERO = JSBI.BigInt(0) +export const ONE = JSBI.BigInt(1) +export const TWO = JSBI.BigInt(2) +export const THREE = JSBI.BigInt(3) +export const FIVE = JSBI.BigInt(5) +export const TEN = JSBI.BigInt(10) +export const _100 = JSBI.BigInt(100) +export const FEES_NUMERATOR = JSBI.BigInt(9975) +export const FEES_DENOMINATOR = JSBI.BigInt(10000) + +export enum SolidityType { + uint8 = 'uint8', + uint256 = 'uint256' +} + +export const SOLIDITY_TYPE_MAXIMA = { + [SolidityType.uint8]: JSBI.BigInt('0xff'), + [SolidityType.uint256]: JSBI.BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') +} diff --git a/packages/pancake-swap-sdk/src/declarations.d.ts b/packages/pancake-swap-sdk/src/declarations.d.ts new file mode 100644 index 0000000..a5a6803 --- /dev/null +++ b/packages/pancake-swap-sdk/src/declarations.d.ts @@ -0,0 +1 @@ +declare module 'toformat' diff --git a/packages/pancake-swap-sdk/src/entities/currency.ts b/packages/pancake-swap-sdk/src/entities/currency.ts new file mode 100644 index 0000000..989bec4 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/currency.ts @@ -0,0 +1,37 @@ +import JSBI from 'jsbi' + +import { SolidityType } from '../constants' +import { validateSolidityTypeInstance } from '../utils' + +/** + * A currency is any fungible financial instrument on Ethereum, including Ether and all ERC20 tokens. + * + * The only instance of the base class `Currency` is Ether. + */ +export class Currency { + public readonly decimals: number + public readonly symbol?: string + public readonly name?: string + + /** + * The only instance of the base class `Currency`. + */ + public static readonly ETHER: Currency = new Currency(18, 'BNB', 'BNB') + + /** + * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.ETHER`. + * @param decimals decimals of the currency + * @param symbol symbol of the currency + * @param name of the currency + */ + protected constructor(decimals: number, symbol?: string, name?: string) { + validateSolidityTypeInstance(JSBI.BigInt(decimals), SolidityType.uint8) + + this.decimals = decimals + this.symbol = symbol + this.name = name + } +} + +const ETHER = Currency.ETHER +export { ETHER } diff --git a/packages/pancake-swap-sdk/src/entities/fractions/currencyAmount.ts b/packages/pancake-swap-sdk/src/entities/fractions/currencyAmount.ts new file mode 100644 index 0000000..a911c03 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/fractions/currencyAmount.ts @@ -0,0 +1,69 @@ +import { currencyEquals } from '../token' +import { Currency, ETHER } from '../currency' +import invariant from 'tiny-invariant' +import JSBI from 'jsbi' +import _Big from 'big.js' +import toFormat from 'toformat' + +import { BigintIsh, Rounding, TEN, SolidityType } from '../../constants' +import { parseBigintIsh, validateSolidityTypeInstance } from '../../utils' +import { Fraction } from './fraction' + +const Big = toFormat(_Big) + +export class CurrencyAmount extends Fraction { + public readonly currency: Currency + + /** + * Helper that calls the constructor with the ETHER currency + * @param amount ether amount in wei + */ + public static ether(amount: BigintIsh): CurrencyAmount { + return new CurrencyAmount(ETHER, amount) + } + + // amount _must_ be raw, i.e. in the native representation + protected constructor(currency: Currency, amount: BigintIsh) { + const parsedAmount = parseBigintIsh(amount) + validateSolidityTypeInstance(parsedAmount, SolidityType.uint256) + + super(parsedAmount, JSBI.exponentiate(TEN, JSBI.BigInt(currency.decimals))) + this.currency = currency + } + + public get raw(): JSBI { + return this.numerator + } + + public add(other: CurrencyAmount): CurrencyAmount { + invariant(currencyEquals(this.currency, other.currency), 'TOKEN') + return new CurrencyAmount(this.currency, JSBI.add(this.raw, other.raw)) + } + + public subtract(other: CurrencyAmount): CurrencyAmount { + invariant(currencyEquals(this.currency, other.currency), 'TOKEN') + return new CurrencyAmount(this.currency, JSBI.subtract(this.raw, other.raw)) + } + + public toSignificant( + significantDigits: number = 6, + format?: object, + rounding: Rounding = Rounding.ROUND_DOWN + ): string { + return super.toSignificant(significantDigits, format, rounding) + } + + public toFixed( + decimalPlaces: number = this.currency.decimals, + format?: object, + rounding: Rounding = Rounding.ROUND_DOWN + ): string { + invariant(decimalPlaces <= this.currency.decimals, 'DECIMALS') + return super.toFixed(decimalPlaces, format, rounding) + } + + public toExact(format: object = { groupSeparator: '' }): string { + Big.DP = this.currency.decimals + return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format) + } +} diff --git a/packages/pancake-swap-sdk/src/entities/fractions/fraction.ts b/packages/pancake-swap-sdk/src/entities/fractions/fraction.ts new file mode 100644 index 0000000..ab2baf6 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/fractions/fraction.ts @@ -0,0 +1,151 @@ +import invariant from 'tiny-invariant' +import JSBI from 'jsbi' +import _Decimal from 'decimal.js-light' +import _Big, { RoundingMode } from 'big.js' +import toFormat from 'toformat' + +import { BigintIsh, Rounding } from '../../constants' +import { ONE } from '../../constants' +import { parseBigintIsh } from '../../utils' + +const Decimal = toFormat(_Decimal) +const Big = toFormat(_Big) + +const toSignificantRounding = { + [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN, + [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP, + [Rounding.ROUND_UP]: Decimal.ROUND_UP +} + +const toFixedRounding = { + [Rounding.ROUND_DOWN]: RoundingMode.RoundDown, + [Rounding.ROUND_HALF_UP]: RoundingMode.RoundHalfUp, + [Rounding.ROUND_UP]: RoundingMode.RoundUp +} + +export class Fraction { + public readonly numerator: JSBI + public readonly denominator: JSBI + + public constructor(numerator: BigintIsh, denominator: BigintIsh = ONE) { + this.numerator = parseBigintIsh(numerator) + this.denominator = parseBigintIsh(denominator) + } + + // performs floor division + public get quotient(): JSBI { + return JSBI.divide(this.numerator, this.denominator) + } + + // remainder after floor division + public get remainder(): Fraction { + return new Fraction(JSBI.remainder(this.numerator, this.denominator), this.denominator) + } + + public invert(): Fraction { + return new Fraction(this.denominator, this.numerator) + } + + public add(other: Fraction | BigintIsh): Fraction { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + if (JSBI.equal(this.denominator, otherParsed.denominator)) { + return new Fraction(JSBI.add(this.numerator, otherParsed.numerator), this.denominator) + } + return new Fraction( + JSBI.add( + JSBI.multiply(this.numerator, otherParsed.denominator), + JSBI.multiply(otherParsed.numerator, this.denominator) + ), + JSBI.multiply(this.denominator, otherParsed.denominator) + ) + } + + public subtract(other: Fraction | BigintIsh): Fraction { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + if (JSBI.equal(this.denominator, otherParsed.denominator)) { + return new Fraction(JSBI.subtract(this.numerator, otherParsed.numerator), this.denominator) + } + return new Fraction( + JSBI.subtract( + JSBI.multiply(this.numerator, otherParsed.denominator), + JSBI.multiply(otherParsed.numerator, this.denominator) + ), + JSBI.multiply(this.denominator, otherParsed.denominator) + ) + } + + public lessThan(other: Fraction | BigintIsh): boolean { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + return JSBI.lessThan( + JSBI.multiply(this.numerator, otherParsed.denominator), + JSBI.multiply(otherParsed.numerator, this.denominator) + ) + } + + public equalTo(other: Fraction | BigintIsh): boolean { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + return JSBI.equal( + JSBI.multiply(this.numerator, otherParsed.denominator), + JSBI.multiply(otherParsed.numerator, this.denominator) + ) + } + + public greaterThan(other: Fraction | BigintIsh): boolean { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + return JSBI.greaterThan( + JSBI.multiply(this.numerator, otherParsed.denominator), + JSBI.multiply(otherParsed.numerator, this.denominator) + ) + } + + public multiply(other: Fraction | BigintIsh): Fraction { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + return new Fraction( + JSBI.multiply(this.numerator, otherParsed.numerator), + JSBI.multiply(this.denominator, otherParsed.denominator) + ) + } + + public divide(other: Fraction | BigintIsh): Fraction { + const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) + return new Fraction( + JSBI.multiply(this.numerator, otherParsed.denominator), + JSBI.multiply(this.denominator, otherParsed.numerator) + ) + } + + public toSignificant( + significantDigits: number, + format: object = { groupSeparator: '' }, + rounding: Rounding = Rounding.ROUND_HALF_UP + ): string { + invariant(Number.isInteger(significantDigits), `${significantDigits} is not an integer.`) + invariant(significantDigits > 0, `${significantDigits} is not positive.`) + + Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] }) + const quotient = new Decimal(this.numerator.toString()) + .div(this.denominator.toString()) + .toSignificantDigits(significantDigits) + return quotient.toFormat(quotient.decimalPlaces(), format) + } + + public toFixed( + decimalPlaces: number, + format: object = { groupSeparator: '' }, + rounding: Rounding = Rounding.ROUND_HALF_UP + ): string { + invariant(Number.isInteger(decimalPlaces), `${decimalPlaces} is not an integer.`) + invariant(decimalPlaces >= 0, `${decimalPlaces} is negative.`) + + Big.DP = decimalPlaces + Big.RM = toFixedRounding[rounding] + return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format) + } + + /** + * Helper method for converting any super class back to a fraction + */ + public get asFraction(): Fraction { + return new Fraction(this.numerator, this.denominator) + } +} diff --git a/packages/pancake-swap-sdk/src/entities/fractions/index.ts b/packages/pancake-swap-sdk/src/entities/fractions/index.ts new file mode 100644 index 0000000..6a7689d --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/fractions/index.ts @@ -0,0 +1,5 @@ +export * from './fraction' +export * from './percent' +export * from './tokenAmount' +export * from './currencyAmount' +export * from './price' diff --git a/packages/pancake-swap-sdk/src/entities/fractions/percent.ts b/packages/pancake-swap-sdk/src/entities/fractions/percent.ts new file mode 100644 index 0000000..092e7aa --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/fractions/percent.ts @@ -0,0 +1,14 @@ +import { Rounding, _100 } from '../../constants' +import { Fraction } from './fraction' + +const _100_PERCENT = new Fraction(_100) + +export class Percent extends Fraction { + public toSignificant(significantDigits: number = 5, format?: object, rounding?: Rounding): string { + return this.multiply(_100_PERCENT).toSignificant(significantDigits, format, rounding) + } + + public toFixed(decimalPlaces: number = 2, format?: object, rounding?: Rounding): string { + return this.multiply(_100_PERCENT).toFixed(decimalPlaces, format, rounding) + } +} diff --git a/packages/pancake-swap-sdk/src/entities/fractions/price.ts b/packages/pancake-swap-sdk/src/entities/fractions/price.ts new file mode 100644 index 0000000..87a5db5 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/fractions/price.ts @@ -0,0 +1,76 @@ +import { Token } from '../token' +import { TokenAmount } from './tokenAmount' +import { currencyEquals } from '../token' +import invariant from 'tiny-invariant' +import JSBI from 'jsbi' + +import { BigintIsh, Rounding, TEN } from '../../constants' +import { Currency } from '../currency' +import { Route } from '../route' +import { Fraction } from './fraction' +import { CurrencyAmount } from './currencyAmount' + +export class Price extends Fraction { + public readonly baseCurrency: Currency // input i.e. denominator + public readonly quoteCurrency: Currency // output i.e. numerator + public readonly scalar: Fraction // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token + + public static fromRoute(route: Route): Price { + const prices: Price[] = [] + for (const [i, pair] of route.pairs.entries()) { + prices.push( + route.path[i].equals(pair.token0) + ? new Price(pair.reserve0.currency, pair.reserve1.currency, pair.reserve0.raw, pair.reserve1.raw) + : new Price(pair.reserve1.currency, pair.reserve0.currency, pair.reserve1.raw, pair.reserve0.raw) + ) + } + return prices.slice(1).reduce((accumulator, currentValue) => accumulator.multiply(currentValue), prices[0]) + } + + // denominator and numerator _must_ be raw, i.e. in the native representation + public constructor(baseCurrency: Currency, quoteCurrency: Currency, denominator: BigintIsh, numerator: BigintIsh) { + super(numerator, denominator) + + this.baseCurrency = baseCurrency + this.quoteCurrency = quoteCurrency + this.scalar = new Fraction( + JSBI.exponentiate(TEN, JSBI.BigInt(baseCurrency.decimals)), + JSBI.exponentiate(TEN, JSBI.BigInt(quoteCurrency.decimals)) + ) + } + + public get raw(): Fraction { + return new Fraction(this.numerator, this.denominator) + } + + public get adjusted(): Fraction { + return super.multiply(this.scalar) + } + + public invert(): Price { + return new Price(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator) + } + + public multiply(other: Price): Price { + invariant(currencyEquals(this.quoteCurrency, other.baseCurrency), 'TOKEN') + const fraction = super.multiply(other) + return new Price(this.baseCurrency, other.quoteCurrency, fraction.denominator, fraction.numerator) + } + + // performs floor division on overflow + public quote(currencyAmount: CurrencyAmount): CurrencyAmount { + invariant(currencyEquals(currencyAmount.currency, this.baseCurrency), 'TOKEN') + if (this.quoteCurrency instanceof Token) { + return new TokenAmount(this.quoteCurrency, super.multiply(currencyAmount.raw).quotient) + } + return CurrencyAmount.ether(super.multiply(currencyAmount.raw).quotient) + } + + public toSignificant(significantDigits: number = 6, format?: object, rounding?: Rounding): string { + return this.adjusted.toSignificant(significantDigits, format, rounding) + } + + public toFixed(decimalPlaces: number = 4, format?: object, rounding?: Rounding): string { + return this.adjusted.toFixed(decimalPlaces, format, rounding) + } +} diff --git a/packages/pancake-swap-sdk/src/entities/fractions/tokenAmount.ts b/packages/pancake-swap-sdk/src/entities/fractions/tokenAmount.ts new file mode 100644 index 0000000..96eba7f --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/fractions/tokenAmount.ts @@ -0,0 +1,26 @@ +import { CurrencyAmount } from './currencyAmount' +import { Token } from '../token' +import invariant from 'tiny-invariant' +import JSBI from 'jsbi' + +import { BigintIsh } from '../../constants' + +export class TokenAmount extends CurrencyAmount { + public readonly token: Token + + // amount _must_ be raw, i.e. in the native representation + public constructor(token: Token, amount: BigintIsh) { + super(token, amount) + this.token = token + } + + public add(other: TokenAmount): TokenAmount { + invariant(this.token.equals(other.token), 'TOKEN') + return new TokenAmount(this.token, JSBI.add(this.raw, other.raw)) + } + + public subtract(other: TokenAmount): TokenAmount { + invariant(this.token.equals(other.token), 'TOKEN') + return new TokenAmount(this.token, JSBI.subtract(this.raw, other.raw)) + } +} diff --git a/packages/pancake-swap-sdk/src/entities/index.ts b/packages/pancake-swap-sdk/src/entities/index.ts new file mode 100644 index 0000000..c217ba5 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/index.ts @@ -0,0 +1,7 @@ +export * from './token' +export * from './pair' +export * from './route' +export * from './trade' +export * from './currency' + +export * from './fractions' diff --git a/packages/pancake-swap-sdk/src/entities/pair.ts b/packages/pancake-swap-sdk/src/entities/pair.ts new file mode 100644 index 0000000..775e8ad --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/pair.ts @@ -0,0 +1,229 @@ +import { Price } from './fractions/price' +import { TokenAmount } from './fractions/tokenAmount' +import invariant from 'tiny-invariant' +import JSBI from 'jsbi' +import { pack, keccak256 } from '@ethersproject/solidity' +import { getCreate2Address } from '@ethersproject/address' + +import { + BigintIsh, + FACTORY_ADDRESS_MAP, + INIT_CODE_HASH_MAP, + MINIMUM_LIQUIDITY, + ZERO, + ONE, + FIVE, + FEES_NUMERATOR, + FEES_DENOMINATOR, + ChainId +} from '../constants' +import { sqrt, parseBigintIsh } from '../utils' +import { InsufficientReservesError, InsufficientInputAmountError } from '../errors' +import { Token } from './token' + +let PAIR_ADDRESS_CACHE: { [key: string]: string } = {} + +const composeKey = (token0: Token, token1: Token) => `${token0.chainId}-${token0.address}-${token1.address}` + +export class Pair { + public readonly liquidityToken: Token + private readonly tokenAmounts: [TokenAmount, TokenAmount] + + public static getAddress(tokenA: Token, tokenB: Token): string { + const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] // does safety checks + + const key = composeKey(token0, token1) + + if (PAIR_ADDRESS_CACHE?.[key] === undefined) { + PAIR_ADDRESS_CACHE = { + ...PAIR_ADDRESS_CACHE, + [key]: getCreate2Address( + FACTORY_ADDRESS_MAP[token0.chainId], + keccak256(['bytes'], [pack(['address', 'address'], [token0.address, token1.address])]), + INIT_CODE_HASH_MAP[token0.chainId] + ) + } + } + + return PAIR_ADDRESS_CACHE[key] + } + + public constructor(tokenAmountA: TokenAmount, tokenAmountB: TokenAmount) { + const tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks + ? [tokenAmountA, tokenAmountB] + : [tokenAmountB, tokenAmountA] + this.liquidityToken = new Token( + tokenAmounts[0].token.chainId, + Pair.getAddress(tokenAmounts[0].token, tokenAmounts[1].token), + 18, + 'Cake-LP', + 'Pancake LPs' + ) + this.tokenAmounts = tokenAmounts as [TokenAmount, TokenAmount] + } + + /** + * Returns true if the token is either token0 or token1 + * @param token to check + */ + public involvesToken(token: Token): boolean { + return token.equals(this.token0) || token.equals(this.token1) + } + + /** + * Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0 + */ + public get token0Price(): Price { + return new Price(this.token0, this.token1, this.tokenAmounts[0].raw, this.tokenAmounts[1].raw) + } + + /** + * Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1 + */ + public get token1Price(): Price { + return new Price(this.token1, this.token0, this.tokenAmounts[1].raw, this.tokenAmounts[0].raw) + } + + /** + * Return the price of the given token in terms of the other token in the pair. + * @param token token to return price of + */ + public priceOf(token: Token): Price { + invariant(this.involvesToken(token), 'TOKEN') + return token.equals(this.token0) ? this.token0Price : this.token1Price + } + + /** + * Returns the chain ID of the tokens in the pair. + */ + public get chainId(): ChainId { + return this.token0.chainId + } + + public get token0(): Token { + return this.tokenAmounts[0].token + } + + public get token1(): Token { + return this.tokenAmounts[1].token + } + + public get reserve0(): TokenAmount { + return this.tokenAmounts[0] + } + + public get reserve1(): TokenAmount { + return this.tokenAmounts[1] + } + + public reserveOf(token: Token): TokenAmount { + invariant(this.involvesToken(token), 'TOKEN') + return token.equals(this.token0) ? this.reserve0 : this.reserve1 + } + + public getOutputAmount(inputAmount: TokenAmount): [TokenAmount, Pair] { + invariant(this.involvesToken(inputAmount.token), 'TOKEN') + if (JSBI.equal(this.reserve0.raw, ZERO) || JSBI.equal(this.reserve1.raw, ZERO)) { + throw new InsufficientReservesError() + } + const inputReserve = this.reserveOf(inputAmount.token) + const outputReserve = this.reserveOf(inputAmount.token.equals(this.token0) ? this.token1 : this.token0) + const inputAmountWithFee = JSBI.multiply(inputAmount.raw, FEES_NUMERATOR) + const numerator = JSBI.multiply(inputAmountWithFee, outputReserve.raw) + const denominator = JSBI.add(JSBI.multiply(inputReserve.raw, FEES_DENOMINATOR), inputAmountWithFee) + const outputAmount = new TokenAmount( + inputAmount.token.equals(this.token0) ? this.token1 : this.token0, + JSBI.divide(numerator, denominator) + ) + if (JSBI.equal(outputAmount.raw, ZERO)) { + throw new InsufficientInputAmountError() + } + return [outputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))] + } + + public getInputAmount(outputAmount: TokenAmount): [TokenAmount, Pair] { + invariant(this.involvesToken(outputAmount.token), 'TOKEN') + if ( + JSBI.equal(this.reserve0.raw, ZERO) || + JSBI.equal(this.reserve1.raw, ZERO) || + JSBI.greaterThanOrEqual(outputAmount.raw, this.reserveOf(outputAmount.token).raw) + ) { + throw new InsufficientReservesError() + } + + const outputReserve = this.reserveOf(outputAmount.token) + const inputReserve = this.reserveOf(outputAmount.token.equals(this.token0) ? this.token1 : this.token0) + const numerator = JSBI.multiply(JSBI.multiply(inputReserve.raw, outputAmount.raw), FEES_DENOMINATOR) + const denominator = JSBI.multiply(JSBI.subtract(outputReserve.raw, outputAmount.raw), FEES_NUMERATOR) + const inputAmount = new TokenAmount( + outputAmount.token.equals(this.token0) ? this.token1 : this.token0, + JSBI.add(JSBI.divide(numerator, denominator), ONE) + ) + return [inputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))] + } + + public getLiquidityMinted( + totalSupply: TokenAmount, + tokenAmountA: TokenAmount, + tokenAmountB: TokenAmount + ): TokenAmount { + invariant(totalSupply.token.equals(this.liquidityToken), 'LIQUIDITY') + const tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks + ? [tokenAmountA, tokenAmountB] + : [tokenAmountB, tokenAmountA] + invariant(tokenAmounts[0].token.equals(this.token0) && tokenAmounts[1].token.equals(this.token1), 'TOKEN') + + let liquidity: JSBI + if (JSBI.equal(totalSupply.raw, ZERO)) { + liquidity = JSBI.subtract(sqrt(JSBI.multiply(tokenAmounts[0].raw, tokenAmounts[1].raw)), MINIMUM_LIQUIDITY) + } else { + const amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].raw, totalSupply.raw), this.reserve0.raw) + const amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].raw, totalSupply.raw), this.reserve1.raw) + liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1 + } + if (!JSBI.greaterThan(liquidity, ZERO)) { + throw new InsufficientInputAmountError() + } + return new TokenAmount(this.liquidityToken, liquidity) + } + + public getLiquidityValue( + token: Token, + totalSupply: TokenAmount, + liquidity: TokenAmount, + feeOn: boolean = false, + kLast?: BigintIsh + ): TokenAmount { + invariant(this.involvesToken(token), 'TOKEN') + invariant(totalSupply.token.equals(this.liquidityToken), 'TOTAL_SUPPLY') + invariant(liquidity.token.equals(this.liquidityToken), 'LIQUIDITY') + invariant(JSBI.lessThanOrEqual(liquidity.raw, totalSupply.raw), 'LIQUIDITY') + + let totalSupplyAdjusted: TokenAmount + if (!feeOn) { + totalSupplyAdjusted = totalSupply + } else { + invariant(!!kLast, 'K_LAST') + const kLastParsed = parseBigintIsh(kLast) + if (!JSBI.equal(kLastParsed, ZERO)) { + const rootK = sqrt(JSBI.multiply(this.reserve0.raw, this.reserve1.raw)) + const rootKLast = sqrt(kLastParsed) + if (JSBI.greaterThan(rootK, rootKLast)) { + const numerator = JSBI.multiply(totalSupply.raw, JSBI.subtract(rootK, rootKLast)) + const denominator = JSBI.add(JSBI.multiply(rootK, FIVE), rootKLast) + const feeLiquidity = JSBI.divide(numerator, denominator) + totalSupplyAdjusted = totalSupply.add(new TokenAmount(this.liquidityToken, feeLiquidity)) + } else { + totalSupplyAdjusted = totalSupply + } + } else { + totalSupplyAdjusted = totalSupply + } + } + + return new TokenAmount( + token, + JSBI.divide(JSBI.multiply(liquidity.raw, this.reserveOf(token).raw), totalSupplyAdjusted.raw) + ) + } +} diff --git a/packages/pancake-swap-sdk/src/entities/route.ts b/packages/pancake-swap-sdk/src/entities/route.ts new file mode 100644 index 0000000..6aa8e6a --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/route.ts @@ -0,0 +1,52 @@ +import { ChainId } from '../constants' +import invariant from 'tiny-invariant' + +import { Currency, ETHER } from './currency' +import { Token, WETH } from './token' +import { Pair } from './pair' +import { Price } from './fractions/price' + +export class Route { + public readonly pairs: Pair[] + public readonly path: Token[] + public readonly input: Currency + public readonly output: Currency + public readonly midPrice: Price + + public constructor(pairs: Pair[], input: Currency, output?: Currency) { + invariant(pairs.length > 0, 'PAIRS') + invariant( + pairs.every(pair => pair.chainId === pairs[0].chainId), + 'CHAIN_IDS' + ) + invariant( + (input instanceof Token && pairs[0].involvesToken(input)) || + (input === ETHER && pairs[0].involvesToken(WETH[pairs[0].chainId])), + 'INPUT' + ) + invariant( + typeof output === 'undefined' || + (output instanceof Token && pairs[pairs.length - 1].involvesToken(output)) || + (output === ETHER && pairs[pairs.length - 1].involvesToken(WETH[pairs[0].chainId])), + 'OUTPUT' + ) + + const path: Token[] = [input instanceof Token ? input : WETH[pairs[0].chainId]] + for (const [i, pair] of pairs.entries()) { + const currentInput = path[i] + invariant(currentInput.equals(pair.token0) || currentInput.equals(pair.token1), 'PATH') + const output = currentInput.equals(pair.token0) ? pair.token1 : pair.token0 + path.push(output) + } + + this.pairs = pairs + this.path = path + this.midPrice = Price.fromRoute(this) + this.input = input + this.output = output ?? path[path.length - 1] + } + + public get chainId(): ChainId { + return this.pairs[0].chainId + } +} diff --git a/packages/pancake-swap-sdk/src/entities/token.ts b/packages/pancake-swap-sdk/src/entities/token.ts new file mode 100644 index 0000000..c2ea9a3 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/token.ts @@ -0,0 +1,85 @@ +import invariant from 'tiny-invariant' +import { ChainId } from '../constants' +import { validateAndParseAddress } from '../utils' +import { Currency } from './currency' + +/** + * Represents an ERC20 token with a unique address and some metadata. + */ +export class Token extends Currency { + public readonly chainId: ChainId + public readonly address: string + public readonly projectLink?: string + + public constructor( + chainId: ChainId, + address: string, + decimals: number, + symbol?: string, + name?: string, + projectLink?: string + ) { + super(decimals, symbol, name) + this.chainId = chainId + this.address = validateAndParseAddress(address) + this.projectLink = projectLink + } + + /** + * Returns true if the two tokens are equivalent, i.e. have the same chainId and address. + * @param other other token to compare + */ + public equals(other: Token): boolean { + // short circuit on reference equality + if (this === other) { + return true + } + return this.chainId === other.chainId && this.address === other.address + } + + /** + * Returns true if the address of this token sorts before the address of the other token + * @param other other token to compare + * @throws if the tokens have the same address + * @throws if the tokens are on different chains + */ + public sortsBefore(other: Token): boolean { + invariant(this.chainId === other.chainId, 'CHAIN_IDS') + invariant(this.address !== other.address, 'ADDRESSES') + return this.address.toLowerCase() < other.address.toLowerCase() + } +} + +/** + * Compares two currencies for equality + */ +export function currencyEquals(currencyA: Currency, currencyB: Currency): boolean { + if (currencyA instanceof Token && currencyB instanceof Token) { + return currencyA.equals(currencyB) + } else if (currencyA instanceof Token) { + return false + } else if (currencyB instanceof Token) { + return false + } else { + return currencyA === currencyB + } +} + +export const WETH = { + [ChainId.MAINNET]: new Token( + ChainId.MAINNET, + '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c', + 18, + 'WBNB', + 'Wrapped BNB', + 'https://www.binance.org' + ), + [ChainId.TESTNET]: new Token( + ChainId.TESTNET, + '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd', + 18, + 'WBNB', + 'Wrapped BNB', + 'https://www.binance.org' + ) +} diff --git a/packages/pancake-swap-sdk/src/entities/trade.ts b/packages/pancake-swap-sdk/src/entities/trade.ts new file mode 100644 index 0000000..58c33d4 --- /dev/null +++ b/packages/pancake-swap-sdk/src/entities/trade.ts @@ -0,0 +1,411 @@ +import invariant from 'tiny-invariant' +import { InsufficientInputAmountError, InsufficientReservesError } from '..' + +import { ChainId, ONE, TradeType, ZERO } from '../constants' +import { sortedInsert } from '../utils' +import { Currency, ETHER } from './currency' +import { CurrencyAmount } from './fractions/currencyAmount' +import { Fraction } from './fractions/fraction' +import { Percent } from './fractions/percent' +import { Price } from './fractions/price' +import { TokenAmount } from './fractions/tokenAmount' +import { Pair } from './pair' +import { Route } from './route' +import { currencyEquals, Token, WETH } from './token' + +/** + * Returns the percent difference between the mid price and the execution price, i.e. price impact. + * @param midPrice mid price before the trade + * @param inputAmount the input amount of the trade + * @param outputAmount the output amount of the trade + */ +function computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent { + const exactQuote = midPrice.raw.multiply(inputAmount.raw) + // calculate slippage := (exactQuote - outputAmount) / exactQuote + const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote) + return new Percent(slippage.numerator, slippage.denominator) +} + +// minimal interface so the input output comparator may be shared across types +interface InputOutput { + readonly inputAmount: CurrencyAmount + readonly outputAmount: CurrencyAmount +} + +// comparator function that allows sorting trades by their output amounts, in decreasing order, and then input amounts +// in increasing order. i.e. the best trades have the most outputs for the least inputs and are sorted first +export function inputOutputComparator(a: InputOutput, b: InputOutput): number { + // must have same input and output token for comparison + invariant(currencyEquals(a.inputAmount.currency, b.inputAmount.currency), 'INPUT_CURRENCY') + invariant(currencyEquals(a.outputAmount.currency, b.outputAmount.currency), 'OUTPUT_CURRENCY') + if (a.outputAmount.equalTo(b.outputAmount)) { + if (a.inputAmount.equalTo(b.inputAmount)) { + return 0 + } + // trade A requires less input than trade B, so A should come first + if (a.inputAmount.lessThan(b.inputAmount)) { + return -1 + } else { + return 1 + } + } else { + // tradeA has less output than trade B, so should come second + if (a.outputAmount.lessThan(b.outputAmount)) { + return 1 + } else { + return -1 + } + } +} + +// extension of the input output comparator that also considers other dimensions of the trade in ranking them +export function tradeComparator(a: Trade, b: Trade) { + const ioComp = inputOutputComparator(a, b) + if (ioComp !== 0) { + return ioComp + } + + // consider lowest slippage next, since these are less likely to fail + if (a.priceImpact.lessThan(b.priceImpact)) { + return -1 + } else if (a.priceImpact.greaterThan(b.priceImpact)) { + return 1 + } + + // finally consider the number of hops since each hop costs gas + return a.route.path.length - b.route.path.length +} + +export interface BestTradeOptions { + // how many results to return + maxNumResults?: number + // the maximum number of hops a trade should contain + maxHops?: number +} + +/** + * Given a currency amount and a chain ID, returns the equivalent representation as the token amount. + * In other words, if the currency is ETHER, returns the WETH token amount for the given chain. Otherwise, returns + * the input currency amount. + */ +function wrappedAmount(currencyAmount: CurrencyAmount, chainId: ChainId): TokenAmount { + if (currencyAmount instanceof TokenAmount) return currencyAmount + if (currencyAmount.currency === ETHER) return new TokenAmount(WETH[chainId], currencyAmount.raw) + invariant(false, 'CURRENCY') +} + +function wrappedCurrency(currency: Currency, chainId: ChainId): Token { + if (currency instanceof Token) return currency + if (currency === ETHER) return WETH[chainId] + invariant(false, 'CURRENCY') +} + +/** + * Represents a trade executed against a list of pairs. + * Does not account for slippage, i.e. trades that front run this trade and move the price. + */ +export class Trade { + /** + * The route of the trade, i.e. which pairs the trade goes through. + */ + public readonly route: Route + /** + * The type of the trade, either exact in or exact out. + */ + public readonly tradeType: TradeType + /** + * The input amount for the trade assuming no slippage. + */ + public readonly inputAmount: CurrencyAmount + /** + * The output amount for the trade assuming no slippage. + */ + public readonly outputAmount: CurrencyAmount + /** + * The price expressed in terms of output amount/input amount. + */ + public readonly executionPrice: Price + /** + * The mid price after the trade executes assuming no slippage. + */ + public readonly nextMidPrice: Price + /** + * The percent difference between the mid price before the trade and the trade execution price. + */ + public readonly priceImpact: Percent + + /** + * Constructs an exact in trade with the given amount in and route + * @param route route of the exact in trade + * @param amountIn the amount being passed in + */ + public static exactIn(route: Route, amountIn: CurrencyAmount): Trade { + return new Trade(route, amountIn, TradeType.EXACT_INPUT) + } + + /** + * Constructs an exact out trade with the given amount out and route + * @param route route of the exact out trade + * @param amountOut the amount returned by the trade + */ + public static exactOut(route: Route, amountOut: CurrencyAmount): Trade { + return new Trade(route, amountOut, TradeType.EXACT_OUTPUT) + } + + public constructor(route: Route, amount: CurrencyAmount, tradeType: TradeType) { + const amounts: TokenAmount[] = new Array(route.path.length) + const nextPairs: Pair[] = new Array(route.pairs.length) + if (tradeType === TradeType.EXACT_INPUT) { + invariant(currencyEquals(amount.currency, route.input), 'INPUT') + amounts[0] = wrappedAmount(amount, route.chainId) + for (let i = 0; i < route.path.length - 1; i++) { + const pair = route.pairs[i] + const [outputAmount, nextPair] = pair.getOutputAmount(amounts[i]) + amounts[i + 1] = outputAmount + nextPairs[i] = nextPair + } + } else { + invariant(currencyEquals(amount.currency, route.output), 'OUTPUT') + amounts[amounts.length - 1] = wrappedAmount(amount, route.chainId) + for (let i = route.path.length - 1; i > 0; i--) { + const pair = route.pairs[i - 1] + const [inputAmount, nextPair] = pair.getInputAmount(amounts[i]) + amounts[i - 1] = inputAmount + nextPairs[i - 1] = nextPair + } + } + + this.route = route + this.tradeType = tradeType + this.inputAmount = + tradeType === TradeType.EXACT_INPUT + ? amount + : route.input === ETHER + ? CurrencyAmount.ether(amounts[0].raw) + : amounts[0] + this.outputAmount = + tradeType === TradeType.EXACT_OUTPUT + ? amount + : route.output === ETHER + ? CurrencyAmount.ether(amounts[amounts.length - 1].raw) + : amounts[amounts.length - 1] + this.executionPrice = new Price( + this.inputAmount.currency, + this.outputAmount.currency, + this.inputAmount.raw, + this.outputAmount.raw + ) + this.nextMidPrice = Price.fromRoute(new Route(nextPairs, route.input)) + this.priceImpact = computePriceImpact(route.midPrice, this.inputAmount, this.outputAmount) + } + + /** + * Get the minimum amount that must be received from this trade for the given slippage tolerance + * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade + */ + public minimumAmountOut(slippageTolerance: Percent): CurrencyAmount { + invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE') + if (this.tradeType === TradeType.EXACT_OUTPUT) { + return this.outputAmount + } else { + const slippageAdjustedAmountOut = new Fraction(ONE) + .add(slippageTolerance) + .invert() + .multiply(this.outputAmount.raw).quotient + return this.outputAmount instanceof TokenAmount + ? new TokenAmount(this.outputAmount.token, slippageAdjustedAmountOut) + : CurrencyAmount.ether(slippageAdjustedAmountOut) + } + } + + /** + * Get the maximum amount in that can be spent via this trade for the given slippage tolerance + * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade + */ + public maximumAmountIn(slippageTolerance: Percent): CurrencyAmount { + invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE') + if (this.tradeType === TradeType.EXACT_INPUT) { + return this.inputAmount + } else { + const slippageAdjustedAmountIn = new Fraction(ONE).add(slippageTolerance).multiply(this.inputAmount.raw).quotient + return this.inputAmount instanceof TokenAmount + ? new TokenAmount(this.inputAmount.token, slippageAdjustedAmountIn) + : CurrencyAmount.ether(slippageAdjustedAmountIn) + } + } + + /** + * Given a list of pairs, and a fixed amount in, returns the top `maxNumResults` trades that go from an input token + * amount to an output token, making at most `maxHops` hops. + * Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting + * the amount in among multiple routes. + * @param pairs the pairs to consider in finding the best trade + * @param currencyAmountIn exact amount of input currency to spend + * @param currencyOut the desired currency out + * @param maxNumResults maximum number of results to return + * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair + * @param currentPairs used in recursion; the current list of pairs + * @param originalAmountIn used in recursion; the original value of the currencyAmountIn parameter + * @param bestTrades used in recursion; the current list of best trades + */ + public static bestTradeExactIn( + pairs: Pair[], + currencyAmountIn: CurrencyAmount, + currencyOut: Currency, + { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {}, + // used in recursion. + currentPairs: Pair[] = [], + originalAmountIn: CurrencyAmount = currencyAmountIn, + bestTrades: Trade[] = [] + ): Trade[] { + invariant(pairs.length > 0, 'PAIRS') + invariant(maxHops > 0, 'MAX_HOPS') + invariant(originalAmountIn === currencyAmountIn || currentPairs.length > 0, 'INVALID_RECURSION') + const chainId: ChainId | undefined = + currencyAmountIn instanceof TokenAmount + ? currencyAmountIn.token.chainId + : currencyOut instanceof Token + ? currencyOut.chainId + : undefined + invariant(chainId !== undefined, 'CHAIN_ID') + + const amountIn = wrappedAmount(currencyAmountIn, chainId) + const tokenOut = wrappedCurrency(currencyOut, chainId) + for (let i = 0; i < pairs.length; i++) { + const pair = pairs[i] + // pair irrelevant + if (!pair.token0.equals(amountIn.token) && !pair.token1.equals(amountIn.token)) continue + if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue + + let amountOut: TokenAmount + try { + ;[amountOut] = pair.getOutputAmount(amountIn) + } catch (error) { + // input too low + if ((error as InsufficientInputAmountError).isInsufficientInputAmountError) { + continue + } + throw error + } + // we have arrived at the output token, so this is the final trade of one of the paths + if (amountOut.token.equals(tokenOut)) { + sortedInsert( + bestTrades, + new Trade( + new Route([...currentPairs, pair], originalAmountIn.currency, currencyOut), + originalAmountIn, + TradeType.EXACT_INPUT + ), + maxNumResults, + tradeComparator + ) + } else if (maxHops > 1 && pairs.length > 1) { + const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length)) + + // otherwise, consider all the other paths that lead from this token as long as we have not exceeded maxHops + Trade.bestTradeExactIn( + pairsExcludingThisPair, + amountOut, + currencyOut, + { + maxNumResults, + maxHops: maxHops - 1 + }, + [...currentPairs, pair], + originalAmountIn, + bestTrades + ) + } + } + + return bestTrades + } + + /** + * similar to the above method but instead targets a fixed output amount + * given a list of pairs, and a fixed amount out, returns the top `maxNumResults` trades that go from an input token + * to an output token amount, making at most `maxHops` hops + * note this does not consider aggregation, as routes are linear. it's possible a better route exists by splitting + * the amount in among multiple routes. + * @param pairs the pairs to consider in finding the best trade + * @param currencyIn the currency to spend + * @param currencyAmountOut the exact amount of currency out + * @param maxNumResults maximum number of results to return + * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair + * @param currentPairs used in recursion; the current list of pairs + * @param originalAmountOut used in recursion; the original value of the currencyAmountOut parameter + * @param bestTrades used in recursion; the current list of best trades + */ + public static bestTradeExactOut( + pairs: Pair[], + currencyIn: Currency, + currencyAmountOut: CurrencyAmount, + { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {}, + // used in recursion. + currentPairs: Pair[] = [], + originalAmountOut: CurrencyAmount = currencyAmountOut, + bestTrades: Trade[] = [] + ): Trade[] { + invariant(pairs.length > 0, 'PAIRS') + invariant(maxHops > 0, 'MAX_HOPS') + invariant(originalAmountOut === currencyAmountOut || currentPairs.length > 0, 'INVALID_RECURSION') + const chainId: ChainId | undefined = + currencyAmountOut instanceof TokenAmount + ? currencyAmountOut.token.chainId + : currencyIn instanceof Token + ? currencyIn.chainId + : undefined + invariant(chainId !== undefined, 'CHAIN_ID') + + const amountOut = wrappedAmount(currencyAmountOut, chainId) + const tokenIn = wrappedCurrency(currencyIn, chainId) + for (let i = 0; i < pairs.length; i++) { + const pair = pairs[i] + // pair irrelevant + if (!pair.token0.equals(amountOut.token) && !pair.token1.equals(amountOut.token)) continue + if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue + + let amountIn: TokenAmount + try { + ;[amountIn] = pair.getInputAmount(amountOut) + } catch (error) { + // not enough liquidity in this pair + if ((error as InsufficientReservesError).isInsufficientReservesError) { + continue + } + throw error + } + // we have arrived at the input token, so this is the first trade of one of the paths + if (amountIn.token.equals(tokenIn)) { + sortedInsert( + bestTrades, + new Trade( + new Route([pair, ...currentPairs], currencyIn, originalAmountOut.currency), + originalAmountOut, + TradeType.EXACT_OUTPUT + ), + maxNumResults, + tradeComparator + ) + } else if (maxHops > 1 && pairs.length > 1) { + const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length)) + + // otherwise, consider all the other paths that arrive at this token as long as we have not exceeded maxHops + Trade.bestTradeExactOut( + pairsExcludingThisPair, + currencyIn, + amountIn, + { + maxNumResults, + maxHops: maxHops - 1 + }, + [pair, ...currentPairs], + originalAmountOut, + bestTrades + ) + } + } + + return bestTrades + } +} diff --git a/packages/pancake-swap-sdk/src/errors.ts b/packages/pancake-swap-sdk/src/errors.ts new file mode 100644 index 0000000..7d351bc --- /dev/null +++ b/packages/pancake-swap-sdk/src/errors.ts @@ -0,0 +1,30 @@ +// see https://stackoverflow.com/a/41102306 +const CAN_SET_PROTOTYPE = 'setPrototypeOf' in Object + +/** + * Indicates that the pair has insufficient reserves for a desired output amount. I.e. the amount of output cannot be + * obtained by sending any amount of input. + */ +export class InsufficientReservesError extends Error { + public readonly isInsufficientReservesError: true = true + + public constructor() { + super() + this.name = this.constructor.name + if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype) + } +} + +/** + * Indicates that the input amount is too small to produce any amount of output. I.e. the amount of input sent is less + * than the price of a single unit of output after fees. + */ +export class InsufficientInputAmountError extends Error { + public readonly isInsufficientInputAmountError: true = true + + public constructor() { + super() + this.name = this.constructor.name + if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype) + } +} diff --git a/packages/pancake-swap-sdk/src/fetcher.ts b/packages/pancake-swap-sdk/src/fetcher.ts new file mode 100644 index 0000000..190d4e5 --- /dev/null +++ b/packages/pancake-swap-sdk/src/fetcher.ts @@ -0,0 +1,75 @@ +import { Contract } from '@ethersproject/contracts' +import { getNetwork } from '@ethersproject/networks' +import { getDefaultProvider } from '@ethersproject/providers' +import { TokenAmount } from './entities/fractions/tokenAmount' +import { Pair } from './entities/pair' +import IPancakePair from './abis/IPancakePair.json' +import invariant from 'tiny-invariant' +import ERC20 from './abis/ERC20.json' +import { ChainId } from './constants' +import { Token } from './entities/token' + +let TOKEN_DECIMALS_CACHE: { [chainId: number]: { [address: string]: number } } = { + [ChainId.MAINNET]: { + '0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A': 9 // DGD + } +} + +/** + * Contains methods for constructing instances of pairs and tokens from on-chain data. + */ +export abstract class Fetcher { + /** + * Cannot be constructed. + */ + private constructor() {} + + /** + * Fetch information for a given token on the given chain, using the given ethers provider. + * @param chainId chain of the token + * @param address address of the token on the chain + * @param provider provider used to fetch the token + * @param symbol optional symbol of the token + * @param name optional name of the token + */ + public static async fetchTokenData( + chainId: ChainId, + address: string, + provider = getDefaultProvider(getNetwork(chainId)), + symbol?: string, + name?: string + ): Promise { + const parsedDecimals = + typeof TOKEN_DECIMALS_CACHE?.[chainId]?.[address] === 'number' + ? TOKEN_DECIMALS_CACHE[chainId][address] + : await new Contract(address, ERC20, provider).decimals().then((decimals: number): number => { + TOKEN_DECIMALS_CACHE = { + ...TOKEN_DECIMALS_CACHE, + [chainId]: { + ...TOKEN_DECIMALS_CACHE?.[chainId], + [address]: decimals + } + } + return decimals + }) + return new Token(chainId, address, parsedDecimals, symbol, name) + } + + /** + * Fetches information about a pair and constructs a pair from the given two tokens. + * @param tokenA first token + * @param tokenB second token + * @param provider the provider to use to fetch the data + */ + public static async fetchPairData( + tokenA: Token, + tokenB: Token, + provider = getDefaultProvider(getNetwork(tokenA.chainId)) + ): Promise { + invariant(tokenA.chainId === tokenB.chainId, 'CHAIN_ID') + const address = Pair.getAddress(tokenA, tokenB) + const [reserves0, reserves1] = await new Contract(address, IPancakePair, provider).getReserves() + const balances = tokenA.sortsBefore(tokenB) ? [reserves0, reserves1] : [reserves1, reserves0] + return new Pair(new TokenAmount(tokenA, balances[0]), new TokenAmount(tokenB, balances[1])) + } +} diff --git a/packages/pancake-swap-sdk/src/index.ts b/packages/pancake-swap-sdk/src/index.ts new file mode 100644 index 0000000..7cb09c2 --- /dev/null +++ b/packages/pancake-swap-sdk/src/index.ts @@ -0,0 +1,19 @@ +import JSBI from 'jsbi' +export { JSBI } + +export { + BigintIsh, + ChainId, + TradeType, + Rounding, + FACTORY_ADDRESS, + FACTORY_ADDRESS_MAP, + INIT_CODE_HASH, + INIT_CODE_HASH_MAP, + MINIMUM_LIQUIDITY +} from './constants' + +export * from './errors' +export * from './entities' +export * from './router' +export * from './fetcher' diff --git a/packages/pancake-swap-sdk/src/router.ts b/packages/pancake-swap-sdk/src/router.ts new file mode 100644 index 0000000..aae472d --- /dev/null +++ b/packages/pancake-swap-sdk/src/router.ts @@ -0,0 +1,144 @@ +import { TradeType } from './constants' +import invariant from 'tiny-invariant' +import { validateAndParseAddress } from './utils' +import { CurrencyAmount, ETHER, Percent, Trade } from './entities' + +/** + * Options for producing the arguments to send call to the router. + */ +export interface TradeOptions { + /** + * How much the execution price is allowed to move unfavorably from the trade execution price. + */ + allowedSlippage: Percent + /** + * How long the swap is valid until it expires, in seconds. + * This will be used to produce a `deadline` parameter which is computed from when the swap call parameters + * are generated. + */ + ttl: number + /** + * The account that should receive the output of the swap. + */ + recipient: string + + /** + * Whether any of the tokens in the path are fee on transfer tokens, which should be handled with special methods + */ + feeOnTransfer?: boolean +} + +export interface TradeOptionsDeadline extends Omit { + /** + * When the transaction expires. + * This is an atlernate to specifying the ttl, for when you do not want to use local time. + */ + deadline: number +} + +/** + * The parameters to use in the call to the Pancake Router to execute a trade. + */ +export interface SwapParameters { + /** + * The method to call on the Pancake Router. + */ + methodName: string + /** + * The arguments to pass to the method, all hex encoded. + */ + args: (string | string[])[] + /** + * The amount of wei to send in hex. + */ + value: string +} + +function toHex(currencyAmount: CurrencyAmount) { + return `0x${currencyAmount.raw.toString(16)}` +} + +const ZERO_HEX = '0x0' + +/** + * Represents the Pancake Router, and has static methods for helping execute trades. + */ +export abstract class Router { + /** + * Cannot be constructed. + */ + private constructor() {} + /** + * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade. + * @param trade to produce call parameters for + * @param options options for the call parameters + */ + public static swapCallParameters(trade: Trade, options: TradeOptions | TradeOptionsDeadline): SwapParameters { + const etherIn = trade.inputAmount.currency === ETHER + const etherOut = trade.outputAmount.currency === ETHER + // the router does not support both ether in and out + invariant(!(etherIn && etherOut), 'ETHER_IN_OUT') + invariant(!('ttl' in options) || options.ttl > 0, 'TTL') + + const to: string = validateAndParseAddress(options.recipient) + const amountIn: string = toHex(trade.maximumAmountIn(options.allowedSlippage)) + const amountOut: string = toHex(trade.minimumAmountOut(options.allowedSlippage)) + const path: string[] = trade.route.path.map((token) => token.address) + const deadline = + 'ttl' in options + ? `0x${(Math.floor(new Date().getTime() / 1000) + options.ttl).toString(16)}` + : `0x${options.deadline.toString(16)}` + + const useFeeOnTransfer = Boolean(options.feeOnTransfer) + + let methodName: string + let args: (string | string[])[] + let value: string + switch (trade.tradeType) { + case TradeType.EXACT_INPUT: + if (etherIn) { + methodName = useFeeOnTransfer ? 'swapExactETHForTokensSupportingFeeOnTransferTokens' : 'swapExactETHForTokens' + // (uint amountOutMin, address[] calldata path, address to, uint deadline) + args = [amountOut, path, to, deadline] + value = amountIn + } else if (etherOut) { + methodName = useFeeOnTransfer ? 'swapExactTokensForETHSupportingFeeOnTransferTokens' : 'swapExactTokensForETH' + // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) + args = [amountIn, amountOut, path, to, deadline] + value = ZERO_HEX + } else { + methodName = useFeeOnTransfer + ? 'swapExactTokensForTokensSupportingFeeOnTransferTokens' + : 'swapExactTokensForTokens' + // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) + args = [amountIn, amountOut, path, to, deadline] + value = ZERO_HEX + } + break + case TradeType.EXACT_OUTPUT: + invariant(!useFeeOnTransfer, 'EXACT_OUT_FOT') + if (etherIn) { + methodName = 'swapETHForExactTokens' + // (uint amountOut, address[] calldata path, address to, uint deadline) + args = [amountOut, path, to, deadline] + value = amountIn + } else if (etherOut) { + methodName = 'swapTokensForExactETH' + // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) + args = [amountOut, amountIn, path, to, deadline] + value = ZERO_HEX + } else { + methodName = 'swapTokensForExactTokens' + // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) + args = [amountOut, amountIn, path, to, deadline] + value = ZERO_HEX + } + break + } + return { + methodName, + args, + value, + } + } +} diff --git a/packages/pancake-swap-sdk/src/utils.ts b/packages/pancake-swap-sdk/src/utils.ts new file mode 100644 index 0000000..da9623d --- /dev/null +++ b/packages/pancake-swap-sdk/src/utils.ts @@ -0,0 +1,78 @@ +import invariant from 'tiny-invariant' +import warning from 'tiny-warning' +import JSBI from 'jsbi' +import { getAddress } from '@ethersproject/address' + +import { BigintIsh, ZERO, ONE, TWO, THREE, SolidityType, SOLIDITY_TYPE_MAXIMA } from './constants' + +export function validateSolidityTypeInstance(value: JSBI, solidityType: SolidityType): void { + invariant(JSBI.greaterThanOrEqual(value, ZERO), `${value} is not a ${solidityType}.`) + invariant(JSBI.lessThanOrEqual(value, SOLIDITY_TYPE_MAXIMA[solidityType]), `${value} is not a ${solidityType}.`) +} + +// warns if addresses are not checksummed +export function validateAndParseAddress(address: string): string { + try { + const checksummedAddress = getAddress(address) + warning(address === checksummedAddress, `${address} is not checksummed.`) + return checksummedAddress + } catch (error) { + invariant(false, `${address} is not a valid address.`) + } +} + +export function parseBigintIsh(bigintIsh: BigintIsh): JSBI { + return bigintIsh instanceof JSBI ? bigintIsh : JSBI.BigInt(bigintIsh) +} + +// mock the on-chain sqrt function +export function sqrt(y: JSBI): JSBI { + validateSolidityTypeInstance(y, SolidityType.uint256) + let z: JSBI = ZERO + let x: JSBI + if (JSBI.greaterThan(y, THREE)) { + z = y + x = JSBI.add(JSBI.divide(y, TWO), ONE) + while (JSBI.lessThan(x, z)) { + z = x + x = JSBI.divide(JSBI.add(JSBI.divide(y, x), x), TWO) + } + } else if (JSBI.notEqual(y, ZERO)) { + z = ONE + } + return z +} + +// given an array of items sorted by `comparator`, insert an item into its sort index and constrain the size to +// `maxSize` by removing the last item +export function sortedInsert(items: T[], add: T, maxSize: number, comparator: (a: T, b: T) => number): T | null { + invariant(maxSize > 0, 'MAX_SIZE_ZERO') + // this is an invariant because the interface cannot return multiple removed items if items.length exceeds maxSize + invariant(items.length <= maxSize, 'ITEMS_SIZE') + + // short circuit first item add + if (items.length === 0) { + items.push(add) + return null + } else { + const isFull = items.length === maxSize + // short circuit if full and the additional item does not come before the last item + if (isFull && comparator(items[items.length - 1], add) <= 0) { + return add + } + + let lo = 0, + hi = items.length + + while (lo < hi) { + const mid = (lo + hi) >>> 1 + if (comparator(items[mid], add) <= 0) { + lo = mid + 1 + } else { + hi = mid + } + } + items.splice(lo, 0, add) + return isFull ? items.pop()! : null + } +} diff --git a/packages/pancake-swap-sdk/test/bytecode b/packages/pancake-swap-sdk/test/bytecode new file mode 100644 index 0000000..7031f95 --- /dev/null +++ b/packages/pancake-swap-sdk/test/bytecode @@ -0,0 +1 @@ +60806040526001600c5534801561001557600080fd5b5060004690506040518080613bfa60529139605201905060405180910390206040518060400160405280600b81526020017f50616e63616b65204c5073000000000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001208330604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050604051602081830303815290604052805190602001206003819055505033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613a85806101756000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a7146108c4578063d505accf1461090e578063dd62ed3e146109a7578063fff6cae914610a1f576101a9565b8063ba9a7a5614610818578063bc25cf7714610836578063c45a01551461087a576101a9565b80637ecebe00116100d35780637ecebe001461067857806389afcb44146106d057806395d89b411461072f578063a9059cbb146107b2576101a9565b80636a627842146105aa57806370a08231146106025780637464fc3d1461065a576101a9565b806323b872dd116101665780633644e515116101405780633644e515146104ec578063485cc9551461050a5780635909c0d51461056e5780635a3d54931461058c576101a9565b806323b872dd1461042457806330adf81f146104aa578063313ce567146104c8576101a9565b8063022c0d9f146101ae57806306fdde031461025b5780630902f1ac146102de578063095ea7b3146103565780630dfe1681146103bc57806318160ddd14610406575b600080fd5b610259600480360360808110156101c457600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561021557600080fd5b82018360208201111561022757600080fd5b8035906020019184600183028401116401000000008311171561024957600080fd5b9091929391929390505050610a29565b005b610263611234565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a3578082015181840152602081019050610288565b50505050905090810190601f1680156102d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e661126d565b60405180846dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff168152602001836dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1681526020018263ffffffff1663ffffffff168152602001935050505060405180910390f35b6103a26004803603604081101561036c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112ca565b604051808215151515815260200191505060405180910390f35b6103c46112e1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040e611307565b6040518082815260200191505060405180910390f35b6104906004803603606081101561043a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061130d565b604051808215151515815260200191505060405180910390f35b6104b26114d8565b6040518082815260200191505060405180910390f35b6104d06114ff565b604051808260ff1660ff16815260200191505060405180910390f35b6104f4611504565b6040518082815260200191505060405180910390f35b61056c6004803603604081101561052057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150a565b005b610576611653565b6040518082815260200191505060405180910390f35b610594611659565b6040518082815260200191505060405180910390f35b6105ec600480360360208110156105c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061165f565b6040518082815260200191505060405180910390f35b6106446004803603602081101561061857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b10565b6040518082815260200191505060405180910390f35b610662611b28565b6040518082815260200191505060405180910390f35b6106ba6004803603602081101561068e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2e565b6040518082815260200191505060405180910390f35b610712600480360360208110156106e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b46565b604051808381526020018281526020019250505060405180910390f35b610737612133565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561077757808201518184015260208101905061075c565b50505050905090810190601f1680156107a45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107fe600480360360408110156107c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061216c565b604051808215151515815260200191505060405180910390f35b610820612183565b6040518082815260200191505060405180910390f35b6108786004803603602081101561084c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612189565b005b610882612464565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108cc61248a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a5600480360360e081101561092457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506124b0565b005b610a09600480360360408110156109bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127f4565b6040518082815260200191505060405180910390f35b610a27612819565b005b6001600c5414610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f50616e63616b653a204c4f434b4544000000000000000000000000000000000081525060200191505060405180910390fd5b6000600c819055506000851180610ab85750600084115b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613a086023913960400191505060405180910390fd5b600080610b1861126d565b5091509150816dffffffffffffffffffffffffffff1687108015610b4b5750806dffffffffffffffffffffffffffff1686105b610bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f50616e63616b653a20494e53554646494349454e545f4c49515549444954590081525060200191505060405180910390fd5b6000806000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614158015610c7657508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b610ce8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50616e63616b653a20494e56414c49445f544f0000000000000000000000000081525060200191505060405180910390fd5b60008b1115610cfd57610cfc828a8d612a99565b5b60008a1115610d1257610d11818a8c612a99565b5b6000888890501115610dfa578873ffffffffffffffffffffffffffffffffffffffff166384800812338d8d8c8c6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b505050505b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610e7757600080fd5b505afa158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b810190808051906020019092919050505093508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f3157600080fd5b505afa158015610f45573d6000803e3d6000fd5b505050506040513d6020811015610f5b57600080fd5b810190808051906020019092919050505092505050600089856dffffffffffffffffffffffffffff16038311610f92576000610fa8565b89856dffffffffffffffffffffffffffff160383035b9050600089856dffffffffffffffffffffffffffff16038311610fcc576000610fe2565b89856dffffffffffffffffffffffffffff160383035b90506000821180610ff35750600081115b611048576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806139c06022913960400191505060405180910390fd5b6000611084611061601985612ce690919063ffffffff16565b61107661271088612ce690919063ffffffff16565b612d7b90919063ffffffff16565b905060006110c261109f601985612ce690919063ffffffff16565b6110b461271088612ce690919063ffffffff16565b612d7b90919063ffffffff16565b905061110d6305f5e1006110ff896dffffffffffffffffffffffffffff168b6dffffffffffffffffffffffffffff16612ce690919063ffffffff16565b612ce690919063ffffffff16565b6111208284612ce690919063ffffffff16565b1015611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f50616e63616b653a204b0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506111a284848888612dfe565b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82284848f8f6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050506001600c819055505050505050565b6040518060400160405280600b81526020017f50616e63616b65204c507300000000000000000000000000000000000000000081525081565b6000806000600860009054906101000a90046dffffffffffffffffffffffffffff1692506008600e9054906101000a90046dffffffffffffffffffffffffffff1691506008601c9054906101000a900463ffffffff169050909192565b60006112d733848461317c565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146114c25761144182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d7b90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6114cd848484613267565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b601281565b60035481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f50616e63616b653a20464f5242494444454e000000000000000000000000000081525060200191505060405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60095481565b600a5481565b60006001600c54146116d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f50616e63616b653a204c4f434b4544000000000000000000000000000000000081525060200191505060405180910390fd5b6000600c819055506000806116ec61126d565b50915091506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561179257600080fd5b505afa1580156117a6573d6000803e3d6000fd5b505050506040513d60208110156117bc57600080fd5b810190808051906020019092919050505090506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d602081101561189a57600080fd5b8101908080519060200190929190505050905060006118d2856dffffffffffffffffffffffffffff1684612d7b90919063ffffffff16565b905060006118f9856dffffffffffffffffffffffffffff1684612d7b90919063ffffffff16565b9050600061190787876133fb565b9050600080549050600081141561195b576119476103e86119396119348688612ce690919063ffffffff16565b613602565b612d7b90919063ffffffff16565b985061195660006103e8613664565b6119be565b6119bb886dffffffffffffffffffffffffffff166119828387612ce690919063ffffffff16565b8161198957fe5b04886dffffffffffffffffffffffffffff166119ae8487612ce690919063ffffffff16565b816119b557fe5b0461377e565b98505b60008911611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a2b6026913960400191505060405180910390fd5b611a218a8a613664565b611a2d86868a8a612dfe565b8115611aa557611a9e6008600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16600860009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16612ce690919063ffffffff16565b600b819055505b3373ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f8585604051808381526020018281526020019250505060405180910390a250505050505050506001600c81905550919050565b60016020528060005260406000206000915090505481565b600b5481565b60046020528060005260406000206000915090505481565b6000806001600c5414611bc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f50616e63616b653a204c4f434b4544000000000000000000000000000000000081525060200191505060405180910390fd5b6000600c81905550600080611bd461126d565b50915091506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611ca657600080fd5b505afa158015611cba573d6000803e3d6000fd5b505050506040513d6020811015611cd057600080fd5b8101908080519060200190929190505050905060008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d6257600080fd5b505afa158015611d76573d6000803e3d6000fd5b505050506040513d6020811015611d8c57600080fd5b810190808051906020019092919050505090506000600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000611def88886133fb565b905060008054905080611e0b8685612ce690919063ffffffff16565b81611e1257fe5b049a5080611e298585612ce690919063ffffffff16565b81611e3057fe5b04995060008b118015611e43575060008a115b611e98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139e26026913960400191505060405180910390fd5b611ea23084613797565b611ead878d8d612a99565b611eb8868d8c612a99565b8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f3557600080fd5b505afa158015611f49573d6000803e3d6000fd5b505050506040513d6020811015611f5f57600080fd5b810190808051906020019092919050505094508573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fef57600080fd5b505afa158015612003573d6000803e3d6000fd5b505050506040513d602081101561201957600080fd5b8101908080519060200190929190505050935061203885858b8b612dfe565b81156120b0576120a96008600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16600860009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16612ce690919063ffffffff16565b600b819055505b8b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d819364968d8d604051808381526020018281526020019250505060405180910390a35050505050505050506001600c81905550915091565b6040518060400160405280600781526020017f43616b652d4c500000000000000000000000000000000000000000000000000081525081565b6000612179338484613267565b6001905092915050565b6103e881565b6001600c5414612201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f50616e63616b653a204c4f434b4544000000000000000000000000000000000081525060200191505060405180910390fd5b6000600c819055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506123578284612352600860009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561230957600080fd5b505afa15801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b8101908080519060200190929190505050612d7b90919063ffffffff16565b612a99565b61245781846124526008600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561240957600080fd5b505afa15801561241d573d6000803e3d6000fd5b505050506040513d602081101561243357600080fd5b8101908080519060200190929190505050612d7b90919063ffffffff16565b612a99565b50506001600c8190555050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b42841015612526576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f50616e63616b653a20455850495245440000000000000000000000000000000081525060200191505060405180910390fd5b60006003547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b898989600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012060405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156126f8573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561276c57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f50616e63616b653a20494e56414c49445f5349474e415455524500000000000081525060200191505060405180910390fd5b6127e989898961317c565b505050505050505050565b6002602052816000526040600020602052806000526040600020600091509150505481565b6001600c5414612891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f50616e63616b653a204c4f434b4544000000000000000000000000000000000081525060200191505060405180910390fd5b6000600c81905550612a8f600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561293b57600080fd5b505afa15801561294f573d6000803e3d6000fd5b505050506040513d602081101561296557600080fd5b8101908080519060200190929190505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612a1557600080fd5b505afa158015612a29573d6000803e3d6000fd5b505050506040513d6020811015612a3f57600080fd5b8101908080519060200190929190505050600860009054906101000a90046dffffffffffffffffffffffffffff166008600e9054906101000a90046dffffffffffffffffffffffffffff16612dfe565b6001600c81905550565b600060608473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601981526020017f7472616e7366657228616464726573732c75696e743235362900000000000000815250805190602001208585604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310612bc65780518252602082019150602081019050602083039250612ba3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c28576040519150601f19603f3d011682016040523d82523d6000602084013e612c2d565b606091505b5091509150818015612c6d5750600081511480612c6c5750808060200190516020811015612c5a57600080fd5b81019080805190602001909291905050505b5b612cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f50616e63616b653a205452414e534645525f4641494c4544000000000000000081525060200191505060405180910390fd5b5050505050565b600080821480612d035750828283850292508281612d0057fe5b04145b612d75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f64732d6d6174682d6d756c2d6f766572666c6f7700000000000000000000000081525060200191505060405180910390fd5b92915050565b6000828284039150811115612df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f64732d6d6174682d7375622d756e646572666c6f77000000000000000000000081525060200191505060405180910390fd5b92915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff168411158015612e6e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff168311155b612ee0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f50616e63616b653a204f564552464c4f5700000000000000000000000000000081525060200191505060405180910390fd5b60006401000000004281612ef057fe5b06905060006008601c9054906101000a900463ffffffff168203905060008163ffffffff16118015612f3357506000846dffffffffffffffffffffffffffff1614155b8015612f5057506000836dffffffffffffffffffffffffffff1614155b15613032578063ffffffff16612f9585612f69866138b1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166138dc90919063ffffffff16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16026009600082825401925050819055508063ffffffff1661300384612fd7876138b1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166138dc90919063ffffffff16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602600a600082825401925050819055505b85600860006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550846008600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550816008601c6101000a81548163ffffffff021916908363ffffffff1602179055507f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1600860009054906101000a90046dffffffffffffffffffffffffffff166008600e9054906101000a90046dffffffffffffffffffffffffffff1660405180836dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff168152602001826dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6132b981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d7b90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061334e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461393c90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561346657600080fd5b505afa15801561347a573d6000803e3d6000fd5b505050506040513d602081101561349057600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141591506000600b54905082156135e857600081146135e3576000613528613523866dffffffffffffffffffffffffffff16886dffffffffffffffffffffffffffff16612ce690919063ffffffff16565b613602565b9050600061353583613602565b9050808211156135e057600061357b600861356d61355c8587612d7b90919063ffffffff16565b600054612ce690919063ffffffff16565b612ce690919063ffffffff16565b905060006135b8613596600885612ce690919063ffffffff16565b6135aa601187612ce690919063ffffffff16565b61393c90919063ffffffff16565b905060008183816135c557fe5b04905060008111156135dc576135db8782613664565b5b5050505b50505b6135fa565b600081146135f9576000600b819055505b5b505092915050565b6000600382111561365157819050600060016002848161361e57fe5b040190505b8181101561364b5780915060028182858161363a57fe5b04018161364357fe5b049050613623565b5061365f565b6000821461365e57600190505b5b919050565b6136798160005461393c90919063ffffffff16565b6000819055506136d181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461393c90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600081831061378d578161378f565b825b905092915050565b6137e981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d7b90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061384181600054612d7b90919063ffffffff16565b600081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60006e010000000000000000000000000000826dffffffffffffffffffffffffffff16029050919050565b6000816dffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161393357fe5b04905092915050565b60008282840191508110156139b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f64732d6d6174682d6164642d6f766572666c6f7700000000000000000000000081525060200191505060405180910390fd5b9291505056fe50616e63616b653a20494e53554646494349454e545f494e5055545f414d4f554e5450616e63616b653a20494e53554646494349454e545f4c49515549444954595f4255524e454450616e63616b653a20494e53554646494349454e545f4f55545055545f414d4f554e5450616e63616b653a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a723158204c647542259e471353892c1bc85f3bd97626f8162e3134e910684c65f3f4f2ca64736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429 \ No newline at end of file diff --git a/packages/pancake-swap-sdk/test/constants.test.ts b/packages/pancake-swap-sdk/test/constants.test.ts new file mode 100644 index 0000000..da17402 --- /dev/null +++ b/packages/pancake-swap-sdk/test/constants.test.ts @@ -0,0 +1,18 @@ +import { INIT_CODE_HASH } from '../src/constants' +import fs from 'fs' +import path from 'path' +import { keccak256 } from '@ethersproject/solidity' + +const bytecode = fs.readFileSync(path.join(__dirname, './bytecode'), 'utf8') + +// this _could_ go in constants, except that it would cost every consumer of the sdk the CPU to compute the hash +// and load the JSON. +const COMPUTED_INIT_CODE_HASH = keccak256(['bytes'], [`0x${bytecode}`]) + +describe('constants', () => { + describe('INIT_CODE_HASH', () => { + it('matches computed bytecode hash', () => { + expect(COMPUTED_INIT_CODE_HASH).toEqual(INIT_CODE_HASH) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/test/data.test.ts b/packages/pancake-swap-sdk/test/data.test.ts new file mode 100644 index 0000000..edeb7bd --- /dev/null +++ b/packages/pancake-swap-sdk/test/data.test.ts @@ -0,0 +1,20 @@ +import { ChainId, WETH, Token, Fetcher } from '../src' + +// TODO: replace the provider in these tests +describe.skip('data', () => { + it('Token', async () => { + const token = await Fetcher.fetchTokenData(ChainId.MAINNET, '0x6B175474E89094C44Da98b954EedeAC495271d0F') // DAI + expect(token.decimals).toEqual(18) + }) + + it('Token:CACHE', async () => { + const token = await Fetcher.fetchTokenData(ChainId.MAINNET, '0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A') // DGD + expect(token.decimals).toEqual(9) + }) + + it('Pair', async () => { + const token = new Token(ChainId.TESTNET, '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735', 18) // DAI + const pair = await Fetcher.fetchPairData(WETH[ChainId.TESTNET], token) + expect(pair.liquidityToken.address).toEqual('0x8B22F85d0c844Cf793690F6D9DFE9F11Ddb35449') + }) +}) diff --git a/packages/pancake-swap-sdk/test/entities.test.ts b/packages/pancake-swap-sdk/test/entities.test.ts new file mode 100644 index 0000000..60ecb57 --- /dev/null +++ b/packages/pancake-swap-sdk/test/entities.test.ts @@ -0,0 +1,188 @@ +import invariant from 'tiny-invariant' +import JSBI from 'jsbi' +import { ChainId, WETH as _WETH, TradeType, Rounding, Token, TokenAmount, Pair, Route, Trade } from '../src' + +const ADDRESSES = [ + '0x0000000000000000000000000000000000000001', + '0x0000000000000000000000000000000000000002', + '0x0000000000000000000000000000000000000003' +] +const CHAIN_ID = ChainId.TESTNET +const WETH = _WETH[ChainId.TESTNET] +const DECIMAL_PERMUTATIONS: [number, number, number][] = [ + [0, 0, 0], + [0, 9, 18], + [18, 18, 18] +] + +function decimalize(amount: number, decimals: number): JSBI { + return JSBI.multiply(JSBI.BigInt(amount), JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(decimals))) +} + +describe('entities', () => { + DECIMAL_PERMUTATIONS.forEach(decimals => { + describe(`decimals permutation: ${decimals}`, () => { + let tokens: Token[] + it('Token', () => { + tokens = ADDRESSES.map((address, i) => new Token(CHAIN_ID, address, decimals[i])) + tokens.forEach((token, i) => { + expect(token.chainId).toEqual(CHAIN_ID) + expect(token.address).toEqual(ADDRESSES[i]) + expect(token.decimals).toEqual(decimals[i]) + }) + }) + + let pairs: Pair[] + it('Pair', () => { + pairs = [ + new Pair( + new TokenAmount(tokens[0], decimalize(1, tokens[0].decimals)), + new TokenAmount(tokens[1], decimalize(1, tokens[1].decimals)) + ), + new Pair( + new TokenAmount(tokens[1], decimalize(1, tokens[1].decimals)), + new TokenAmount(tokens[2], decimalize(1, tokens[2].decimals)) + ), + new Pair( + new TokenAmount(tokens[2], decimalize(1, tokens[2].decimals)), + new TokenAmount(WETH, decimalize(1234, WETH.decimals)) + ) + ] + }) + + let route: Route + it('Route', () => { + route = new Route(pairs, tokens[0]) + expect(route.pairs).toEqual(pairs) + expect(route.path).toEqual(tokens.concat([WETH])) + expect(route.input).toEqual(tokens[0]) + expect(route.output).toEqual(WETH) + }) + + it('Price:Route.midPrice', () => { + invariant(route.input instanceof Token) + invariant(route.output instanceof Token) + expect(route.midPrice.quote(new TokenAmount(route.input, decimalize(1, route.input.decimals)))).toEqual( + new TokenAmount(route.output, decimalize(1234, route.output.decimals)) + ) + expect( + route.midPrice.invert().quote(new TokenAmount(route.output, decimalize(1234, route.output.decimals))) + ).toEqual(new TokenAmount(route.input, decimalize(1, route.input.decimals))) + + expect(route.midPrice.toSignificant(1)).toEqual('1000') + expect(route.midPrice.toSignificant(2)).toEqual('1200') + expect(route.midPrice.toSignificant(3)).toEqual('1230') + expect(route.midPrice.toSignificant(4)).toEqual('1234') + expect(route.midPrice.toSignificant(5)).toEqual('1234') + expect(route.midPrice.toSignificant(5, { groupSeparator: ',' })).toEqual('1,234') + expect(route.midPrice.invert().toSignificant(1)).toEqual('0.0008') + expect(route.midPrice.invert().toSignificant(2)).toEqual('0.00081') + expect(route.midPrice.invert().toSignificant(3)).toEqual('0.00081') + expect(route.midPrice.invert().toSignificant(4)).toEqual('0.0008104') + expect(route.midPrice.invert().toSignificant(4, undefined, Rounding.ROUND_DOWN)).toEqual('0.0008103') + expect(route.midPrice.invert().toSignificant(5)).toEqual('0.00081037') + + expect(route.midPrice.toFixed(0)).toEqual('1234') + expect(route.midPrice.toFixed(1)).toEqual('1234.0') + expect(route.midPrice.toFixed(2)).toEqual('1234.00') + expect(route.midPrice.toFixed(2, { groupSeparator: ',' })).toEqual('1,234.00') + expect(route.midPrice.invert().toFixed(0)).toEqual('0') + expect(route.midPrice.invert().toFixed(1)).toEqual('0.0') + expect(route.midPrice.invert().toFixed(2)).toEqual('0.00') + expect(route.midPrice.invert().toFixed(3)).toEqual('0.001') + expect(route.midPrice.invert().toFixed(4)).toEqual('0.0008') + expect(route.midPrice.invert().toFixed(5)).toEqual('0.00081') + expect(route.midPrice.invert().toFixed(6)).toEqual('0.000810') + expect(route.midPrice.invert().toFixed(7)).toEqual('0.0008104') + expect(route.midPrice.invert().toFixed(7, undefined, Rounding.ROUND_DOWN)).toEqual('0.0008103') + expect(route.midPrice.invert().toFixed(8)).toEqual('0.00081037') + }) + + describe('Trade', () => { + let route: Route + it('TradeType.EXACT_INPUT', () => { + route = new Route( + [ + new Pair( + new TokenAmount(tokens[1], decimalize(5, tokens[1].decimals)), + new TokenAmount(WETH, decimalize(10, WETH.decimals)) + ) + ], + tokens[1] + ) + const inputAmount = new TokenAmount(tokens[1], decimalize(1, tokens[1].decimals)) + const expectedOutputAmount = new TokenAmount(WETH, '1663192997082117548') + const trade = new Trade(route, inputAmount, TradeType.EXACT_INPUT) + expect(trade.route).toEqual(route) + expect(trade.tradeType).toEqual(TradeType.EXACT_INPUT) + expect(trade.inputAmount).toEqual(inputAmount) + expect(trade.outputAmount).toEqual(expectedOutputAmount) + + expect(trade.executionPrice.toSignificant(18)).toEqual('1.66319299708211755') + expect(trade.executionPrice.invert().toSignificant(18)).toEqual('0.601253132832080201') + expect(trade.executionPrice.quote(inputAmount)).toEqual(expectedOutputAmount) + expect(trade.executionPrice.invert().quote(expectedOutputAmount)).toEqual(inputAmount) + + expect(trade.nextMidPrice.toSignificant(18)).toEqual('1.38946783381964708') + expect(trade.nextMidPrice.invert().toSignificant(18)).toEqual('0.7197') + + expect(trade.priceImpact.toSignificant(18)).toEqual('16.8403501458941226') + }) + + it('TradeType.EXACT_OUTPUT', () => { + const outputAmount = new TokenAmount(WETH, '1663192997082117548') + const expectedInputAmount = new TokenAmount(tokens[1], decimalize(1, tokens[1].decimals)) + const trade = new Trade(route, outputAmount, TradeType.EXACT_OUTPUT) + expect(trade.route).toEqual(route) + expect(trade.tradeType).toEqual(TradeType.EXACT_OUTPUT) + expect(trade.outputAmount).toEqual(outputAmount) + expect(trade.inputAmount).toEqual(expectedInputAmount) + + expect(trade.executionPrice.toSignificant(18)).toEqual('1.66319299708211755') + expect(trade.executionPrice.invert().toSignificant(18)).toEqual('0.601253132832080201') + expect(trade.executionPrice.quote(expectedInputAmount)).toEqual(outputAmount) + expect(trade.executionPrice.invert().quote(outputAmount)).toEqual(expectedInputAmount) + + expect(trade.nextMidPrice.toSignificant(18)).toEqual('1.38946783381964708') + expect(trade.nextMidPrice.invert().toSignificant(18)).toEqual('0.7197') + + expect(trade.priceImpact.toSignificant(18)).toEqual('16.8403501458941226') + }) + + it('minimum TradeType.EXACT_INPUT', () => { + if ([9, 18].includes(tokens[1].decimals)) { + const route = new Route( + [ + new Pair( + new TokenAmount(tokens[1], decimalize(1, tokens[1].decimals)), + new TokenAmount( + WETH, + JSBI.add( + decimalize(10, WETH.decimals), + + tokens[1].decimals === 9 ? JSBI.BigInt('30090280812437312') : JSBI.BigInt('30090270812437322') + ) + ) + ) + ], + tokens[1], + WETH + ) + const outputAmount = new TokenAmount(tokens[1], '1') + const trade = new Trade(route, outputAmount, TradeType.EXACT_INPUT) + + expect(trade.priceImpact.toSignificant(18)).toEqual( + tokens[1].decimals === 9 ? '0.2500001008007499' : '0.3000000000000001' + ) + } + }) + }) + + it('TokenAmount', () => { + const amount = new TokenAmount(WETH, '1234567000000000000000') + expect(amount.toExact()).toEqual('1234.567') + expect(amount.toExact({ groupSeparator: ',' })).toEqual('1,234.567') + }) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/test/fraction.test.ts b/packages/pancake-swap-sdk/test/fraction.test.ts new file mode 100644 index 0000000..aed35a7 --- /dev/null +++ b/packages/pancake-swap-sdk/test/fraction.test.ts @@ -0,0 +1,128 @@ +import { Fraction } from '../src' +import JSBI from 'jsbi' + +describe.only('Fraction', () => { + describe('#quotient', () => { + it('floor division', () => { + expect(new Fraction(JSBI.BigInt(8), JSBI.BigInt(3)).quotient).toEqual(JSBI.BigInt(2)) // one below + expect(new Fraction(JSBI.BigInt(12), JSBI.BigInt(4)).quotient).toEqual(JSBI.BigInt(3)) // exact + expect(new Fraction(JSBI.BigInt(16), JSBI.BigInt(5)).quotient).toEqual(JSBI.BigInt(3)) // one above + }) + }) + describe('#remainder', () => { + it('returns fraction after divison', () => { + expect(new Fraction(JSBI.BigInt(8), JSBI.BigInt(3)).remainder).toEqual( + new Fraction(JSBI.BigInt(2), JSBI.BigInt(3)) + ) + expect(new Fraction(JSBI.BigInt(12), JSBI.BigInt(4)).remainder).toEqual( + new Fraction(JSBI.BigInt(0), JSBI.BigInt(4)) + ) + expect(new Fraction(JSBI.BigInt(16), JSBI.BigInt(5)).remainder).toEqual( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(5)) + ) + }) + }) + describe('#invert', () => { + it('flips num and denom', () => { + expect(new Fraction(JSBI.BigInt(5), JSBI.BigInt(10)).invert().numerator).toEqual(JSBI.BigInt(10)) + expect(new Fraction(JSBI.BigInt(5), JSBI.BigInt(10)).invert().denominator).toEqual(JSBI.BigInt(5)) + }) + }) + describe('#add', () => { + it('multiples denoms and adds nums', () => { + expect(new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).add(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12)))).toEqual( + new Fraction(JSBI.BigInt(52), JSBI.BigInt(120)) + ) + }) + + it('same denom', () => { + expect(new Fraction(JSBI.BigInt(1), JSBI.BigInt(5)).add(new Fraction(JSBI.BigInt(2), JSBI.BigInt(5)))).toEqual( + new Fraction(JSBI.BigInt(3), JSBI.BigInt(5)) + ) + }) + }) + describe('#subtract', () => { + it('multiples denoms and subtracts nums', () => { + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).subtract(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(-28), JSBI.BigInt(120))) + }) + it('same denom', () => { + expect( + new Fraction(JSBI.BigInt(3), JSBI.BigInt(5)).subtract(new Fraction(JSBI.BigInt(2), JSBI.BigInt(5))) + ).toEqual(new Fraction(JSBI.BigInt(1), JSBI.BigInt(5))) + }) + }) + describe('#lessThan', () => { + it('correct', () => { + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).lessThan(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toBe(true) + expect(new Fraction(JSBI.BigInt(1), JSBI.BigInt(3)).lessThan(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12)))).toBe( + false + ) + expect( + new Fraction(JSBI.BigInt(5), JSBI.BigInt(12)).lessThan(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toBe(false) + }) + }) + describe('#equalTo', () => { + it('correct', () => { + expect(new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).equalTo(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12)))).toBe( + false + ) + expect(new Fraction(JSBI.BigInt(1), JSBI.BigInt(3)).equalTo(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12)))).toBe( + true + ) + expect(new Fraction(JSBI.BigInt(5), JSBI.BigInt(12)).equalTo(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12)))).toBe( + false + ) + }) + }) + describe('#greaterThan', () => { + it('correct', () => { + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).greaterThan(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toBe(false) + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(3)).greaterThan(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toBe(false) + expect( + new Fraction(JSBI.BigInt(5), JSBI.BigInt(12)).greaterThan(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toBe(true) + }) + }) + describe('#multiplty', () => { + it('correct', () => { + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).multiply(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(4), JSBI.BigInt(120))) + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(3)).multiply(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(4), JSBI.BigInt(36))) + expect( + new Fraction(JSBI.BigInt(5), JSBI.BigInt(12)).multiply(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(20), JSBI.BigInt(144))) + }) + }) + describe('#divide', () => { + it('correct', () => { + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(10)).divide(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(12), JSBI.BigInt(40))) + expect( + new Fraction(JSBI.BigInt(1), JSBI.BigInt(3)).divide(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(12), JSBI.BigInt(12))) + expect( + new Fraction(JSBI.BigInt(5), JSBI.BigInt(12)).divide(new Fraction(JSBI.BigInt(4), JSBI.BigInt(12))) + ).toEqual(new Fraction(JSBI.BigInt(60), JSBI.BigInt(48))) + }) + }) + describe('#asFraction', () => { + it('returns an equivalent but not the same reference fraction', () => { + const f = new Fraction(1, 2) + expect(f.asFraction).toEqual(f) + expect(f === f.asFraction).toEqual(false) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/test/miscellaneous.test.ts b/packages/pancake-swap-sdk/test/miscellaneous.test.ts new file mode 100644 index 0000000..2282897 --- /dev/null +++ b/packages/pancake-swap-sdk/test/miscellaneous.test.ts @@ -0,0 +1,173 @@ +import { ChainId, Token, TokenAmount, Pair, InsufficientInputAmountError } from '../src' +import { sortedInsert } from '../src/utils' + +describe('miscellaneous', () => { + it('getLiquidityMinted:0', async () => { + const tokenA = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000001', 18) + const tokenB = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000002', 18) + const pair = new Pair(new TokenAmount(tokenA, '0'), new TokenAmount(tokenB, '0')) + + expect(() => { + pair.getLiquidityMinted( + new TokenAmount(pair.liquidityToken, '0'), + new TokenAmount(tokenA, '1000'), + new TokenAmount(tokenB, '1000') + ) + }).toThrow(InsufficientInputAmountError) + + expect(() => { + pair.getLiquidityMinted( + new TokenAmount(pair.liquidityToken, '0'), + new TokenAmount(tokenA, '1000000'), + new TokenAmount(tokenB, '1') + ) + }).toThrow(InsufficientInputAmountError) + + const liquidity = pair.getLiquidityMinted( + new TokenAmount(pair.liquidityToken, '0'), + new TokenAmount(tokenA, '1001'), + new TokenAmount(tokenB, '1001') + ) + + expect(liquidity.raw.toString()).toEqual('1') + }) + + it('getLiquidityMinted:!0', async () => { + const tokenA = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000001', 18) + const tokenB = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000002', 18) + const pair = new Pair(new TokenAmount(tokenA, '10000'), new TokenAmount(tokenB, '10000')) + + expect( + pair + .getLiquidityMinted( + new TokenAmount(pair.liquidityToken, '10000'), + new TokenAmount(tokenA, '2000'), + new TokenAmount(tokenB, '2000') + ) + .raw.toString() + ).toEqual('2000') + }) + + it('getLiquidityValue:!feeOn', async () => { + const tokenA = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000001', 18) + const tokenB = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000002', 18) + const pair = new Pair(new TokenAmount(tokenA, '1000'), new TokenAmount(tokenB, '1000')) + + { + const liquidityValue = pair.getLiquidityValue( + tokenA, + new TokenAmount(pair.liquidityToken, '1000'), + new TokenAmount(pair.liquidityToken, '1000'), + false + ) + expect(liquidityValue.token.equals(tokenA)).toBe(true) + expect(liquidityValue.raw.toString()).toBe('1000') + } + + // 500 + { + const liquidityValue = pair.getLiquidityValue( + tokenA, + new TokenAmount(pair.liquidityToken, '1000'), + new TokenAmount(pair.liquidityToken, '500'), + false + ) + expect(liquidityValue.token.equals(tokenA)).toBe(true) + expect(liquidityValue.raw.toString()).toBe('500') + } + + // tokenB + { + const liquidityValue = pair.getLiquidityValue( + tokenB, + new TokenAmount(pair.liquidityToken, '1000'), + new TokenAmount(pair.liquidityToken, '1000'), + false + ) + expect(liquidityValue.token.equals(tokenB)).toBe(true) + expect(liquidityValue.raw.toString()).toBe('1000') + } + }) + + it('getLiquidityValue:feeOn', async () => { + const tokenA = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000001', 18) + const tokenB = new Token(ChainId.TESTNET, '0x0000000000000000000000000000000000000002', 18) + const pair = new Pair(new TokenAmount(tokenA, '1000'), new TokenAmount(tokenB, '1000')) + + const liquidityValue = pair.getLiquidityValue( + tokenA, + new TokenAmount(pair.liquidityToken, '500'), + new TokenAmount(pair.liquidityToken, '500'), + true, + '250000' // 500 ** 2 + ) + expect(liquidityValue.token.equals(tokenA)).toBe(true) + expect(liquidityValue.raw.toString()).toBe('917') // ceiling(1000 - (500 * (1 / 6))) + }) + + describe('#sortedInsert', () => { + const comp = (a: number, b: number) => a - b + + it('throws if maxSize is 0', () => { + expect(() => sortedInsert([], 1, 0, comp)).toThrow('MAX_SIZE_ZERO') + }) + + it('throws if items.length > maxSize', () => { + expect(() => sortedInsert([1, 2], 1, 1, comp)).toThrow('ITEMS_SIZE') + }) + + it('adds if empty', () => { + const arr: number[] = [] + expect(sortedInsert(arr, 3, 2, comp)).toEqual(null) + expect(arr).toEqual([3]) + }) + + it('adds if not full', () => { + const arr: number[] = [1, 5] + expect(sortedInsert(arr, 3, 3, comp)).toEqual(null) + expect(arr).toEqual([1, 3, 5]) + }) + + it('adds if will not be full after', () => { + const arr: number[] = [1] + expect(sortedInsert(arr, 0, 3, comp)).toEqual(null) + expect(arr).toEqual([0, 1]) + }) + + it('returns add if sorts after last', () => { + const arr = [1, 2, 3] + expect(sortedInsert(arr, 4, 3, comp)).toEqual(4) + expect(arr).toEqual([1, 2, 3]) + }) + + it('removes from end if full', () => { + const arr = [1, 3, 4] + expect(sortedInsert(arr, 2, 3, comp)).toEqual(4) + expect(arr).toEqual([1, 2, 3]) + }) + + it('uses comparator', () => { + const arr = [4, 2, 1] + expect(sortedInsert(arr, 3, 3, (a, b) => comp(a, b) * -1)).toEqual(1) + expect(arr).toEqual([4, 3, 2]) + }) + + describe('maxSize of 1', () => { + it('empty add', () => { + const arr: number[] = [] + expect(sortedInsert(arr, 3, 1, comp)).toEqual(null) + expect(arr).toEqual([3]) + }) + it('full add greater', () => { + const arr: number[] = [2] + expect(sortedInsert(arr, 3, 1, comp)).toEqual(3) + expect(arr).toEqual([2]) + }) + it('full add lesser', () => { + const arr: number[] = [4] + expect(sortedInsert(arr, 3, 1, comp)).toEqual(4) + expect(arr).toEqual([3]) + }) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/test/pair.test.ts b/packages/pancake-swap-sdk/test/pair.test.ts new file mode 100644 index 0000000..03044ab --- /dev/null +++ b/packages/pancake-swap-sdk/test/pair.test.ts @@ -0,0 +1,118 @@ +import { ChainId, Token, Pair, TokenAmount, WETH, Price } from '../src' + +describe('Pair', () => { + const USDC = new Token(ChainId.MAINNET, '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', 18, 'USDC', 'USD Coin') + const DAI = new Token(ChainId.MAINNET, '0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3', 18, 'DAI', 'DAI Stablecoin') + + describe('constructor', () => { + it('cannot be used for tokens on different chains', () => { + expect(() => new Pair(new TokenAmount(USDC, '100'), new TokenAmount(WETH[ChainId.TESTNET], '100'))).toThrow( + 'CHAIN_IDS' + ) + }) + }) + + describe('#getAddress', () => { + it('returns the correct address', () => { + expect(Pair.getAddress(USDC, DAI)).toEqual('0xadBba1EF326A33FDB754f14e62A96D5278b942Bd') + }) + }) + + describe('#token0', () => { + it('always is the token that sorts before', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '100')).token0).toEqual(DAI) + expect(new Pair(new TokenAmount(DAI, '100'), new TokenAmount(USDC, '100')).token0).toEqual(DAI) + }) + }) + describe('#token1', () => { + it('always is the token that sorts after', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '100')).token1).toEqual(USDC) + expect(new Pair(new TokenAmount(DAI, '100'), new TokenAmount(USDC, '100')).token1).toEqual(USDC) + }) + }) + describe('#reserve0', () => { + it('always comes from the token that sorts before', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '101')).reserve0).toEqual( + new TokenAmount(DAI, '101') + ) + expect(new Pair(new TokenAmount(DAI, '101'), new TokenAmount(USDC, '100')).reserve0).toEqual( + new TokenAmount(DAI, '101') + ) + }) + }) + describe('#reserve1', () => { + it('always comes from the token that sorts after', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '101')).reserve1).toEqual( + new TokenAmount(USDC, '100') + ) + expect(new Pair(new TokenAmount(DAI, '101'), new TokenAmount(USDC, '100')).reserve1).toEqual( + new TokenAmount(USDC, '100') + ) + }) + }) + + describe('#token0Price', () => { + it('returns price of token0 in terms of token1', () => { + expect(new Pair(new TokenAmount(USDC, '101'), new TokenAmount(DAI, '100')).token0Price).toEqual( + new Price(DAI, USDC, '100', '101') + ) + expect(new Pair(new TokenAmount(DAI, '100'), new TokenAmount(USDC, '101')).token0Price).toEqual( + new Price(DAI, USDC, '100', '101') + ) + }) + }) + + describe('#token1Price', () => { + it('returns price of token1 in terms of token0', () => { + expect(new Pair(new TokenAmount(USDC, '101'), new TokenAmount(DAI, '100')).token1Price).toEqual( + new Price(USDC, DAI, '101', '100') + ) + expect(new Pair(new TokenAmount(DAI, '100'), new TokenAmount(USDC, '101')).token1Price).toEqual( + new Price(USDC, DAI, '101', '100') + ) + }) + }) + + describe('#priceOf', () => { + const pair = new Pair(new TokenAmount(USDC, '101'), new TokenAmount(DAI, '100')) + it('returns price of token in terms of other token', () => { + expect(pair.priceOf(DAI)).toEqual(pair.token0Price) + expect(pair.priceOf(USDC)).toEqual(pair.token1Price) + }) + + it('throws if invalid token', () => { + expect(() => pair.priceOf(WETH[ChainId.MAINNET])).toThrow('TOKEN') + }) + }) + + describe('#reserveOf', () => { + it('returns reserves of the given token', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '101')).reserveOf(USDC)).toEqual( + new TokenAmount(USDC, '100') + ) + expect(new Pair(new TokenAmount(DAI, '101'), new TokenAmount(USDC, '100')).reserveOf(USDC)).toEqual( + new TokenAmount(USDC, '100') + ) + }) + + it('throws if not in the pair', () => { + expect(() => + new Pair(new TokenAmount(DAI, '101'), new TokenAmount(USDC, '100')).reserveOf(WETH[ChainId.MAINNET]) + ).toThrow('TOKEN') + }) + }) + + describe('#chainId', () => { + it('returns the token0 chainId', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '100')).chainId).toEqual(ChainId.MAINNET) + expect(new Pair(new TokenAmount(DAI, '100'), new TokenAmount(USDC, '100')).chainId).toEqual(ChainId.MAINNET) + }) + }) + describe('#involvesToken', () => { + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '100')).involvesToken(USDC)).toEqual(true) + expect(new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '100')).involvesToken(DAI)).toEqual(true) + expect( + new Pair(new TokenAmount(USDC, '100'), new TokenAmount(DAI, '100')).involvesToken(WETH[ChainId.MAINNET]) + ).toEqual(false) + }) +}) diff --git a/packages/pancake-swap-sdk/test/route.test.ts b/packages/pancake-swap-sdk/test/route.test.ts new file mode 100644 index 0000000..02989d2 --- /dev/null +++ b/packages/pancake-swap-sdk/test/route.test.ts @@ -0,0 +1,40 @@ +import { Token, WETH, ChainId, Pair, TokenAmount, Route, ETHER } from '../src' + +describe('Route', () => { + const token0 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000001', 18, 't0') + const token1 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000002', 18, 't1') + const weth = WETH[ChainId.MAINNET] + const pair_0_1 = new Pair(new TokenAmount(token0, '100'), new TokenAmount(token1, '200')) + const pair_0_weth = new Pair(new TokenAmount(token0, '100'), new TokenAmount(weth, '100')) + const pair_1_weth = new Pair(new TokenAmount(token1, '175'), new TokenAmount(weth, '100')) + + it('constructs a path from the tokens', () => { + const route = new Route([pair_0_1], token0) + expect(route.pairs).toEqual([pair_0_1]) + expect(route.path).toEqual([token0, token1]) + expect(route.input).toEqual(token0) + expect(route.output).toEqual(token1) + expect(route.chainId).toEqual(ChainId.MAINNET) + }) + + it('can have a token as both input and output', () => { + const route = new Route([pair_0_weth, pair_0_1, pair_1_weth], weth) + expect(route.pairs).toEqual([pair_0_weth, pair_0_1, pair_1_weth]) + expect(route.input).toEqual(weth) + expect(route.output).toEqual(weth) + }) + + it('supports ether input', () => { + const route = new Route([pair_0_weth], ETHER) + expect(route.pairs).toEqual([pair_0_weth]) + expect(route.input).toEqual(ETHER) + expect(route.output).toEqual(token0) + }) + + it('supports ether output', () => { + const route = new Route([pair_0_weth], token0, ETHER) + expect(route.pairs).toEqual([pair_0_weth]) + expect(route.input).toEqual(token0) + expect(route.output).toEqual(ETHER) + }) +}) diff --git a/packages/pancake-swap-sdk/test/router.test.ts b/packages/pancake-swap-sdk/test/router.test.ts new file mode 100644 index 0000000..0b4caa5 --- /dev/null +++ b/packages/pancake-swap-sdk/test/router.test.ts @@ -0,0 +1,241 @@ +import invariant from 'tiny-invariant' +import { ChainId, CurrencyAmount, ETHER, Pair, Percent, Route, Router, Token, TokenAmount, Trade, WETH } from '../src' +import JSBI from 'jsbi' + +function checkDeadline(deadline: string[] | string): void { + expect(typeof deadline).toBe('string') + invariant(typeof deadline === 'string') + // less than 5 seconds on the deadline + expect(new Date().getTime() / 1000 - parseInt(deadline)).toBeLessThanOrEqual(5) +} + +describe('Router', () => { + const token0 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000001', 18, 't0') + const token1 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000002', 18, 't1') + + const pair_0_1 = new Pair(new TokenAmount(token0, JSBI.BigInt(1000)), new TokenAmount(token1, JSBI.BigInt(1000))) + + const pair_weth_0 = new Pair(new TokenAmount(WETH[ChainId.MAINNET], '1000'), new TokenAmount(token0, '1000')) + + describe('#swapCallParameters', () => { + describe('exact in', () => { + it('ether to token1', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_weth_0, pair_0_1], ETHER, token1), CurrencyAmount.ether(JSBI.BigInt(100))), + { ttl: 50, recipient: '0x0000000000000000000000000000000000000004', allowedSlippage: new Percent('1', '100') } + ) + expect(result.methodName).toEqual('swapExactETHForTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x51', + [WETH[ChainId.MAINNET].address, token0.address, token1.address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x64') + checkDeadline(result.args[result.args.length - 1]) + }) + + it('deadline specified', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_weth_0, pair_0_1], ETHER, token1), CurrencyAmount.ether(JSBI.BigInt(100))), + { + deadline: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100') + } + ) + expect(result.methodName).toEqual('swapExactETHForTokens') + expect(result.args).toEqual([ + '0x51', + [WETH[ChainId.MAINNET].address, token0.address, token1.address], + '0x0000000000000000000000000000000000000004', + '0x32' + ]) + expect(result.value).toEqual('0x64') + }) + + it('token1 to ether', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_0_1, pair_weth_0], token1, ETHER), new TokenAmount(token1, JSBI.BigInt(100))), + { ttl: 50, recipient: '0x0000000000000000000000000000000000000004', allowedSlippage: new Percent('1', '100') } + ) + expect(result.methodName).toEqual('swapExactTokensForETH') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + '0x51', + [token1.address, token0.address, WETH[ChainId.MAINNET].address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x0') + checkDeadline(result.args[result.args.length - 1]) + }) + it('token0 to token1', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_0_1], token0, token1), new TokenAmount(token0, JSBI.BigInt(100))), + { ttl: 50, recipient: '0x0000000000000000000000000000000000000004', allowedSlippage: new Percent('1', '100') } + ) + expect(result.methodName).toEqual('swapExactTokensForTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + '0x59', + [token0.address, token1.address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x0') + checkDeadline(result.args[result.args.length - 1]) + }) + }) + describe('exact out', () => { + it('ether to token1', () => { + const result = Router.swapCallParameters( + Trade.exactOut(new Route([pair_weth_0, pair_0_1], ETHER, token1), new TokenAmount(token1, JSBI.BigInt(100))), + { ttl: 50, recipient: '0x0000000000000000000000000000000000000004', allowedSlippage: new Percent('1', '100') } + ) + expect(result.methodName).toEqual('swapETHForExactTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + [WETH[ChainId.MAINNET].address, token0.address, token1.address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x80') + checkDeadline(result.args[result.args.length - 1]) + }) + it('token1 to ether', () => { + const result = Router.swapCallParameters( + Trade.exactOut(new Route([pair_0_1, pair_weth_0], token1, ETHER), CurrencyAmount.ether(JSBI.BigInt(100))), + { ttl: 50, recipient: '0x0000000000000000000000000000000000000004', allowedSlippage: new Percent('1', '100') } + ) + expect(result.methodName).toEqual('swapTokensForExactETH') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + '0x80', + [token1.address, token0.address, WETH[ChainId.MAINNET].address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x0') + checkDeadline(result.args[result.args.length - 1]) + }) + it('token0 to token1', () => { + const result = Router.swapCallParameters( + Trade.exactOut(new Route([pair_0_1], token0, token1), new TokenAmount(token1, JSBI.BigInt(100))), + { ttl: 50, recipient: '0x0000000000000000000000000000000000000004', allowedSlippage: new Percent('1', '100') } + ) + expect(result.methodName).toEqual('swapTokensForExactTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + '0x71', + [token0.address, token1.address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x0') + checkDeadline(result.args[result.args.length - 1]) + }) + }) + describe('supporting fee on transfer', () => { + describe('exact in', () => { + it('ether to token1', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_weth_0, pair_0_1], ETHER, token1), CurrencyAmount.ether(JSBI.BigInt(100))), + { + ttl: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100'), + feeOnTransfer: true + } + ) + expect(result.methodName).toEqual('swapExactETHForTokensSupportingFeeOnTransferTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x51', + [WETH[ChainId.MAINNET].address, token0.address, token1.address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x64') + checkDeadline(result.args[result.args.length - 1]) + }) + it('token1 to ether', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_0_1, pair_weth_0], token1, ETHER), new TokenAmount(token1, JSBI.BigInt(100))), + { + ttl: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100'), + feeOnTransfer: true + } + ) + expect(result.methodName).toEqual('swapExactTokensForETHSupportingFeeOnTransferTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + '0x51', + [token1.address, token0.address, WETH[ChainId.MAINNET].address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x0') + checkDeadline(result.args[result.args.length - 1]) + }) + it('token0 to token1', () => { + const result = Router.swapCallParameters( + Trade.exactIn(new Route([pair_0_1], token0, token1), new TokenAmount(token0, JSBI.BigInt(100))), + { + ttl: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100'), + feeOnTransfer: true + } + ) + expect(result.methodName).toEqual('swapExactTokensForTokensSupportingFeeOnTransferTokens') + expect(result.args.slice(0, -1)).toEqual([ + '0x64', + '0x59', + [token0.address, token1.address], + '0x0000000000000000000000000000000000000004' + ]) + expect(result.value).toEqual('0x0') + checkDeadline(result.args[result.args.length - 1]) + }) + }) + describe('exact out', () => { + it('ether to token1', () => { + expect(() => + Router.swapCallParameters( + Trade.exactOut( + new Route([pair_weth_0, pair_0_1], ETHER, token1), + new TokenAmount(token1, JSBI.BigInt(100)) + ), + { + ttl: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100'), + feeOnTransfer: true + } + ) + ).toThrow('EXACT_OUT_FOT') + }) + it('token1 to ether', () => { + expect(() => + Router.swapCallParameters( + Trade.exactOut(new Route([pair_0_1, pair_weth_0], token1, ETHER), CurrencyAmount.ether(JSBI.BigInt(100))), + { + ttl: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100'), + feeOnTransfer: true + } + ) + ).toThrow('EXACT_OUT_FOT') + }) + it('token0 to token1', () => { + expect(() => + Router.swapCallParameters( + Trade.exactOut(new Route([pair_0_1], token0, token1), new TokenAmount(token1, JSBI.BigInt(100))), + { + ttl: 50, + recipient: '0x0000000000000000000000000000000000000004', + allowedSlippage: new Percent('1', '100'), + feeOnTransfer: true + } + ) + ).toThrow('EXACT_OUT_FOT') + }) + }) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/test/token.test.ts b/packages/pancake-swap-sdk/test/token.test.ts new file mode 100644 index 0000000..a715296 --- /dev/null +++ b/packages/pancake-swap-sdk/test/token.test.ts @@ -0,0 +1,39 @@ +import { ChainId, Token } from '../src' + +describe('Token', () => { + const ADDRESS_ONE = '0x0000000000000000000000000000000000000001' + const ADDRESS_TWO = '0x0000000000000000000000000000000000000002' + + describe('#equals', () => { + it('fails if address differs', () => { + expect(new Token(ChainId.MAINNET, ADDRESS_ONE, 18).equals(new Token(ChainId.MAINNET, ADDRESS_TWO, 18))).toBe( + false + ) + }) + + it('false if chain id differs', () => { + expect(new Token(ChainId.TESTNET, ADDRESS_ONE, 18).equals(new Token(ChainId.MAINNET, ADDRESS_ONE, 18))).toBe( + false + ) + }) + + it('true if only decimals differs', () => { + expect(new Token(ChainId.MAINNET, ADDRESS_ONE, 9).equals(new Token(ChainId.MAINNET, ADDRESS_ONE, 18))).toBe(true) + }) + + it('true if address is the same', () => { + expect(new Token(ChainId.MAINNET, ADDRESS_ONE, 18).equals(new Token(ChainId.MAINNET, ADDRESS_ONE, 18))).toBe(true) + }) + + it('true on reference equality', () => { + const token = new Token(ChainId.MAINNET, ADDRESS_ONE, 18) + expect(token.equals(token)).toBe(true) + }) + + it('true even if name/symbol/decimals/projectLink differ', () => { + const tokenA = new Token(ChainId.MAINNET, ADDRESS_ONE, 9, 'abc', 'def', 'https://www.binance.org/') + const tokenB = new Token(ChainId.MAINNET, ADDRESS_ONE, 18, 'ghi', 'jkl', 'https://coinmarketcap.com/') + expect(tokenA.equals(tokenB)).toBe(true) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/test/trade.test.ts b/packages/pancake-swap-sdk/test/trade.test.ts new file mode 100644 index 0000000..5be9df6 --- /dev/null +++ b/packages/pancake-swap-sdk/test/trade.test.ts @@ -0,0 +1,404 @@ +import JSBI from 'jsbi' +import { + ChainId, + ETHER, + CurrencyAmount, + Pair, + Percent, + Route, + Token, + TokenAmount, + Trade, + TradeType, + WETH +} from '../src' + +describe('Trade', () => { + const token0 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000001', 18, 't0') + const token1 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000002', 18, 't1') + const token2 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000003', 18, 't2') + const token3 = new Token(ChainId.MAINNET, '0x0000000000000000000000000000000000000004', 18, 't3') + + const pair_0_1 = new Pair(new TokenAmount(token0, JSBI.BigInt(1000)), new TokenAmount(token1, JSBI.BigInt(1000))) + const pair_0_2 = new Pair(new TokenAmount(token0, JSBI.BigInt(1000)), new TokenAmount(token2, JSBI.BigInt(1100))) + const pair_0_3 = new Pair(new TokenAmount(token0, JSBI.BigInt(1000)), new TokenAmount(token3, JSBI.BigInt(900))) + const pair_1_2 = new Pair(new TokenAmount(token1, JSBI.BigInt(1200)), new TokenAmount(token2, JSBI.BigInt(1000))) + const pair_1_3 = new Pair(new TokenAmount(token1, JSBI.BigInt(1200)), new TokenAmount(token3, JSBI.BigInt(1300))) + + const pair_weth_0 = new Pair( + new TokenAmount(WETH[ChainId.MAINNET], JSBI.BigInt(1000)), + new TokenAmount(token0, JSBI.BigInt(1000)) + ) + + const empty_pair_0_1 = new Pair(new TokenAmount(token0, JSBI.BigInt(0)), new TokenAmount(token1, JSBI.BigInt(0))) + + it('can be constructed with ETHER as input', () => { + const trade = new Trade( + new Route([pair_weth_0], ETHER), + CurrencyAmount.ether(JSBI.BigInt(100)), + TradeType.EXACT_INPUT + ) + expect(trade.inputAmount.currency).toEqual(ETHER) + expect(trade.outputAmount.currency).toEqual(token0) + }) + it('can be constructed with ETHER as input for exact output', () => { + const trade = new Trade( + new Route([pair_weth_0], ETHER, token0), + new TokenAmount(token0, JSBI.BigInt(100)), + TradeType.EXACT_OUTPUT + ) + expect(trade.inputAmount.currency).toEqual(ETHER) + expect(trade.outputAmount.currency).toEqual(token0) + }) + + it('can be constructed with ETHER as output', () => { + const trade = new Trade( + new Route([pair_weth_0], token0, ETHER), + CurrencyAmount.ether(JSBI.BigInt(100)), + TradeType.EXACT_OUTPUT + ) + expect(trade.inputAmount.currency).toEqual(token0) + expect(trade.outputAmount.currency).toEqual(ETHER) + }) + it('can be constructed with ETHER as output for exact input', () => { + const trade = new Trade( + new Route([pair_weth_0], token0, ETHER), + new TokenAmount(token0, JSBI.BigInt(100)), + TradeType.EXACT_INPUT + ) + expect(trade.inputAmount.currency).toEqual(token0) + expect(trade.outputAmount.currency).toEqual(ETHER) + }) + + describe('#bestTradeExactIn', () => { + it('throws with empty pairs', () => { + expect(() => Trade.bestTradeExactIn([], new TokenAmount(token0, JSBI.BigInt(100)), token2)).toThrow('PAIRS') + }) + it('throws with max hops of 0', () => { + expect(() => + Trade.bestTradeExactIn([pair_0_2], new TokenAmount(token0, JSBI.BigInt(100)), token2, { maxHops: 0 }) + ).toThrow('MAX_HOPS') + }) + + it('provides best route', () => { + const result = Trade.bestTradeExactIn( + [pair_0_1, pair_0_2, pair_1_2], + new TokenAmount(token0, JSBI.BigInt(100)), + token2 + ) + expect(result).toHaveLength(2) + expect(result[0].route.pairs).toHaveLength(1) // 0 -> 2 at 10:11 + expect(result[0].route.path).toEqual([token0, token2]) + expect(result[0].inputAmount).toEqual(new TokenAmount(token0, JSBI.BigInt(100))) + expect(result[0].outputAmount).toEqual(new TokenAmount(token2, JSBI.BigInt(99))) + expect(result[1].route.pairs).toHaveLength(2) // 0 -> 1 -> 2 at 12:12:10 + expect(result[1].route.path).toEqual([token0, token1, token2]) + expect(result[1].inputAmount).toEqual(new TokenAmount(token0, JSBI.BigInt(100))) + expect(result[1].outputAmount).toEqual(new TokenAmount(token2, JSBI.BigInt(69))) + }) + + it('doesnt throw for zero liquidity pairs', () => { + expect(Trade.bestTradeExactIn([empty_pair_0_1], new TokenAmount(token0, JSBI.BigInt(100)), token1)).toHaveLength( + 0 + ) + }) + + it('respects maxHops', () => { + const result = Trade.bestTradeExactIn( + [pair_0_1, pair_0_2, pair_1_2], + new TokenAmount(token0, JSBI.BigInt(10)), + token2, + { maxHops: 1 } + ) + expect(result).toHaveLength(1) + expect(result[0].route.pairs).toHaveLength(1) // 0 -> 2 at 10:11 + expect(result[0].route.path).toEqual([token0, token2]) + }) + + it('insufficient input for one pair', () => { + const result = Trade.bestTradeExactIn( + [pair_0_1, pair_0_2, pair_1_2], + new TokenAmount(token0, JSBI.BigInt(1)), + token2 + ) + expect(result).toHaveLength(1) + expect(result[0].route.pairs).toHaveLength(1) // 0 -> 2 at 10:11 + expect(result[0].route.path).toEqual([token0, token2]) + expect(result[0].outputAmount).toEqual(new TokenAmount(token2, JSBI.BigInt(1))) + }) + + it('respects n', () => { + const result = Trade.bestTradeExactIn( + [pair_0_1, pair_0_2, pair_1_2], + new TokenAmount(token0, JSBI.BigInt(10)), + token2, + { maxNumResults: 1 } + ) + + expect(result).toHaveLength(1) + }) + + it('no path', () => { + const result = Trade.bestTradeExactIn( + [pair_0_1, pair_0_3, pair_1_3], + new TokenAmount(token0, JSBI.BigInt(10)), + token2 + ) + expect(result).toHaveLength(0) + }) + + it('works for ETHER currency input', () => { + const result = Trade.bestTradeExactIn( + [pair_weth_0, pair_0_1, pair_0_3, pair_1_3], + CurrencyAmount.ether(JSBI.BigInt(100)), + token3 + ) + expect(result).toHaveLength(2) + expect(result[0].inputAmount.currency).toEqual(ETHER) + expect(result[0].route.path).toEqual([WETH[ChainId.MAINNET], token0, token1, token3]) + expect(result[0].outputAmount.currency).toEqual(token3) + expect(result[1].inputAmount.currency).toEqual(ETHER) + expect(result[1].route.path).toEqual([WETH[ChainId.MAINNET], token0, token3]) + expect(result[1].outputAmount.currency).toEqual(token3) + }) + it('works for ETHER currency output', () => { + const result = Trade.bestTradeExactIn( + [pair_weth_0, pair_0_1, pair_0_3, pair_1_3], + new TokenAmount(token3, JSBI.BigInt(100)), + ETHER + ) + expect(result).toHaveLength(2) + expect(result[0].inputAmount.currency).toEqual(token3) + expect(result[0].route.path).toEqual([token3, token0, WETH[ChainId.MAINNET]]) + expect(result[0].outputAmount.currency).toEqual(ETHER) + expect(result[1].inputAmount.currency).toEqual(token3) + expect(result[1].route.path).toEqual([token3, token1, token0, WETH[ChainId.MAINNET]]) + expect(result[1].outputAmount.currency).toEqual(ETHER) + }) + }) + + describe('#maximumAmountIn', () => { + describe('tradeType = EXACT_INPUT', () => { + const exactIn = new Trade( + new Route([pair_0_1, pair_1_2], token0), + new TokenAmount(token0, JSBI.BigInt(100)), + TradeType.EXACT_INPUT + ) + it('throws if less than 0', () => { + expect(() => exactIn.maximumAmountIn(new Percent(JSBI.BigInt(-1), JSBI.BigInt(100)))).toThrow( + 'SLIPPAGE_TOLERANCE' + ) + }) + it('returns exact if 0', () => { + expect(exactIn.maximumAmountIn(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual(exactIn.inputAmount) + }) + it('returns exact if nonzero', () => { + expect(exactIn.maximumAmountIn(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token0, JSBI.BigInt(100)) + ) + expect(exactIn.maximumAmountIn(new Percent(JSBI.BigInt(5), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token0, JSBI.BigInt(100)) + ) + expect(exactIn.maximumAmountIn(new Percent(JSBI.BigInt(200), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token0, JSBI.BigInt(100)) + ) + }) + }) + describe('tradeType = EXACT_OUTPUT', () => { + const exactOut = new Trade( + new Route([pair_0_1, pair_1_2], token0), + new TokenAmount(token2, JSBI.BigInt(100)), + TradeType.EXACT_OUTPUT + ) + + it('throws if less than 0', () => { + expect(() => exactOut.maximumAmountIn(new Percent(JSBI.BigInt(-1), JSBI.BigInt(100)))).toThrow( + 'SLIPPAGE_TOLERANCE' + ) + }) + it('returns exact if 0', () => { + expect(exactOut.maximumAmountIn(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual(exactOut.inputAmount) + }) + it('returns slippage amount if nonzero', () => { + expect(exactOut.maximumAmountIn(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token0, JSBI.BigInt(156)) + ) + expect(exactOut.maximumAmountIn(new Percent(JSBI.BigInt(5), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token0, JSBI.BigInt(163)) + ) + expect(exactOut.maximumAmountIn(new Percent(JSBI.BigInt(200), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token0, JSBI.BigInt(468)) + ) + }) + }) + }) + + describe('#minimumAmountOut', () => { + describe('tradeType = EXACT_INPUT', () => { + const exactIn = new Trade( + new Route([pair_0_1, pair_1_2], token0), + new TokenAmount(token0, JSBI.BigInt(100)), + TradeType.EXACT_INPUT + ) + it('throws if less than 0', () => { + expect(() => exactIn.minimumAmountOut(new Percent(JSBI.BigInt(-1), JSBI.BigInt(100)))).toThrow( + 'SLIPPAGE_TOLERANCE' + ) + }) + it('returns exact if 0', () => { + expect(exactIn.minimumAmountOut(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual(exactIn.outputAmount) + }) + it('returns exact if nonzero', () => { + expect(exactIn.minimumAmountOut(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token2, JSBI.BigInt(69)) + ) + expect(exactIn.minimumAmountOut(new Percent(JSBI.BigInt(5), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token2, JSBI.BigInt(65)) + ) + expect(exactIn.minimumAmountOut(new Percent(JSBI.BigInt(200), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token2, JSBI.BigInt(23)) + ) + }) + }) + describe('tradeType = EXACT_OUTPUT', () => { + const exactOut = new Trade( + new Route([pair_0_1, pair_1_2], token0), + new TokenAmount(token2, JSBI.BigInt(100)), + TradeType.EXACT_OUTPUT + ) + + it('throws if less than 0', () => { + expect(() => exactOut.minimumAmountOut(new Percent(JSBI.BigInt(-1), JSBI.BigInt(100)))).toThrow( + 'SLIPPAGE_TOLERANCE' + ) + }) + it('returns exact if 0', () => { + expect(exactOut.minimumAmountOut(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual(exactOut.outputAmount) + }) + it('returns slippage amount if nonzero', () => { + expect(exactOut.minimumAmountOut(new Percent(JSBI.BigInt(0), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token2, JSBI.BigInt(100)) + ) + expect(exactOut.minimumAmountOut(new Percent(JSBI.BigInt(5), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token2, JSBI.BigInt(100)) + ) + expect(exactOut.minimumAmountOut(new Percent(JSBI.BigInt(200), JSBI.BigInt(100)))).toEqual( + new TokenAmount(token2, JSBI.BigInt(100)) + ) + }) + }) + }) + + describe('#bestTradeExactOut', () => { + it('throws with empty pairs', () => { + expect(() => Trade.bestTradeExactOut([], token0, new TokenAmount(token2, JSBI.BigInt(100)))).toThrow('PAIRS') + }) + it('throws with max hops of 0', () => { + expect(() => + Trade.bestTradeExactOut([pair_0_2], token0, new TokenAmount(token2, JSBI.BigInt(100)), { maxHops: 0 }) + ).toThrow('MAX_HOPS') + }) + + it('provides best route', () => { + const result = Trade.bestTradeExactOut( + [pair_0_1, pair_0_2, pair_1_2], + token0, + new TokenAmount(token2, JSBI.BigInt(100)) + ) + expect(result).toHaveLength(2) + expect(result[0].route.pairs).toHaveLength(1) // 0 -> 2 at 10:11 + expect(result[0].route.path).toEqual([token0, token2]) + expect(result[0].inputAmount).toEqual(new TokenAmount(token0, JSBI.BigInt(101))) + expect(result[0].outputAmount).toEqual(new TokenAmount(token2, JSBI.BigInt(100))) + expect(result[1].route.pairs).toHaveLength(2) // 0 -> 1 -> 2 at 12:12:10 + expect(result[1].route.path).toEqual([token0, token1, token2]) + expect(result[1].inputAmount).toEqual(new TokenAmount(token0, JSBI.BigInt(156))) + expect(result[1].outputAmount).toEqual(new TokenAmount(token2, JSBI.BigInt(100))) + }) + + it('doesnt throw for zero liquidity pairs', () => { + expect(Trade.bestTradeExactOut([empty_pair_0_1], token1, new TokenAmount(token1, JSBI.BigInt(100)))).toHaveLength( + 0 + ) + }) + + it('respects maxHops', () => { + const result = Trade.bestTradeExactOut( + [pair_0_1, pair_0_2, pair_1_2], + token0, + new TokenAmount(token2, JSBI.BigInt(10)), + { maxHops: 1 } + ) + expect(result).toHaveLength(1) + expect(result[0].route.pairs).toHaveLength(1) // 0 -> 2 at 10:11 + expect(result[0].route.path).toEqual([token0, token2]) + }) + + it('insufficient liquidity', () => { + const result = Trade.bestTradeExactOut( + [pair_0_1, pair_0_2, pair_1_2], + token0, + new TokenAmount(token2, JSBI.BigInt(1200)) + ) + expect(result).toHaveLength(0) + }) + + it('insufficient liquidity in one pair but not the other', () => { + const result = Trade.bestTradeExactOut( + [pair_0_1, pair_0_2, pair_1_2], + token0, + new TokenAmount(token2, JSBI.BigInt(1050)) + ) + expect(result).toHaveLength(1) + }) + + it('respects n', () => { + const result = Trade.bestTradeExactOut( + [pair_0_1, pair_0_2, pair_1_2], + token0, + new TokenAmount(token2, JSBI.BigInt(10)), + { maxNumResults: 1 } + ) + + expect(result).toHaveLength(1) + }) + + it('no path', () => { + const result = Trade.bestTradeExactOut( + [pair_0_1, pair_0_3, pair_1_3], + token0, + new TokenAmount(token2, JSBI.BigInt(10)) + ) + expect(result).toHaveLength(0) + }) + + it('works for ETHER currency input', () => { + const result = Trade.bestTradeExactOut( + [pair_weth_0, pair_0_1, pair_0_3, pair_1_3], + ETHER, + new TokenAmount(token3, JSBI.BigInt(100)) + ) + expect(result).toHaveLength(2) + expect(result[0].inputAmount.currency).toEqual(ETHER) + expect(result[0].route.path).toEqual([WETH[ChainId.MAINNET], token0, token1, token3]) + expect(result[0].outputAmount.currency).toEqual(token3) + expect(result[1].inputAmount.currency).toEqual(ETHER) + expect(result[1].route.path).toEqual([WETH[ChainId.MAINNET], token0, token3]) + expect(result[1].outputAmount.currency).toEqual(token3) + }) + it('works for ETHER currency output', () => { + const result = Trade.bestTradeExactOut( + [pair_weth_0, pair_0_1, pair_0_3, pair_1_3], + token3, + CurrencyAmount.ether(JSBI.BigInt(100)) + ) + expect(result).toHaveLength(2) + expect(result[0].inputAmount.currency).toEqual(token3) + expect(result[0].route.path).toEqual([token3, token0, WETH[ChainId.MAINNET]]) + expect(result[0].outputAmount.currency).toEqual(ETHER) + expect(result[1].inputAmount.currency).toEqual(token3) + expect(result[1].route.path).toEqual([token3, token1, token0, WETH[ChainId.MAINNET]]) + expect(result[1].outputAmount.currency).toEqual(ETHER) + }) + }) +}) diff --git a/packages/pancake-swap-sdk/tsconfig.json b/packages/pancake-swap-sdk/tsconfig.json new file mode 100644 index 0000000..1a6d420 --- /dev/null +++ b/packages/pancake-swap-sdk/tsconfig.json @@ -0,0 +1,29 @@ +{ + "include": ["src", "test"], + "compilerOptions": { + "target": "es2018", + "module": "esnext", + "importHelpers": true, + "declaration": true, + "sourceMap": true, + "rootDir": "./", + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "baseUrl": "./", + "paths": { + "*": ["src/*", "node_modules/*"] + }, + "esModuleInterop": true, + "resolveJsonModule": true + } +} diff --git a/packages/pancake-swap-sdk/yarn.lock b/packages/pancake-swap-sdk/yarn.lock new file mode 100644 index 0000000..472f5e9 --- /dev/null +++ b/packages/pancake-swap-sdk/yarn.lock @@ -0,0 +1,6713 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.5.tgz#d38425e67ea96b1480a3f50404d1bf85676301a6" + integrity sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.4.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330" + integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.5" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.10.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.5" + "@babel/types" "^7.10.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.5", "@babel/generator@^7.4.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" + integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== + dependencies: + "@babel/types" "^7.10.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== + dependencies: + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== + dependencies: + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee" + integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA== + dependencies: + "@babel/types" "^7.10.5" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6" + integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== + dependencies: + lodash "^4.17.19" + +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.10.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" + integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== + +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.7.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz#50129ac216b9a6a55b3853fdd923e74bf553a4c0" + integrity sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.10.4", "@babel/plugin-proposal-optional-chaining@^7.7.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7" + integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + +"@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d" + integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== + dependencies: + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + +"@babel/plugin-transform-parameters@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.4.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-runtime@^7.6.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.5.tgz#3b39b7b24830e0c2d8ff7a4489fe5cf99fbace86" + integrity sha512-tV4V/FjElJ9lQtyjr5xD2IFFbgY46r7EeVu5a8CpEKT5laheHKSlFeHjpkPppW3PqzGLAuv5k2qZX5LgVZIX5w== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz#4e2c85ea0d6abaee1b24dcfbbae426fe8d674cff" + integrity sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/polyfill@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.4.tgz#915e5bfe61490ac0199008e35ca9d7d151a8e45a" + integrity sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + +"@babel/preset-env@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f" + integrity sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw== + dependencies: + "@babel/compat-data" "^7.10.4" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.10.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.10.4" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.10.4" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.4" + browserslist "^4.12.0" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime-corejs3@^7.10.2": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz#a57fe6c13045ca33768a2aa527ead795146febe1" + integrity sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.4.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" + integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.5" + "@babel/types" "^7.10.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" + integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@ethersproject/abi@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.2.tgz#7fe8f080aa1483fe32cd27bb5b8f2019266af1e2" + integrity sha512-Z+5f7xOgtRLu/W2l9Ry5xF7ehh9QVQ0m1vhynmTcS7DMfHgqTd1/PDFC62aw91ZPRCRZsYdZJu8ymokC5e1JSw== + dependencies: + "@ethersproject/address" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/constants" "^5.0.0" + "@ethersproject/hash" "^5.0.0" + "@ethersproject/keccak256" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + "@ethersproject/strings" "^5.0.0" + +"@ethersproject/abstract-provider@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.2.tgz#9b4e8f4870f0691463e8d5b092c95dd5275c635d" + integrity sha512-U1s60+nG02x8FKNMoVNI6MG8SguWCoG9HJtwOqWZ38LBRMsDV4c0w4izKx98kcsN3wXw4U2/YAyJ9LlH7+/hkg== + dependencies: + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/networks" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + "@ethersproject/transactions" "^5.0.0" + "@ethersproject/web" "^5.0.0" + +"@ethersproject/abstract-signer@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.2.tgz#5776f888fda816de1d08ddb0e74778ecb9590f69" + integrity sha512-CzzXbeqKlgayE4YTnvvreGBG3n+HxakGXrxaGM6LjBZnOOIVSYi6HMFG8ZXls7UspRY4hvMrtnKEJKDCOngSBw== + dependencies: + "@ethersproject/abstract-provider" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + +"@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.2.tgz#80d0ddfb7d4bd0d32657747fa4bdd2defef2e00a" + integrity sha512-+rz26RKj7ujGfQynys4V9VJRbR+wpC6eL8F22q3raWMH3152Ha31GwJPWzxE/bEA+43M/zTNVwY0R53gn53L2Q== + dependencies: + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/keccak256" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/rlp" "^5.0.0" + bn.js "^4.4.0" + +"@ethersproject/base64@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.2.tgz#48b3bb8d640a963bd8ee196cfeacd592155a0ca8" + integrity sha512-0FE5RH5cUDddOiQEDpWtyHjkSW4D5/rdJzA3KTZo8Fk5ab/Y8vdzqbamsXPyPsXU3gS+zCE5Qq4EKVOWlWLLTA== + dependencies: + "@ethersproject/bytes" "^5.0.0" + +"@ethersproject/bignumber@^5.0.0": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.5.tgz#31bd7e75aad46ace345fae69b1f5bb120906af1b" + integrity sha512-24ln7PV0g8ZzjcVZiLW9Wod0i+XCmK6zKkAaxw5enraTIT1p7gVOcSXFSzNQ9WYAwtiFQPvvA+TIO2oEITZNJA== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + bn.js "^4.4.0" + +"@ethersproject/bytes@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.3.tgz#b3769963ae0188a35713d343890a903bda20af9c" + integrity sha512-AyPMAlY+Amaw4Zfp8OAivm1xYPI8mqiUYmEnSUk1CnS2NrQGHEMmFJFiOJdS3gDDpgSOFhWIjZwxKq2VZpqNTA== + dependencies: + "@ethersproject/logger" "^5.0.0" + +"@ethersproject/constants@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.2.tgz#f7ac0b320e2bbec1a5950da075015f8bc4e8fed1" + integrity sha512-nNoVlNP6bgpog7pQ2EyD1xjlaXcy1Cl4kK5v1KoskHj58EtB6TK8M8AFGi3GgHTdMldfT4eN3OsoQ/CdOTVNFA== + dependencies: + "@ethersproject/bignumber" "^5.0.0" + +"@ethersproject/contracts@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.2.tgz#f19ed8335ceeb6abb60f5d45641f0a2a62b6fbc5" + integrity sha512-Ud3oW8mBNIWE+WHRjvwVEwfvshn7lfYWSSKG0fPSb6baRN9mLOoNguX+VIv3W5Sne9w2utnBmxLF2ESXitw64A== + dependencies: + "@ethersproject/abi" "^5.0.0" + "@ethersproject/abstract-provider" "^5.0.0" + "@ethersproject/abstract-signer" "^5.0.0" + "@ethersproject/address" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/constants" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + +"@ethersproject/hash@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.2.tgz#6d69558786961836d530b8b4a8714eac5388aec7" + integrity sha512-dWGvNwmVRX2bxoQQ3ciMw46Vzl1nqfL+5R8+2ZxsRXD3Cjgw1dL2mdjJF7xMMWPvPdrlhKXWSK0gb8VLwHZ8Cw== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/keccak256" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/strings" "^5.0.0" + +"@ethersproject/keccak256@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.2.tgz#7ed4a95bb45ee502cf4532223833740a83602797" + integrity sha512-MbroXutc0gPNYIrUjS4Aw0lDuXabdzI7+l7elRWr1G6G+W0v00e/3gbikWkCReGtt2Jnt4lQSgnflhDwQGcIhA== + dependencies: + "@ethersproject/bytes" "^5.0.0" + js-sha3 "0.5.7" + +"@ethersproject/logger@^5.0.0": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.4.tgz#09fa4765b5691233e3afb6617cb38a700f9dd2e4" + integrity sha512-alA2LiAy1LdQ/L1SA9ajUC7MvGAEQLsICEfKK4erX5qhkXE1LwLSPIzobtOWFsMHf2yrXGKBLnnpuVHprI3sAw== + +"@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.2.tgz#a49e82cf071e3618e87e3c5d69fdbcf54dc6766c" + integrity sha512-T7HVd62D4izNU2tDHf6xUDo7k4JOGX4Lk7vDmVcDKrepSWwL2OmGWrqSlkRe2a1Dnz4+1VPE6fb6+KsmSRe82g== + dependencies: + "@ethersproject/logger" "^5.0.0" + +"@ethersproject/properties@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.2.tgz#2facb62d2f2d968c7b3d0befa5bcc884cc565d3b" + integrity sha512-FxAisPGAOACQjMJzewl9OJG6lsGCPTm5vpUMtfeoxzAlAb2lv+kHzQPUh9h4jfAILzE8AR1jgXMzRmlhwyra1Q== + dependencies: + "@ethersproject/logger" "^5.0.0" + +"@ethersproject/providers@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.5.tgz#fa28498ce9683d1d99f6cb11e1a7fe8d4886e0ce" + integrity sha512-ZR3yFg/m8qDl7317yXOHE7tKeGfoyZIZ/imhVC4JqAH+SX1rb6bdZcSjhJfet7rLmnJSsnYLTgIiVIT85aVLgg== + dependencies: + "@ethersproject/abstract-provider" "^5.0.0" + "@ethersproject/abstract-signer" "^5.0.0" + "@ethersproject/address" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/constants" "^5.0.0" + "@ethersproject/hash" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/networks" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + "@ethersproject/random" "^5.0.0" + "@ethersproject/rlp" "^5.0.0" + "@ethersproject/strings" "^5.0.0" + "@ethersproject/transactions" "^5.0.0" + "@ethersproject/web" "^5.0.0" + ws "7.2.3" + +"@ethersproject/random@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.2.tgz#bb58aca69a85e8de506686117f050d03dac69023" + integrity sha512-kLeS+6bwz37WR2zbe69gudyoGVoUzljQO0LhifnATsZ7rW0JZ9Zgt0h5aXY7tqFDo9TvdqeCwUFdp1t3T5Fkhg== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + +"@ethersproject/rlp@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.2.tgz#d6b550a2ac5e484f15f0f63337e522004d2e78cd" + integrity sha512-oE0M5jqQ67fi2SuMcrpoewOpEuoXaD8M9JeR9md1bXRMvDYgKXUtDHs22oevpEOdnO2DPIRabp6MVHa4aDuWmw== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + +"@ethersproject/sha2@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.2.tgz#baefc78c071be8729b180759eb29267129314252" + integrity sha512-VFl4qSStjQZaygpqoAHswaCY59qBm1Sm0rf8iv0tmgVsRf0pBg2nJaNf9NXXvcuJ9AYPyXl57dN8kozdC4z5Cg== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + hash.js "1.1.3" + +"@ethersproject/signing-key@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.3.tgz#adb84360e147bfd336cb2fe114100120732dc10a" + integrity sha512-5QPZaBRGCLzfVMbFb3LcVjNR0UbTXnwDHASnQYfbzwUOnFYHKxHsrcbl/5ONGoppgi8yXgOocKqlPCFycJJVWQ== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + elliptic "6.5.3" + +"@ethersproject/solidity@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.2.tgz#431cee341ec51e022bd897b93fef04521f414756" + integrity sha512-RygurUe1hPW1LDYAPXy4471AklGWNnxgFWc3YUE6H11gzkit26jr6AyZH4Yyjw38eBBL6j0AOfQzMWm+NhxZ9g== + dependencies: + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/keccak256" "^5.0.0" + "@ethersproject/sha2" "^5.0.0" + "@ethersproject/strings" "^5.0.0" + +"@ethersproject/strings@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.2.tgz#1753408c3c889813fd0992abd76393e3e47a2619" + integrity sha512-oNa+xvSqsFU96ndzog0IBTtsRFGOqGpzrXJ7shXLBT7juVeSEyZA/sYs0DMZB5mJ9FEjHdZKxR/rTyBY91vuXg== + dependencies: + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/constants" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + +"@ethersproject/transactions@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.2.tgz#590ede71fc87b45be7bd46002e18ae52246a2347" + integrity sha512-jZp0ZbbJlq4JLZY6qoMzNtp2HQsX6USQposi3ns0MPUdn3OdZJBDtrcO15r/2VS5t/K1e1GE5MI1HmMKlcTbbQ== + dependencies: + "@ethersproject/address" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/constants" "^5.0.0" + "@ethersproject/keccak256" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + "@ethersproject/rlp" "^5.0.0" + "@ethersproject/signing-key" "^5.0.0" + +"@ethersproject/web@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.2.tgz#6565b4c4fe2f56de9556d0e9a966c4ccc1b7b7da" + integrity sha512-uAlcxdrAWB9PXZlb5NPzbOOt5/m9EJP2c6eLw15/PXPkNNohEIKvdXXOWdcQgTjZ0pcAaD/9mnJ6HXg7NbqXiw== + dependencies: + "@ethersproject/base64" "^5.0.0" + "@ethersproject/logger" "^5.0.0" + "@ethersproject/properties" "^5.0.0" + "@ethersproject/strings" "^5.0.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@rollup/plugin-commonjs@^11.0.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz#60636c7a722f54b41e419e1709df05c7234557ef" + integrity sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA== + dependencies: + "@rollup/pluginutils" "^3.0.8" + commondir "^1.0.1" + estree-walker "^1.0.1" + glob "^7.1.2" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.11.0" + +"@rollup/plugin-json@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz#0d2909f4bf606ae34d43a9bc8be06a9b0c850cf0" + integrity sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA== + dependencies: + "@rollup/pluginutils" "^3.0.0" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.11.1" + +"@rollup/plugin-replace@^2.2.1": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz#cd6bae39444de119f5d905322b91ebd4078562e7" + integrity sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ== + dependencies: + "@rollup/pluginutils" "^3.0.8" + magic-string "^0.25.5" + +"@rollup/pluginutils@^3.0.0", "@rollup/pluginutils@^3.0.8": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@types/babel__core@^7.1.0": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" + integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== + dependencies: + "@babel/types" "^7.3.0" + +"@types/big.js@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-4.0.5.tgz#62c61697646269e39191f24e55e8272f05f21fc0" + integrity sha512-D9KFrAt05FDSqLo7PU9TDHfDgkarlwdkuwFsg7Zm4xl62tTNaz+zN+Tkcdx2wGLBbSMf8BnoMhOVeUGUaJfLKg== + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/estree@*": + version "0.0.45" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" + integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/glob@*": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest@^24.0.25": + version "24.9.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" + integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== + dependencies: + jest-diff "^24.3.0" + +"@types/json-schema@^7.0.3": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.14.tgz#33b9b94f789a8fedd30a68efdbca4dbb06b61f20" + integrity sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/rimraf@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" + integrity sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q== + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/shelljs@^0.8.5": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.8.tgz#e439c69929b88a2c8123c1a55e09eb708315addf" + integrity sha512-lD3LWdg6j8r0VRBFahJVaxoW0SIcswxKaFUrmKl33RJVeeoNYQAz4uqCJ5Z6v4oIBOsC5GozX+I5SorIKiTcQA== + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^13.0.0": + version "13.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" + integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.12.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^2.12.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.0, acorn@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +array.prototype.flatmap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" + integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + 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" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +asyncro@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/asyncro/-/asyncro-3.0.0.tgz#3c7a732e263bc4a42499042f48d7d858e9c0134e" + integrity sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + +axe-core@^3.5.4: + version "3.5.5" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.5.tgz#84315073b53fa3c0c51676c588d59da09a192227" + integrity sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q== + +axobject-query@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@^10.0.3: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-annotate-pure-calls@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-annotate-pure-calls/-/babel-plugin-annotate-pure-calls-0.4.0.tgz#78aa00fd878c4fcde4d49f3da397fcf5defbcce8" + integrity sha512-oi4M/PWUJOU9ZyRGoPTfPMqdyMp06jbJAomd3RcyYuzUtBOddv98BqLm96Lucpi2QFoQHkdGQt0ACvw7VzVEQA== + +babel-plugin-dev-expression@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.2.tgz#c18de18a06150f9480edd151acbb01d2e65e999b" + integrity sha512-y32lfBif+c2FIh5dwGfcc/IfX5aw/Bru7Du7W2n17sJE/GJGAsmIk5DPW/8JOoeKpXW5evJfJOvRq5xkiS6vng== + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^2.6.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-transform-async-to-promises@^0.8.14: + version "0.8.15" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.15.tgz#13b6d8ef13676b4e3c576d3600b85344bb1ba346" + integrity sha512-fDXP68ZqcinZO2WCiimCL9zhGjGXOnn3D33zvbh+yheZ/qOrNVVDDIBtAaM3Faz8TRvQzHiRKsu3hfrBAhEncQ== + +babel-plugin-transform-jsbi-to-bigint@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-jsbi-to-bigint/-/babel-plugin-transform-jsbi-to-bigint-1.3.1.tgz#46af5c4446bbe931572a438d9d5a5e73ae9b2c3c" + integrity sha512-X6rGczRam63X+hLIPpDj0lmTOtRqF4hdkJDiFRfvlr8BgOwIXvz02yb5QMa8uSM2kAwMbFXsv9d6GEViufGdxw== + +babel-plugin-transform-rename-import@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-rename-import/-/babel-plugin-transform-rename-import-2.3.0.tgz#5d9d645f937b0ca5c26a24b2510a06277b6ffd9b" + integrity sha512-dPgJoT57XC0PqSnLgl2FwNvxFrWlspatX2dkk7yjKQj5HHGw071vAcOf+hqW8ClqcBDMvEbm6mevn5yHAD8mlQ== + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserslist@^4.12.0, browserslist@^4.8.5: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@1.x, buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +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" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001286: + version "1.0.30001304" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz#38af55ed3fc8220cb13e35e6e7309c8c65a05559" + integrity sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar-cli@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/chokidar-cli/-/chokidar-cli-1.2.3.tgz#28fe28da1c3a12b444f52ddbe8a472358a32279f" + integrity sha512-HcHjqeQaT/u0Swy4eaqqg0NhPjsXq6ZN9YzP48EYc81FXBLQuvMXBsrEMDkgH+Puup1mBc0gD0qqECDy/WiMOA== + dependencies: + bluebird "3.5.5" + chokidar "2.1.5" + lodash "4.17.15" + yargs "13.3.0" + +chokidar@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + +cli-spinners@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" + integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +confusing-browser-globals@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== + +core-js@^2.4.0, core-js@^2.6.5: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cross-env@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +damerau-levenshtein@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js-light@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.0.tgz#ca7faf504c799326df94b0ab920424fdfc125348" + integrity sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +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" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +electron-to-chromium@^1.4.17: + version "1.4.59" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz#657f2588c048fb95975779f8fea101fad854de89" + integrity sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg== + +elliptic@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" + integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.9.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^6.0.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" + integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== + dependencies: + get-stdin "^6.0.0" + +eslint-config-react-app@^5.0.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ== + dependencies: + confusing-browser-globals "^1.0.9" + +eslint-import-resolver-node@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz#e241ebd39c0ce519345a3f074ec1ebde4cf80f2c" + integrity sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw== + dependencies: + lodash "^4.17.15" + +eslint-plugin-import@^2.18.2: + version "2.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" + integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jsx-a11y@^6.2.3: + version "6.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz#99ef7e97f567cc6a5b8dd5ab95a94a67058a2660" + integrity sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g== + dependencies: + "@babel/runtime" "^7.10.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^3.5.4" + axobject-query "^2.1.2" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1" + language-tags "^1.0.5" + +eslint-plugin-prettier@^3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" + integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0" + integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== + +eslint-plugin-react@^7.14.3: + version "7.20.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz#0590525e7eb83890ce71f73c2cf836284ad8c2f1" + integrity sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg== + dependencies: + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.17.0" + string.prototype.matchall "^4.0.2" + +eslint-scope@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^6.1.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.2.0.tgz#18326b79c7ab7fbd6610fd900c1b9e95fa48f90a" + integrity sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-extra@8.1.0, fs-extra@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +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: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globalyzer@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" + integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== + +globrex@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +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-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash.js@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +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== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +humanize-duration@^3.15.3: + version "3.23.1" + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.23.1.tgz#59cb8d01287479c1aa7cd5b1efc260d799bef89b" + integrity sha512-aoOEkomAETmVuQyBx4E7/LfPlC9s8pAA/USl7vFRQpDjepo3aiyvFfOhtXSDqPowdBVPFUZ7onG/KyuolX0qPg== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0, import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "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-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-reference@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + dependencies: + has-symbols "^1.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +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= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.3.0, jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watch-typeahead@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.1" + jest-regex-util "^24.9.0" + jest-watcher "^24.3.0" + slash "^3.0.0" + string-length "^3.1.0" + strip-ansi "^5.0.0" + +jest-watcher@^24.3.0, jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@^24.8.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +jpjs@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jpjs/-/jpjs-1.2.1.tgz#f343833de8838a5beba1f42d5a219be0114c44b7" + integrity sha512-GxJWybWU4NV0RNKi6EIqk6IRPOTqd/h+U7sbtyuD7yUISUzV78LdHnq2xkevJsTlz/EImux4sWj+wfMiwKLkiw== + +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-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbi@^3.1.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" + integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@2.x, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +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" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== + dependencies: + array-includes "^3.1.1" + object.assign "^4.1.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" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +language-subtag-registry@~0.3.2: + version "0.3.20" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755" + integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +loose-envify@^1.0.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +magic-string@^0.25.2, magic-string@^0.25.5: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +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" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.x, mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mri@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6" + integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +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" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.0.7: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +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= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-inspect@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" + integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +pascal-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress-estimator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/progress-estimator/-/progress-estimator-0.2.2.tgz#1c3947a5782ea56e40c8fccc290ac7ceeb1b91cb" + integrity sha512-GF76Ac02MTJD6o2nMNtmtOFjwWCnHcvXyn5HOWPQnEMO8OTLw7LAvNmrwe8LmdsB+eZhwUu9fX/c9iQnBxWaFA== + dependencies: + chalk "^2.4.1" + cli-spinners "^1.3.1" + humanize-duration "^3.15.3" + log-update "^2.3.0" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + +prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +react-is@^16.8.1, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +resolve@1.x, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6: + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== + dependencies: + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-babel@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-sourcemaps@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz#62125aa94087aadf7b83ef4dfaf629b473135e87" + integrity sha1-YhJaqUCHqt97g+9N+vYptHMTXoc= + dependencies: + rollup-pluginutils "^2.0.1" + source-map-resolve "^0.5.0" + +rollup-plugin-terser@^5.1.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz#9c0dd33d5771df9630cd027d6a2559187f65885e" + integrity sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g== + dependencies: + "@babel/code-frame" "^7.5.5" + jest-worker "^24.9.0" + rollup-pluginutils "^2.8.2" + serialize-javascript "^2.1.2" + terser "^4.6.2" + +rollup-plugin-typescript2@^0.25.3: + version "0.25.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.25.3.tgz#a5fb2f0f85488789334ce540abe6c7011cbdf40f" + integrity sha512-ADkSaidKBovJmf5VBnZBZe+WzaZwofuvYdzGAKTN/J4hN7QJCFYAq7IrH9caxlru6T5qhX41PNFS1S4HqhsGQg== + dependencies: + find-cache-dir "^3.0.0" + fs-extra "8.1.0" + resolve "1.12.0" + rollup-pluginutils "2.8.1" + tslib "1.10.0" + +rollup-pluginutils@2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97" + integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg== + dependencies: + estree-walker "^0.6.1" + +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.27.8: + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" + integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== + dependencies: + tslib "^1.9.0" + +sade@^1.4.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.3.tgz#a217ccc4fb4abb2d271648bf48f6628b2636fa1b" + integrity sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw== + dependencies: + mri "^1.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +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-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" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +terser@^4.6.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tiny-glob@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" + integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== + dependencies: + globalyzer "^0.1.0" + globrex "^0.1.1" + +tiny-invariant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +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" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" + integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-jest@^24.0.2: + version "24.3.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869" + integrity sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tsdx@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/tsdx/-/tsdx-0.12.3.tgz#688ef9c4ed8f1c5de5da94daf2e3cc02f8134c2c" + integrity sha512-BQ0oj9S5Yti6Esol+29ztiJs0kSUA57LngT0G4VF2lqTDRZcMlByCMyWa7yOih08t1wNUj8ah0ml7WJkf8PIbA== + dependencies: + "@babel/core" "^7.4.4" + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.4.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.7.4" + "@babel/plugin-proposal-optional-chaining" "^7.7.5" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-runtime" "^7.6.0" + "@babel/polyfill" "^7.4.4" + "@babel/preset-env" "^7.4.4" + "@rollup/plugin-commonjs" "^11.0.0" + "@rollup/plugin-json" "^4.0.0" + "@rollup/plugin-node-resolve" "^6.0.0" + "@rollup/plugin-replace" "^2.2.1" + "@types/rimraf" "^2.0.2" + "@types/shelljs" "^0.8.5" + "@typescript-eslint/eslint-plugin" "^2.12.0" + "@typescript-eslint/parser" "^2.12.0" + ansi-escapes "^4.2.1" + asyncro "^3.0.0" + babel-eslint "^10.0.3" + babel-plugin-annotate-pure-calls "^0.4.0" + babel-plugin-dev-expression "^0.2.1" + babel-plugin-macros "^2.6.1" + babel-plugin-transform-async-to-promises "^0.8.14" + babel-plugin-transform-rename-import "^2.3.0" + babel-traverse "^6.26.0" + babylon "^6.18.0" + camelcase "^5.0.0" + chalk "^2.4.2" + chokidar-cli "^1.2.2" + cross-env "6.0.3" + cross-spawn "^6.0.5" + enquirer "^2.3.0" + eslint "^6.1.0" + eslint-config-prettier "^6.0.0" + eslint-config-react-app "^5.0.2" + eslint-plugin-flowtype "^3.13.0" + eslint-plugin-import "^2.18.2" + eslint-plugin-jsx-a11y "^6.2.3" + eslint-plugin-prettier "^3.1.0" + eslint-plugin-react "^7.14.3" + eslint-plugin-react-hooks "^2.2.0" + execa "3.2.0" + fs-extra "^8.0.1" + jest "^24.8.0" + jest-watch-typeahead "^0.4.0" + jpjs "^1.2.1" + lodash.merge "^4.6.2" + mkdirp "^0.5.1" + ora "^3.4.0" + pascal-case "^2.0.1" + prettier "^1.19.1" + progress-estimator "^0.2.2" + rimraf "^3.0.0" + rollup "^1.27.8" + rollup-plugin-babel "^4.3.2" + rollup-plugin-sourcemaps "^0.4.2" + rollup-plugin-terser "^5.1.2" + rollup-plugin-typescript2 "^0.25.3" + sade "^1.4.2" + shelljs "^0.8.3" + tiny-glob "^0.2.6" + ts-jest "^24.0.2" + tslib "^1.9.3" + typescript "^3.7.3" + +tslib@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typescript@^3.7.3: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upper-case-first@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= + dependencies: + upper-case "^1.1.1" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" + integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.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" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^13.1.1, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" diff --git a/packages/pancake-uikit/.storybook/main.js b/packages/pancake-uikit/.storybook/main.js new file mode 100644 index 0000000..373272e --- /dev/null +++ b/packages/pancake-uikit/.storybook/main.js @@ -0,0 +1,14 @@ +module.exports = { + stories: ["../src/**/*.stories.mdx", "../src/**/*.stories.@(js|jsx|ts|tsx)"], + addons: [ + { + name: "@storybook/addon-essentials", + options: { + backgrounds: false, + }, + }, + "@storybook/addon-links", + "@storybook/addon-a11y", + "themeprovider-storybook/register", + ], +}; diff --git a/packages/pancake-uikit/.storybook/preview-head.html b/packages/pancake-uikit/.storybook/preview-head.html new file mode 100644 index 0000000..7d3cf37 --- /dev/null +++ b/packages/pancake-uikit/.storybook/preview-head.html @@ -0,0 +1 @@ + diff --git a/packages/pancake-uikit/.storybook/preview.js b/packages/pancake-uikit/.storybook/preview.js new file mode 100644 index 0000000..83185f4 --- /dev/null +++ b/packages/pancake-uikit/.storybook/preview.js @@ -0,0 +1,32 @@ +import React from "react"; +import { withThemesProvider } from "themeprovider-storybook"; +import light from "../src/theme/light"; +import dark from "../src/theme/dark"; +import ResetCSS from "../src/ResetCSS"; +import { ModalProvider } from "../src/widgets/Modal"; + +const globalDecorator = (StoryFn) => ( + + + + +); + +export const parameters = { + actions: { argTypesRegex: "^on[A-Z].*" }, +}; + +const themes = [ + { + name: "Light", + backgroundColor: light.colors.background, + ...light, + }, + { + name: "Dark", + backgroundColor: dark.colors.background, + ...dark, + }, +]; + +export const decorators = [globalDecorator, withThemesProvider(themes)]; diff --git a/packages/pancake-uikit/CHANGELOG.md b/packages/pancake-uikit/CHANGELOG.md new file mode 100644 index 0000000..e8af9d8 --- /dev/null +++ b/packages/pancake-uikit/CHANGELOG.md @@ -0,0 +1,664 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.40.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.40.1...@pancakeswap/uikit@0.40.2) (2021-07-09) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +## [0.40.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.40.0...@pancakeswap/uikit@0.40.1) (2021-07-09) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +# [0.40.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.39.4...@pancakeswap/uikit@0.40.0) (2021-07-01) + + +### Features + +* Reactive modals ([#183](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/183)) ([7644124](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/7644124b0205379019eba9aebcab30d163144fae)) + + + + + +## [0.39.4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.39.3...@pancakeswap/uikit@0.39.4) (2021-06-30) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +## [0.39.3](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.39.2...@pancakeswap/uikit@0.39.3) (2021-06-21) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +## [0.39.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.39.1...@pancakeswap/uikit@0.39.2) (2021-06-18) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +## [0.39.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.39.0...@pancakeswap/uikit@0.39.1) (2021-06-17) + + +### Bug Fixes + +* (userblock) Check Props properties seperately to not cause rerender each time ([#151](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/151)) ([e6f90d7](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/e6f90d7b41a1b3a1d373560dd29e06f10c324639)) + + + + + +# [0.39.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.38.0...@pancakeswap/uikit@0.39.0) (2021-06-14) + + +### Features + +* Menu variant without Connect button ([#155](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/155)) ([84b6f68](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/84b6f683693b426428c5445fc6891608e3943399)) + + + + + +# [0.38.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.37.1...@pancakeswap/uikit@0.38.0) (2021-06-11) + + +### Bug Fixes + +* (userblock) Rerender userblock when one of the props changes ([#148](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/148)) ([ba5e3ab](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ba5e3ab25d558830a1af49e82943b53c5a5ab344)) + + +### Features + +* (connect) Change how to connect link with more accurate one ([#152](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/152)) ([bfbe506](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/bfbe506e63ef7a243d7425d07fb59c9da9d5a06b)) + + + + + +## [0.37.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.37.0...@pancakeswap/uikit@0.37.1) (2021-06-09) + + +### Bug Fixes + +* (Menu) Footer is not visible completely when navigation bar is visible ([#138](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/138)) ([fa6fc66](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/fa6fc669091398de8c3cee156e3724006023a4a2)) +* Message component ([#150](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/150)) ([90387d4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/90387d4cc5758763476d1d20c0a9b8d63588c689)) + + + + + +# [0.37.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.36.1...@pancakeswap/uikit@0.37.0) (2021-06-08) + + +### Features + +* (BalanceInput) Add decimal check support ([#142](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/142)) ([763e13f](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/763e13f836ac2cbb8a3b1132d98854e07a492ced)) + + + + + +## [0.36.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.36.0...@pancakeswap/uikit@0.36.1) (2021-06-03) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +# [0.36.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.35.0...@pancakeswap/uikit@0.36.0) (2021-05-31) + + +### Features + +* Add a grid primitive ([#122](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/122)) ([15e8aad](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/15e8aad6bd87ed204a7ffcd14d434a009a0051ef)) + + + + + +# [0.35.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.34.0...@pancakeswap/uikit@0.35.0) (2021-05-27) + + +### Features + +* Add text ellipsis ([#121](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/121)) ([17d1bfa](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/17d1bfadef5b8c78a2f7f8400e3942e5bb6a419a)) + + + + + +# [0.34.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.33.2...@pancakeswap/uikit@0.34.0) (2021-05-26) + + +### Features + +* Message component ([#120](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/120)) ([0584b7d](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/0584b7d59dd84273c36f81b19077a1eca1fd0bee)) + + + + + +## [0.33.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.33.1...@pancakeswap/uikit@0.33.2) (2021-05-26) + + +### Bug Fixes + +* Add border to button menu ([#117](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/117)) ([ddccc89](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ddccc894873fc029e085df3fddc95adfc2cd4488)) +* Card radius ([#116](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/116)) ([beb881a](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/beb881a8829496a0949f1ae073e88759f131f801)) +* Change help link of connect modal to point connect ([#118](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/118)) ([486e7d3](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/486e7d375b8abaa9a4fabfc079c9872c2925c929)) + + + + + +## [0.33.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.33.0...@pancakeswap/uikit@0.33.1) (2021-05-25) + + +### Bug Fixes + +* **menu:** Improved accessibility ([#109](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/109)) ([eda619d](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/eda619d18866f0cbd1958a16cdd2bede327bf485)) + + + + + +# [0.33.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.32.3...@pancakeswap/uikit@0.33.0) (2021-05-24) + + +### Bug Fixes + +* Bunny slider progress width is too small when is leftmost and too big when is rightmost side ([#103](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/103)) ([298fd8e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/298fd8e9ed68d580183b4ea62710dd85867becfc)) + + +### Features + +* **uikit:** Bubblegum card header variant ([#114](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/114)) ([95ca7a0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/95ca7a071305a840cf8582df2a812b819624c8a7)) +* **uikit:** Proposal icon ([#108](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/108)) ([6ca7995](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6ca7995c3e7acfaf9e7309e86b953a11b25305b8)) +* **uikit:** Vote icon ([#111](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/111)) ([1399814](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/1399814b123ea6232c16aff231965112b63f3fa0)) +* **uikit/tag:** Warning variant ([#110](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/110)) ([f4b9d87](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f4b9d87100c4d493728277d566fdf581d0fca6bd)) + + + + + +## [0.32.3](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.32.2...@pancakeswap/uikit@0.32.3) (2021-05-11) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +## [0.32.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.32.1...@pancakeswap/uikit@0.32.2) (2021-05-11) + + +### Bug Fixes + +* Dropdown colors ([#100](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/100)) ([5d66f62](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/5d66f62db5234bc8d59d836ba65713b79b5ecbbf)) + + + + + +## [0.32.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.32.0...@pancakeswap/uikit@0.32.1) (2021-05-11) + +**Note:** Version bump only for package @pancakeswap/uikit + + + + + +# [0.32.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.31.0...@pancakeswap/uikit@0.32.0) (2021-05-11) + + +### Bug Fixes + +* Chrome blurs logo during scaling animation ([#98](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/98)) ([d3b79bc](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/d3b79bc67dab44e5f7b042f367211e902375b4eb)) + + +### Features + +* **text:** Add styled system { layout } style to Text ([#96](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/96)) ([2b619a1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/2b619a15f4806b1eb92d4cbd08a36984777038d1)) + + + + + +# [0.31.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap/uikit@0.30.0...@pancakeswap/uikit@0.31.0) (2021-05-10) + + +### Features + +* Add new icons ([04cbe90](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/04cbe90e893ef7ed834edc1abd6bdb2e0ff23be2)) + + + + + +# 0.30.0 (2021-05-07) + + +### Bug Fixes + +* :fire: UI updates: button click animation, menu closing fix, men… ([#63](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/63)) ([3d9ba48](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/3d9ba489f642939cfdf54d6939c0fdd7309ed86b)) +* Accordion menu not showing new result when children changed ([#77](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/77)) ([57ff149](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/57ff1493987c0928d7d9f3cf04fc013331f65ab5)) +* Accordion menu stuck at active state ([#57](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/57)) ([f9f5162](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f9f5162f269a27b375943db4b87850c6d8998d3d)) +* Add missing ios support for balance input ([#75](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/75)) ([b648a77](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/b648a77c9b7d7f0f818153688779f2254060ee88)) +* Add z-index 10 to StyledTooltip ([#70](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/70)) ([24941ff](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/24941ff7234e4ad89a4fa0c10c85e2f73e8f72aa)) +* Button loading state ([#30](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/30)) ([7fff56d](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/7fff56d022e06a911525f6163de1e4b5adfab9c7)) +* Copy clipboard on mobile devices ([#2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/2)) ([a64bfd8](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/a64bfd8b998f9ab9ee4daac9b42fa8c7a7eb53a7)) +* Included setupTests.js and updated snap tests ([#50](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/50)) ([b6ab0ee](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/b6ab0ee48e82c8ac88b288e1f790e1c91babb93d)) +* Make BalanceInputt a type="number" ([#74](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/74)) ([e6e6915](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/e6e69151a79c35f9c736b1fb996cebb99ce526fc)) +* Modal border inner color use theme value ([#37](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/37)) ([8e5c9c4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/8e5c9c409b38059f70f6746bc769f4eced009660)) +* Put shadow under the bunny head of slider component ([#25](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/25)) ([92da5b5](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/92da5b5cf746c1a3e10d05c3e5344943a926d943)) +* React dom failure when passing unknown props to child component ([#49](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/49)) ([e3c0272](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/e3c02729bb5c1391d6179a7da6c38bdee6f741bf)) +* Set panel z index to 0 on desktop ([#45](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/45)) ([6cde36e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6cde36ee73b2075de85ef809bed3f959e46de6e2)) +* Slider step label position ([#36](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/36)) ([060b835](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/060b835c68d67d83575f3f8783c2610133798aea)) +* Stepper alignement ([#69](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/69)) ([25df26a](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/25df26a9c9e6668c4e0ccd8171df6f748b41dccf)) +* Stepper connector visibility ([#66](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/66)) ([629be7b](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/629be7b33cc3c7d95499ca67b7a175a29f3f7225)) +* Stepper layout ([#73](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/73)) ([6899561](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6899561397a065e625b9ea2461f5d1a7b328fa3a)) +* Theme config key name ([#71](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/71)) ([d55e4bc](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/d55e4bc76486d9c04df62b7e1359b394a8b89dd8)) +* Tooltip on hover disappear immediately when mouse leaves target element ([#90](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/90)) ([97642eb](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/97642eb9f5b9d58a23107e692219362c83711917)) +* Visible Border and background in ios for bunny slider ([#93](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/93)) ([cbb93f7](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/cbb93f7c7655e072ded9857cdef08f6b36bfa301)) +* **card-ribbon:** Add z-index value to ribbon and spread props to improve flexibility of component ([#88](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/88)) ([2fb19f1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/2fb19f19ffef89a7abc73d1e77734b1a46a99d29)) +* Z index breaking language switcher ([#67](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/67)) ([7179eb1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/7179eb16d1125c517362cf953a04659d8d12dd1d)) +* **modal:** Change modal min width to 320px ([#60](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/60)) ([f09ade9](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f09ade9f149d6793404c86829a728b4f1ba7b93a)) +* **tab-menu:** Fix scroll overflow and tighten padding on sm phones ([#62](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/62)) ([ef0cd3d](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ef0cd3d8896b34968e3610c2a078842dfe7142bf)) +* **uikit:** Accept float values for Slider ([#4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/4)) ([018d7e5](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/018d7e5276e06cf880b2ce8f15f6eaa10e47f236)) + + +### Features + +* **colors:** Add card gradients to colors theme ([#61](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/61)) ([4c7a8ac](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/4c7a8acfb328b80d203ba39eccac92dbf64ca674)) +* **menu:** Add support for top level tags on accordion ([#84](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/84)) ([a15257b](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/a15257ba0460d116bfeaa5ffdad1b9e2c20b4872)) +* **menu-status:** Add optional menu item 'status' property ([#29](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/29)) ([65f7e02](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/65f7e026345d145b61d43864699df3c1aa319446)) +* **modal-bg:** Add overflow hidden prop to Modal container and update storybook ([#82](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/82)) ([2233499](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/22334997bf9dde0dcfb551bc26e78a3a92c8e5db)) +* **progress:** Scale ([#79](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/79)) ([1adc8f2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/1adc8f255af8b0d61ab3f847468de36667385af6)) +* **svgs:** Add latest icons to uiki ([#23](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/23)) ([f2c218e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f2c218e270ed8c351184fedf8ef5d7edd9439176)) +* **uikit:** Dropdown color ([#52](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/52)) ([52aae47](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/52aae470bc0067f5ac130df3bdb562c2911cb5cc)) +* **uikit:** Icons ([#40](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/40)) ([6aab674](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6aab674e7f304439cc1f2fe3754aa8f697cc3efd)) +* **uikit:** Icons ([#41](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/41)) ([ff80fbe](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ff80fbe940e0afd54ecb2be8a08a241109dde185)) +* **uikit:** Prediction icons ([#87](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/87)) ([25b03ce](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/25b03ce2eb2bab14fc48cd8d8b5de212e12e3ee4)) +* Add card header variants ([#34](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/34)) ([079e3f2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/079e3f2cf5536aec5bb402af534c2a05723a3cb3)) +* Add expandable buttons ([#35](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/35)) ([0790f3e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/0790f3ed241acbd0236c8c134579efaa8a5c457b)) +* Add left position for card ribbon ([#68](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/68)) ([0edaf8e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/0edaf8e7a1dfa76be1fa858d3e534471a533b512)) +* Add minWidth and headerBackground props to Modal ([#26](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/26)) ([ba5d231](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ba5d231ce8c9d9f39b507befa7dbbf731bac0b26)) +* Add Tune icon ([#54](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/54)) ([54702ac](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/54702ac31f6ff7ea0eeb7483363841eb0a2262d6)) +* Add VisibilityOn and VisibilityOff icons ([#81](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/81)) ([6635681](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6635681402de7c43fa429808a46b733fb415ac5f)) +* Refresh icon ([#27](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/27)) ([60d9b34](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/60d9b34fbbd871d678c1836ff7ab924a4b301193)) +* Stepper ([#42](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/42)) ([8b1b72e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/8b1b72e00bcf012df258becd1048770af2498221)) + + + + + +## [0.29.4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.29.3...@pancakeswap-libs/uikit@0.29.4) (2021-05-06) + + +### Bug Fixes + +* Copy clipboard on mobile devices ([#2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/2)) ([a64bfd8](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/a64bfd8b998f9ab9ee4daac9b42fa8c7a7eb53a7)) + + + + + +## [0.29.3](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.29.2...@pancakeswap-libs/uikit@0.29.3) (2021-05-03) + +**Note:** Version bump only for package @pancakeswap-libs/uikit + + + + + +## [0.29.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.29.1...@pancakeswap-libs/uikit@0.29.2) (2021-04-30) + + +### Bug Fixes + +* Tooltip on hover disappear immediately when mouse leaves target element ([#90](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/90)) ([97642eb](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/97642eb9f5b9d58a23107e692219362c83711917)) + + + + + +## [0.29.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.29.0...@pancakeswap-libs/uikit@0.29.1) (2021-04-29) + + +### Bug Fixes + +* **card-ribbon:** Add z-index value to ribbon and spread props to improve flexibility of component ([#88](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/88)) ([2fb19f1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/2fb19f19ffef89a7abc73d1e77734b1a46a99d29)) + + + + + +# [0.29.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.28.1...@pancakeswap-libs/uikit@0.29.0) (2021-04-28) + + +### Features + +* **uikit:** Prediction icons ([#87](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/87)) ([25b03ce](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/25b03ce2eb2bab14fc48cd8d8b5de212e12e3ee4)) + + + + + +## [0.28.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.28.0...@pancakeswap-libs/uikit@0.28.1) (2021-04-27) + +**Note:** Version bump only for package @pancakeswap-libs/uikit + + + + + +# [0.28.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.27.1...@pancakeswap-libs/uikit@0.28.0) (2021-04-23) + + +### Bug Fixes + +* Accordion menu not showing new result when children changed ([#77](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/77)) ([57ff149](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/57ff1493987c0928d7d9f3cf04fc013331f65ab5)) + + +### Features + +* **menu:** Add support for top level tags on accordion ([#84](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/84)) ([a15257b](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/a15257ba0460d116bfeaa5ffdad1b9e2c20b4872)) + + + + + +## [0.27.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.27.0...@pancakeswap-libs/uikit@0.27.1) (2021-04-22) + +**Note:** Version bump only for package @pancakeswap-libs/uikit + + + + + +# [0.27.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.26.0...@pancakeswap-libs/uikit@0.27.0) (2021-04-22) + + +### Features + +* **modal-bg:** Add overflow hidden prop to Modal container and update storybook ([#82](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/82)) ([2233499](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/22334997bf9dde0dcfb551bc26e78a3a92c8e5db)) +* Add VisibilityOn and VisibilityOff icons ([#81](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/81)) ([6635681](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6635681402de7c43fa429808a46b733fb415ac5f)) + + + + + +# [0.26.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.25.3...@pancakeswap-libs/uikit@0.26.0) (2021-04-20) + + +### Features + +* **progress:** Scale ([#79](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/79)) ([1adc8f2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/1adc8f255af8b0d61ab3f847468de36667385af6)) + + + + + +## [0.25.3](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.25.2...@pancakeswap-libs/uikit@0.25.3) (2021-04-15) + + +### Bug Fixes + +* Make BalanceInputt a type="number" ([#74](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/74)) ([e6e6915](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/e6e69151a79c35f9c736b1fb996cebb99ce526fc)) + + + + + +## [0.25.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.25.1...@pancakeswap-libs/uikit@0.25.2) (2021-04-15) + + +### Bug Fixes + +* Stepper layout ([#73](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/73)) ([6899561](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6899561397a065e625b9ea2461f5d1a7b328fa3a)) + + + + + +## [0.25.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.25.0...@pancakeswap-libs/uikit@0.25.1) (2021-04-15) + +**Note:** Version bump only for package @pancakeswap-libs/uikit + + + + + +# [0.25.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.24.1...@pancakeswap-libs/uikit@0.25.0) (2021-04-14) + + +### Bug Fixes + +* Theme config key name ([#71](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/71)) ([d55e4bc](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/d55e4bc76486d9c04df62b7e1359b394a8b89dd8)) + + + + + +## [0.24.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.24.0...@pancakeswap-libs/uikit@0.24.1) (2021-04-14) + + +### Bug Fixes + +* Add z-index 10 to StyledTooltip ([#70](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/70)) ([24941ff](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/24941ff7234e4ad89a4fa0c10c85e2f73e8f72aa)) + + + + + +# [0.24.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.23.2...@pancakeswap-libs/uikit@0.24.0) (2021-04-13) + + +### Bug Fixes + +* :fire: UI updates: button click animation, menu closing fix, men… ([#63](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/63)) ([3d9ba48](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/3d9ba489f642939cfdf54d6939c0fdd7309ed86b)) +* Z index breaking language switcher ([#67](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/67)) ([7179eb1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/7179eb16d1125c517362cf953a04659d8d12dd1d)) + + +### Features + +* **colors:** Add card gradients to colors theme ([#61](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/61)) ([4c7a8ac](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/4c7a8acfb328b80d203ba39eccac92dbf64ca674)) + + + + + +## [0.23.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.23.1...@pancakeswap-libs/uikit@0.23.2) (2021-04-12) + + +### Bug Fixes + +* Stepper alignement ([#69](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/69)) ([25df26a](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/25df26a9c9e6668c4e0ccd8171df6f748b41dccf)) + + + + + +## [0.23.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.23.0...@pancakeswap-libs/uikit@0.23.1) (2021-04-12) + +**Note:** Version bump only for package @pancakeswap-libs/uikit + + + + + +# [0.23.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.22.2...@pancakeswap-libs/uikit@0.23.0) (2021-04-12) + + +### Bug Fixes + +* **tab-menu:** Fix scroll overflow and tighten padding on sm phones ([#62](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/62)) ([ef0cd3d](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ef0cd3d8896b34968e3610c2a078842dfe7142bf)) + + +### Features + +* Add left position for card ribbon ([#68](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/68)) ([0edaf8e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/0edaf8e7a1dfa76be1fa858d3e534471a533b512)) + + + + + +## [0.22.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.22.1...@pancakeswap-libs/uikit@0.22.2) (2021-04-11) + + +### Bug Fixes + +* Stepper connector visibility ([#66](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/66)) ([629be7b](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/629be7b33cc3c7d95499ca67b7a175a29f3f7225)) + + + + + +## [0.22.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.22.0...@pancakeswap-libs/uikit@0.22.1) (2021-04-10) + + +### Bug Fixes + +* **modal:** Change modal min width to 320px ([#60](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/60)) ([f09ade9](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f09ade9f149d6793404c86829a728b4f1ba7b93a)) +* Accordion menu stuck at active state ([#57](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/57)) ([f9f5162](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f9f5162f269a27b375943db4b87850c6d8998d3d)) +* React dom failure when passing unknown props to child component ([#49](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/49)) ([e3c0272](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/e3c02729bb5c1391d6179a7da6c38bdee6f741bf)) + + + + + +# [0.22.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.21.0...@pancakeswap-libs/uikit@0.22.0) (2021-04-07) + + +### Features + +* Add Tune icon ([#54](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/54)) ([54702ac](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/54702ac31f6ff7ea0eeb7483363841eb0a2262d6)) + + + + + +# [0.21.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.20.1...@pancakeswap-libs/uikit@0.21.0) (2021-04-06) + + +### Bug Fixes + +* Included setupTests.js and updated snap tests ([#50](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/50)) ([b6ab0ee](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/b6ab0ee48e82c8ac88b288e1f790e1c91babb93d)) + + +### Features + +* **uikit:** Dropdown color ([#52](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/52)) ([52aae47](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/52aae470bc0067f5ac130df3bdb562c2911cb5cc)) + + + + + +## [0.20.1](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.20.0...@pancakeswap-libs/uikit@0.20.1) (2021-04-02) + +**Note:** Version bump only for package @pancakeswap-libs/uikit + + + + + +# [0.20.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.19.0...@pancakeswap-libs/uikit@0.20.0) (2021-04-02) + + +### Bug Fixes + +* Set panel z index to 0 on desktop ([#45](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/45)) ([6cde36e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6cde36ee73b2075de85ef809bed3f959e46de6e2)) + + +### Features + +* Stepper ([#42](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/42)) ([8b1b72e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/8b1b72e00bcf012df258becd1048770af2498221)) + + + + + +# [0.19.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.18.0...@pancakeswap-libs/uikit@0.19.0) (2021-03-31) + + +### Bug Fixes + +* Modal border inner color use theme value ([#37](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/37)) ([8e5c9c4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/8e5c9c409b38059f70f6746bc769f4eced009660)) + + +### Features + +* **uikit:** Icons ([#40](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/40)) ([6aab674](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/6aab674e7f304439cc1f2fe3754aa8f697cc3efd)) +* **uikit:** Icons ([#41](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/41)) ([ff80fbe](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ff80fbe940e0afd54ecb2be8a08a241109dde185)) + + + + + +# [0.18.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.17.0...@pancakeswap-libs/uikit@0.18.0) (2021-03-30) + + +### Bug Fixes + +* Button loading state ([#30](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/30)) ([7fff56d](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/7fff56d022e06a911525f6163de1e4b5adfab9c7)) +* Put shadow under the bunny head of slider component ([#25](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/25)) ([92da5b5](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/92da5b5cf746c1a3e10d05c3e5344943a926d943)) +* Slider step label position ([#36](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/36)) ([060b835](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/060b835c68d67d83575f3f8783c2610133798aea)) + + +### Features + +* Add card header variants ([#34](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/34)) ([079e3f2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/079e3f2cf5536aec5bb402af534c2a05723a3cb3)) +* Add expandable buttons ([#35](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/35)) ([0790f3e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/0790f3ed241acbd0236c8c134579efaa8a5c457b)) +* **menu-status:** Add optional menu item 'status' property ([#29](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/29)) ([65f7e02](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/65f7e026345d145b61d43864699df3c1aa319446)) + + + + + +# [0.17.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.16.0...@pancakeswap-libs/uikit@0.17.0) (2021-03-24) + + +### Features + +* Add minWidth and headerBackground props to Modal ([#26](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/26)) ([ba5d231](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/ba5d231ce8c9d9f39b507befa7dbbf731bac0b26)) +* Refresh icon ([#27](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/27)) ([60d9b34](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/60d9b34fbbd871d678c1836ff7ab924a4b301193)) + + + + + +# [0.16.0](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.15.2...@pancakeswap-libs/uikit@0.16.0) (2021-03-22) + + +### Features + +* **svgs:** Add latest icons to uiki ([#23](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/23)) ([f2c218e](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/f2c218e270ed8c351184fedf8ef5d7edd9439176)) + + + + + +## [0.15.2](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/compare/@pancakeswap-libs/uikit@0.15.2...@pancakeswap-libs/uikit@0.15.2) (2021-03-19) + + +### Bug Fixes + +* **uikit:** Accept float values for Slider ([#4](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/issues/4)) ([018d7e5](https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit/commit/018d7e5276e06cf880b2ce8f15f6eaa10e47f236)) diff --git a/packages/pancake-uikit/README.md b/packages/pancake-uikit/README.md new file mode 100644 index 0000000..fb450dc --- /dev/null +++ b/packages/pancake-uikit/README.md @@ -0,0 +1,40 @@ +# 🥞 Pancake UIkit + +[![Version](https://img.shields.io/npm/v/@pancakeswap-libs/uikit)](https://www.npmjs.com/package/@pancakeswap-libs/uikit) [![Size](https://img.shields.io/bundlephobia/min/@pancakeswap-libs/uikit)](https://www.npmjs.com/package/@pancakeswap-libs/uikit) + +Pancake UIkit is a set of React components and hooks used to build pages on Pancake's apps. It also contains a theme file for dark and light mode. + +## Install + +`yarn add @pancakeswap-libs/uikit` + +## Setup + +### Theme + +Before using Pancake UIkit, you need to provide the theme file to styled-component. + +``` +import { ThemeProvider } from 'styled-components' +import { light, dark } from '@pancakeswap-libs/uikit' +... +... +``` + +### Reset + +A reset CSS is available as a global styled component. + +``` +import { ResetCSS } from '@pancakeswap-libs/uikit' +... + +``` + +### Types + +This project is built with Typescript and export all the relevant types. + +## How to use the UIkit + +If you want to use components from the UIkit, check the [Storybook documentation](https://pancakeswap.github.io/pancake-uikit/) diff --git a/packages/pancake-uikit/babel.config.js b/packages/pancake-uikit/babel.config.js new file mode 100644 index 0000000..d93a7a1 --- /dev/null +++ b/packages/pancake-uikit/babel.config.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ["@babel/preset-env"], + plugins: ["styled-components"], +}; diff --git a/packages/pancake-uikit/jest.config.js b/packages/pancake-uikit/jest.config.js new file mode 100644 index 0000000..d3842cb --- /dev/null +++ b/packages/pancake-uikit/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + preset: "ts-jest", + testPathIgnorePatterns: ["/node_modules/", "/dist/", "/.storybook/"], + setupFilesAfterEnv: ["/src/setupTests.js"], + transform: { + '\\.(js|jsx)?$': 'babel-jest', + }, +}; diff --git a/packages/pancake-uikit/package.json b/packages/pancake-uikit/package.json new file mode 100644 index 0000000..87208b6 --- /dev/null +++ b/packages/pancake-uikit/package.json @@ -0,0 +1,57 @@ +{ + "name": "@pancakeswap/uikit", + "version": "0.40.2", + "description": "Set of UI components for pancake projects", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "repository": "https://github.com/pancakeswap/pancake-toolkit/tree/master/packages/pancake-uikit", + "license": "MIT", + "scripts": { + "start": "yarn storybook", + "build": "rm -rf ./dist && rollup -c && tsc -d --emitDeclarationOnly --declarationDir dist", + "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", + "format:check": "prettier --check --loglevel error 'src/**/*.{js,jsx,ts,tsx}'", + "format:write": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'", + "storybook": "start-storybook -p 6006", + "storybook:build": "build-storybook", + "test": "jest", + "prepublishOnly": "yarn build" + }, + "jest": { + "setupFilesAfterEnv": [ + "/src/setupTests.js" + ] + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.11.6", + "@testing-library/react": "^11.2.5", + "@types/react-dom": "^17.0.5", + "jest-styled-components": "^7.0.3", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "react-router-dom": "^5.2.0", + "styled-components": "^5.2.0" + }, + "peerDependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-router-dom": "^5.2.0", + "styled-components": "^5.2.3" + }, + "dependencies": { + "@popperjs/core": "^2.9.2", + "@types/lodash": "^4.14.168", + "@types/styled-system": "^5.1.10", + "lodash": "^4.17.20", + "react-popper": "^2.2.5", + "react-transition-group": "^4.4.1", + "styled-system": "^5.1.5" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/pancake-uikit/rollup.config.js b/packages/pancake-uikit/rollup.config.js new file mode 100644 index 0000000..2d8e7c2 --- /dev/null +++ b/packages/pancake-uikit/rollup.config.js @@ -0,0 +1,12 @@ +import typescript from "@rollup/plugin-typescript"; +import url from "@rollup/plugin-url"; +import pkg from "./package.json"; + +export default { + input: "src/index.ts", + output: [ + { file: pkg.main, format: "cjs" }, + { file: pkg.module, format: "es" }, + ], + plugins: [url(), typescript()], +}; diff --git a/packages/pancake-uikit/src/ResetCSS.tsx b/packages/pancake-uikit/src/ResetCSS.tsx new file mode 100644 index 0000000..34b736f --- /dev/null +++ b/packages/pancake-uikit/src/ResetCSS.tsx @@ -0,0 +1,117 @@ +import { createGlobalStyle } from "styled-components"; + +const ResetCSS = createGlobalStyle` + /* prettier-ignore */ + html, body, div, span, applet, object, iframe, + h1, h2, h3, h4, h5, h6, p, blockquote, pre, + a, abbr, acronym, address, big, cite, code, + del, dfn, em, img, ins, kbd, q, s, samp, + small, strike, strong, sub, sup, tt, var, + b, u, i, center, + dl, dt, dd, ol, ul, li, + fieldset, form, label, legend, + table, caption, tbody, tfoot, thead, tr, th, td, + article, aside, canvas, details, embed, + figure, figcaption, footer, header, hgroup, + menu, nav, output, ruby, section, summary, + time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + vertical-align: baseline; + } + /* HTML5 display-role reset for older browsers */ + /* prettier-ignore */ + article, aside, details, figcaption, figure, + footer, header, hgroup, menu, nav, section { + display: block; + } + body { + line-height: 1; + font-size: 16px; + } + ol, + ul { + list-style: disc; + list-style-position: inside; + } + blockquote, + q { + quotes: none; + } + blockquote:before, + blockquote:after, + q:before, + q:after { + content: ""; + content: none; + } + table { + border-collapse: collapse; + border-spacing: 0; + } + a { + color: inherit; + text-decoration: none; + } + [role="button"] { + cursor: pointer; + } + *, + *::before, + *::after { + box-sizing: border-box; + } + * { + font-family: 'Kanit', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + /* Number */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + input[type=number] { + -moz-appearance: textfield; + } + + /* Scrollbar */ + ::-webkit-scrollbar { + width: 8px; + } + ::-webkit-scrollbar-thumb { + background: ${({ theme }) => theme.colors.textSubtle}; + border-radius: 8px; + } + ::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px ${({ theme }) => theme.colors.input}; + border-radius: 10px; + } + + /* Slider */ + input[type=range] { + -webkit-appearance: none; /* Hides the slider so that custom slider can be made */ + width: 100%; /* Specific width is required for Firefox. */ + background: transparent; /* Otherwise white in Chrome */ + } + input[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + } + input[type=range]:focus { + outline: none; /* Removes the blue border. You should probably do some kind of focus styling for accessibility reasons though. */ + } + input[type=range]::-ms-track { + width: 100%; + cursor: pointer; + /* Hides the slider so custom styles can be added */ + background: transparent; + border-color: transparent; + color: transparent; + } +`; + +export default ResetCSS; diff --git a/packages/pancake-uikit/src/__tests__/components/alert.test.tsx b/packages/pancake-uikit/src/__tests__/components/alert.test.tsx new file mode 100644 index 0000000..437d3a2 --- /dev/null +++ b/packages/pancake-uikit/src/__tests__/components/alert.test.tsx @@ -0,0 +1,102 @@ +import React from "react"; +import { renderWithTheme } from "../../testHelpers"; +import { Alert } from "../../components/Alert"; + +it("renders correctly", () => { + const { asFragment } = renderWithTheme(Description); + + expect(asFragment()).toMatchInlineSnapshot(` + + .c3 { + -webkit-align-self: center; + -ms-flex-item-align: center; + align-self: center; + fill: currentColor; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + } + + .c5 { + color: #280D5F; + font-size: 16px; + font-weight: 600; + line-height: 1.5; + } + + .c6 { + color: #280D5F; + font-size: 16px; + font-weight: 400; + line-height: 1.5; + } + + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + } + + .c2 { + background-color: #7645D9; + border-radius: 16px 0 0 16px; + color: #FFFFFF; + padding: 12px; + } + + .c4 { + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-bottom: 12px; + padding-left: 12px; + padding-right: 12px; + padding-top: 12px; + } + + .c1 { + position: relative; + background-color: #FFFFFF; + border-radius: 16px; + box-shadow: 0px 20px 36px -8px rgba(14,14,44,0.1),0px 1px 1px rgba(0,0,0,0.05); + } + +

+
+ + + +
+
+
+ Alert title +
+

+ Description +

+
+
+ + `); +}); diff --git a/packages/pancake-uikit/src/__tests__/components/balanceinput.test.tsx b/packages/pancake-uikit/src/__tests__/components/balanceinput.test.tsx new file mode 100644 index 0000000..85b29a3 --- /dev/null +++ b/packages/pancake-uikit/src/__tests__/components/balanceinput.test.tsx @@ -0,0 +1,120 @@ +import React from "react"; +import { renderWithTheme } from "../../testHelpers"; +import BalanceInput from "../../components/BalanceInput/BalanceInput"; + +const handleChange = jest.fn(); + +it("renders correctly", () => { + const { asFragment } = renderWithTheme(); + expect(asFragment()).toMatchInlineSnapshot(` + + .c3 { + color: #7A6EAA; + font-size: 12px; + font-weight: 400; + line-height: 1.5; + font-size: 12px; + text-align: right; + } + + .c1 { + background-color: #eeeaf4; + border: 0; + border-radius: 16px; + box-shadow: inset 0px 2px 2px -1px rgba(74,74,104,0.1); + color: #280D5F; + display: block; + font-size: 16px; + height: 40px; + outline: 0; + padding: 0 16px; + width: 100%; + } + + .c1::-webkit-input-placeholder { + color: #7A6EAA; + } + + .c1::-moz-placeholder { + color: #7A6EAA; + } + + .c1:-ms-input-placeholder { + color: #7A6EAA; + } + + .c1::placeholder { + color: #7A6EAA; + } + + .c1:disabled { + background-color: #E9EAEB; + box-shadow: none; + color: #BDC2C4; + cursor: not-allowed; + } + + .c1:focus:not(:disabled) { + box-shadow: 0px 0px 0px 1px #7645D9,0px 0px 0px 4px rgba(118,69,217,0.6); + } + + .c0 { + background-color: #eeeaf4; + border: 1px solid #d7caec; + border-radius: 16px; + box-shadow: inset 0px 2px 2px -1px rgba(74,74,104,0.1); + padding: 8px 16px; + } + + .c2 { + background: transparent; + border-radius: 0; + box-shadow: none; + padding-left: 0; + padding-right: 0; + text-align: right; + } + + .c2::-webkit-input-placeholder { + color: #7A6EAA; + } + + .c2::-moz-placeholder { + color: #7A6EAA; + } + + .c2:-ms-input-placeholder { + color: #7A6EAA; + } + + .c2::placeholder { + color: #7A6EAA; + } + + .c2:focus:not(:disabled) { + box-shadow: none; + } + +
+ +
+ 15 USD +
+
+
+ `); +}); diff --git a/packages/pancake-uikit/src/__tests__/components/breadcrumbs.test.tsx b/packages/pancake-uikit/src/__tests__/components/breadcrumbs.test.tsx new file mode 100644 index 0000000..48d12b1 --- /dev/null +++ b/packages/pancake-uikit/src/__tests__/components/breadcrumbs.test.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import { renderWithTheme } from "../../testHelpers"; +import Breadcrumbs from "../../components/Breadcrumbs/Breadcrumbs"; + +it("renders correctly", () => { + const { asFragment } = renderWithTheme(Link); + expect(asFragment()).toMatchInlineSnapshot(` + + .c0 { + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + list-style-type: none; + } + +